1、SDK无埋点技术介绍技术创新,变革未来SDK无埋点技术简介无埋点技术简介SDK无埋点技术如何实现无埋点技术如何实现实践中遇到的坑和解决方实践中遇到的坑和解决方法法目目 录录01 SDK无埋点技术简介无埋点技术简介无埋点解决什么问题?无埋点解决什么问题?解决代码埋点本身成本过高,可视化操作,更容易 上手;把核心代码和配置进行分离;不懂代码的人也可以通过后台配置锚点并实时下发 到客户端生效;避免代码写死,需要更新版本才能生效的笨拙方式。 变得更为主动灵活高效;什么是埋点?什么是埋点?第三阶段数据建模统计数据建模统计第四阶段数据展示数据展示第二阶段数据存储数据存储数据采集数据采集第一阶段所谓埋点就是
2、通过在代码的关键部位 植入统计代码,追踪用户的行为埋点长啥样?埋点长啥样?一段埋点代码埋点过程中的痛埋点过程中的痛点点需要开发写代码、熟悉api、容易错埋漏埋;修改需要重新编译 打包,更新代价大扩展性灵活性差,增 加功能就得再次埋点无埋点又是什么噱无埋点又是什么噱头头可视化可视化可视化埋点操作,运营 和实施人员就可以完成配置即代码配置即代码灵活、可扩展埋点功能由配置控制Codeless 开发人员只需要集成 几行初始化代码即可热更新热更新修改、添加方便,无需重新 编译打包,效率高,成本低无埋点长啥样?无埋点长啥样?无埋点长啥样?无埋点长啥样?埋点埋点vs无埋点无埋点u 无埋点解决了埋点的部分痛点
3、u 无埋点是一种自然的进化,方便客户 集成,操作可视化u 无埋点也有自己的一些问题,例如 无法传递一些复杂的信息,只能捕获 一些简单的点击和文字变化事件行为u 两者不是对立的,相辅相成,各有各 的使用场景02 SDK无埋点技术如何实无埋点技术如何实现现整体架构图整体架构图Web配置页面SDK通信服务器配置服务器探头服务KafkaLoader/Format erMongoDBHDFS/HiveHbase传输协议传输协议基于基于TCP层的长连接层的长连接因为SDK和配置后台都需要和通信服务器进行双向交互。这种情况用http协 议就无法满足双向交互和实时反馈的需求;而且http轮询也耗费性能;所以
4、最终SDK 跟服务端使用socket 建立长连接, 配置Web 端跟服务器使用 websocket建立长连接传输的数据使用传输的数据使用json格式,数据量小而且便于解析格式,数据量小而且便于解析传输的过程中跟服务端约定秘钥,使用对称加密算法对内容进行加密, 同时也采用压缩算法尽可能减小传输的数据量如何触发无埋点配如何触发无埋点配置置通过手势摇一摇触发通过手势摇一摇触发发通过手势摇一摇来触发,结合震动给用户反馈, 这种不需要界面交互,刚好可以满足需求最终我们选择的也是这种方式SDK是内嵌在App内,没有任何和用户交互的界面通过第三方程序触发?通过第三方程序触发?例如通过手机扫描一个二维码,然后
5、二维码里包含 一个特殊的UrlSchemal和参数来触发app内的SDKapp界面如何传输到配置页界面如何传输到配置页面面通过一些远程桌面协议例如通过一些远程桌面协议例如VNC协议来进行传协议来进行传输输?SDK截取页面屏幕,每隔一段时间传递给服务端截取页面屏幕,每隔一段时间传递给服务端VNC协议的优势在于传递速度快,但是协议比较复杂,而且需要在SDK内实现VNC的服务端,不太现实,舍弃这种方案这种方案相对比较简单,易于实现。只需要把截图数据进行base64之后传递给服务端即可,主要是关注截图和传输的优化即可屏幕截图的关键代屏幕截图的关键代码码Android关键代码:iOS关键代码:控件信息获
6、取及控件信息获取及ID生成技生成技术术首先是安卓1获取时机获取时机主要是监控所有activity的生命周期回调,在onResume里触发,主要是实现 了系统的ActivityLifecycleCallbacks接口2获取控件的哪些信息获取控件的哪些信息因为后台配置页面要在截图上绘制每个组件的坐标并框选出来,所以需要获取控件的坐标x,y还有width和height,同时还要获取控件是否可 见以及透明度等有用的信息3如何生成控件的唯一如何生成控件的唯一ID主要是根据一个控件不变的属性组合来生成,例如控件的类名、tag,当前 activity的包名,控件位于整个view tree的路径等信息组合起来
7、然后做一个md5控件信息获取及控件信息获取及ID生成技生成技术术首先是安卓1获取时机获取时机主要是监控所有activity的生命周期回调,在onResume里触发,主要是实现 了系统的ActivityLifecycleCallbacks接口控件信息获取及控件信息获取及ID生成技生成技术术首先是安卓2获取控件的哪些信息获取控件的哪些信息因为后台配置页面要在截图上绘制每个组件的坐标并框选出来,所以需要获取控件的坐标x,y还有width 和height,同时还要获取控件是否可见 以及透明度等有用的信息控件信息获取及控件信息获取及ID生成技生成技术术首先是安卓主要是根据一个控件不 变的属性组合来生成,
8、 例如控件的类名、tag, 当前activity的包名,控 件位于整个view tree的 路径等信息组合起来然 后做一个md53如何生成控如何生成控 件的唯一件的唯一ID控件信息获取及控件信息获取及ID生成技生成技术术然后是 ios1获取时机获取时机主要是hook所有的viewcontroller的viewDidAppear函数,利用ios的运行时 使用method swizzling技术拦截系统函数,替换为自己的函数实现2获取控件的哪些信息获取控件的哪些信息这块和android的差不多,主要是控件的坐标x,y还有width和height, 同时还要获取控件是否可见以及透明度等有用的信息3如
9、何生成控件的唯一如何生成控件的唯一ID主要是根据一个控件不变的属性组合来生成,例如控件的类名, 当前viewcontroller的类名,控件的点击事件名selctor,控件位于整个view tree的路径等信息组合起来然后做一个md5控件信息获取及控件信息获取及ID生成技生成技术术然后是 ios1获取时机获取时机主要是hook所有的viewcontroller的viewDidAppear函数,利用ios的运行时 使用method swizzling技术拦截系统函数,替换为自己的函数实现2获取控件的哪些信息获取控件的哪些信息这块和android的差不多,主要是控件的坐标x,y还有width和he
10、ight, 同时还要获取控件是否可见以及透明度等有用的信息控件信息获取及控件信息获取及ID生成技生成技术术然后是 ios3如何生成控件的唯一如何生成控件的唯一ID主要是根据一个控件不变的属性组合来生成,例如控件的类名, 当前viewcontroller的类名,控件的点击事件名selctor,控件位于整个view tree的路径等信息组合起来然后做一个md5控件信息获取及控件信息获取及ID生成技生成技术术然后是 ios动态绑定控件事件动态绑定控件事件 (Android)主要是可利用Android中View 的sendAccessibilityEvent(int eventType)方法来实现事件
11、触发的;只要设置了代理就可以对具 备Accessibility能力的view 实现点击事件的响应。 View.AccessibilityDelegate具体说明请参考Android 的开发者文档。动态绑定控件事件动态绑定控件事件(ios)ios主要遍历当前界面所有的控件,并根据配置信息筛选需要绑定的控件,然后通过methodswizzling 的技术替换控件的点击事件来达到绑定控件的事件;03 实践中遇到的坑和解决方法实践中遇到的坑和解决方法长连接断开的问长连接断开的问题题解决方法:这是使用长连接经常遇到的一 个问题,处理方法就是要有一 个简单的心跳机制,来保活链 路,防止因长时间没有数据流
12、动被防火墙或者网关杀掉问题:链路如果长时间没有数据通信就会断开并且服务端和客户端也没有及时的回调通知?摇一摇遇到的问摇一摇遇到的问题题问题:摇一摇触发成功如何给用户反馈?以及用 户有时候运动中的摇一摇误触发怎么解决?解决方法:摇一摇触发成功连上服务器后可以用震 动的形式给用户反馈,以反馈给用户,用户就不用 一直摇来摇去;防止误触发主要是通过服务端返回一个消息通知成功后才给用户以震动的提示,然后开始传输截屏和 控件的信息到服务器;这样就不会走着走着手机突 然就震动了;问题:ios如何能在所有界面都能监听的摇一摇事件解决方法:这个主要是利用ios的运行时的一些技术,拦截到系统的 rootViewC
13、ontroller,然后动态的给注入一个摇一摇的监听方法,这 样就能在所有的界面监听摇一摇的事件了。界面传输效率性能的优界面传输效率性能的优化化截图使用jpeg格式进行最大的压缩比,然后图片质量选择0.6 这样既不影响清晰度,也能够最大限度的减少数据传输量, 进而提高传输的效率屏幕截图的传输频率,默认是每隔5秒传输一次,但这样的话 手机操作时无法实时传送到服务端以及web管理段,这给用 户一种延时的感觉,这块我们主要是针对界面切换和列表以 及滚动这些事件做了主动触发,这样用户就能感觉到管理页 面跟手机几乎是同步的有些时候屏幕界面是没有变化,所以这时候发送截图没有必要, 所以我们队截图做一个md
14、5保存,然后下次发送屏幕截图时先 对比一下两次截图的md5值是否一样,如果一样就不发送截图123控件控件ID重复导致错误和重复发重复导致错误和重复发送送问题:通用的ID生成规则针对某些特殊情况的控件会产生相 同的ID,例如同样类名的button,并且位于相同的父view上,而且程序逻辑控制每次动态add其中一个, 这样他们的view tree上的path也一样;导致生成的ID 重复;进而影响界面绘制和事件统计解决方案:因为SDK能拿到的控件信息有限,所以当这些通用规 则都失效的情况下,只能通过服务端对这些控件进行 特殊的配置,进行定制,例如button里的text可能不 一样,所以可以用这项信息添进去?SDK技术发展趋势技术发展趋势尽量让第三方app集成起来方便,尽量做到让第三方开发者调用最少的代码就能 集成SDK,如果能够做到全自动化集成是最好的;尽量把一些简单和重复的操作可视化,这样可 以把开发者解放出来交给运营人员或者实施人 员来处理业务逻辑;SDK的更新成本还是挺高的,由于移动端开发的一些限制问题,app的动态更新 一直是个难题尤其是ios下,目前只能通过脚本语言实现一些多变模块的动态更 新,SDK也要朝着这个方向尽量做到核心模块稳定,其他模块慢慢的可配置化和 脚本语言化。自动化可视化动态 更新