Android全埋点方案调研

1 行业内全埋点技术方案调研

调研文章链接:

1.1 数据处理流程

  • 数据采集
  • 数据上报
  • 数据存储
  • 数据分析
  • 数据展示

1.2 现状、痛点

主要使用代码埋点的方式进行数据采集,所谓代码埋点指的是在某个事件发生时通过预先写好的代码来发送数据,基于预先编码实现的代码埋点,其优点是:控制精准、采集灵活性强,可以自由的选择什么时候发送什么样的数据;但缺点也同样十分明显,开发、测试成本高,对于客户端而言需要等待发版才能修改线上的埋点。

1.3 业内情况

全埋点,也可称为无埋点或者无痕埋点,即在端上自动采集并上报尽可能多的数据,在计算时筛选出可用的数据。其优点是:很大程度上减少开发、测试的重复劳动,数据可以回溯并且全面;缺点是:采集信息不够灵活,并且数据量大。

可视化埋点,则是通过可视化工具选择需要收集的埋点数据,下发配置给客户端,从而解析配置采集相应埋点的方式。其优点是:很大程度上减少开发、测试的重复劳动,数据量可控,可以在线上动态的进行埋点配置,无需等待App发版;其缺点同样是采集信息不够灵活,并且无法解决数据回溯的问题。

1.4 全埋点

针对页面、控件等元素需要生成其ID,该ID需尽量具备『唯一性』和『稳定性』。『唯一性』非常好理解,因为对于任意元素而言,其ID应该是与其他所有元素都不同的,这样我们才能根据ID唯一标识出那个我们想要的元素,采集上来的数据才是准确的,不重复的。而『稳定性』则是说,元素的ID应尽量不受版本的变动而改变,这样后期关联业务含义的操作才会更加便捷。

1.4.1 页面ID规则

  • 类名(51信用卡方案)
    Activity,ID规则为 ActivityClassName|额外参数
    Fragment,ID规则为 ActivityClassName[FragmentClassName]|额外参数
  • 页面class全路径(58同城)

1.4.2 控件ID规则

  • 页面ID:控件路径(51信用卡、网易、58同城)
    从点击控件开始遍历控件树直至找到根节点确定控件路径
    FrameLayout[0]/LinearLayout[1]/Button[0],优先使用Resource ID作为控件ID,若Resource ID不存在,则降级使用控件路径作为控件ID。

1.4.3 代码插桩方式

  • Javassist + Transform(51信用卡方案)
  • ASM + Transform(58同城、网易云音乐)

1.4.4 埋点方式

  • 利用Gradle插件自动注入埋点代码为主,并辅以手动埋点进行数据定制化补全的技术方案。(58同城)

H5的日志通过JSBridge调用Native,由Native统一向后端发送日志信息。

2 Android全埋点实现方案总览

2.1 AppViewScreen(页面浏览)

注册Application.ActivityLifecycleCallbacks监听,在Activity的生命周期onResume中触发事件

2.2 AppStart、AppEnd(当前应用处于前台还是后台)

注册Application.ActivityLifecycleCallbacks监听

理解前台还是后台:
对于一个应用,打开App的一个页面则在前台,触发AppStart事件,触发当它的页面退出了,如果在30秒之内没有新的页面打开,则认为应用处于后台,触发AppEnd事件

在页面退出的时候(即onPause生命周期函数),启动一个30秒倒计时,如果20秒之内没有新的页面进来(或显示),则触发 AppEnd 事件。如果有新的页面进来,则存储一个标记位来标记已有新的页面进来。这里需要注意的是,如果你的 Activity 之间可能存在跨进程,所以标记位需要实现进程间共享,可以通过 ContentProvider + SharedPreferences 来进行存储,通过ContentObserver 监听新页面进来的标记位改变,从而取消上个页面退出时启动的倒计时。如果30s之内没有新的页面进来,如用户按Home键或返回键退出应用程序、应用程序发生崩溃、应用程序被强杀,则会触发 AppEnd 事件,但应用程序发生崩溃、应用程序被强杀会导致我们无法及时触发 AppEnd 事件,只能在用户下次进行启动时补发。如果用户后面再也不启动应用程序,则会导致 AppEnd 事件丢失。

在页面启动的时候(即 onStart 生命周期函数),我们需要判断一下与上个页面退出的时间间隔是否超过了30s,如果没有超过30s,则直接触发 AppViewScreen 事件。如果已经超过了30s,则需要判断之前是否已经触发了 AppEnd 事件,如果没有触发,则先触发 AppEnd 事件。然后再触发 AppStart 事件和 AppViewScreen 事件。

2.3 AppClick(控件点击)

方案 原理 优缺点
代理View.OnClickListener/View.OnTouchListener 通过反射获取点击View的mOnClickListener/mOnTouchListener对象并用自定义Listener代理 使用反射,效率低,有兼容风险;无法采集游离于Activity之上的控件(如Dialog等)的点击
代理Window.Callback 用自定义的Window.Callback代理系统的 每次点击都需要去遍历RootView,效率低,影响性能;无法采集游离于Activity之上的控件(如Dialog等)的点击
代理View.AccessibilityDelegate 用自定义的View.AccessibilityDelegate代理系统的 使用反射,效率低,有兼容风险;无法采集游离于Activity之上的控件(如Dialog等)的点击;辅助功能需用户手动开启
透明层 在所有Activity的最上层添加透明View重写onTouchEvent拿到View代理mOnClickListener 每次点击都需要去遍历RootView,效率低,影响性能;无法采集游离于Activity之上的控件(如Dialog等)的点击
AspectJ 编译期插入埋点代码 无法织入三方库;兼容性问题;切点依赖编程语言;无法兼容Lambda语法(前两个缺点已经被aspectjx库解决)
ASM 编译期修改字节码插入埋点代码 优点:小而快,操作灵活;缺点:需要对字节码有一定的了解
javassist 编译期修改字节码插入埋点代码 优点:源代码级API调用,不需要了解字节码;缺点:使用到了反射,性能低于ASM
AST 编译期操作AST修改源代码 APT无法扫描其他module;不支持Lambda;com.sun.tools.javac.tree的API理解难度大
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,951评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,606评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,601评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,478评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,565评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,587评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,590评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,337评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,785评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,096评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,273评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,935评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,578评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,199评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,440评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,163评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,133评论 2 352

推荐阅读更多精彩内容

  • 今天周二,考的是数学,成绩还算理想97,错的题是右手左手,错的是简单的题,稍微复杂的题反而对了,这就说明做题的时候...
    文畅妈妈阅读 151评论 0 0
  • 浑浑噩噩地过了一天,吃饭喝水上厕所,这便是周二的一天。 刚搬到新座位上的我还不太适应,黑乎乎的光线特别适合睡觉,大...
    朵好看阅读 105评论 0 0
  • 20190518 5月18日,非常有意义的1天。 一切要从朋友的相聚开始说起。 阿荣、小明和我,是在09年认识的。...
    Simon89阅读 146评论 0 2
  • 炼我愈静阅读 110评论 0 1