先说下自己对于这本的评价哈
感觉这是一本很好用的工具书籍
在全埋点这块写的很全面,有各种方式和实现流程
但是有些时候又有些水字数的嫌疑(同样的东西复制好几遍)
然后写一下读这本书的收获
一 关于全埋点不同方案实现的优缺点
下面是全部使用原生的解决方案
(1)使用代理View.onClickListener实现
实现原理
优点:学习成本低,使用原生的API就可以实现
缺点:因为是使用反射,效率较低,而且随着Android安全性的提高可能将来会产生兼容性问题
使用API版本有要求要求16+
无法支持dialog,popWindow的点击事件
(2)使用代理windowCallBack实现
实现原理
[图片上传中...(image.png-80ebe0-1592314227243-0)]
缺点:在每次点击的时候都需要遍历一次RootView相对效率较低
API限制15+
无法采集dialog和popWindow
(3)代理View.accessibilityDelegate
这其实是对上一种方式的一个优化 不用每次点击都需要遍历rootView
实现原理
缺点:API要求16+
使用反射效率低 ,兼容性不好
无法采集dialog
需要开启辅助功能
(4)添加透明层
原理:。。。
缺点:和第二种一样
下面说以下使用Aop的解决方案
简单介绍下Aop:面向切面编程
简单术语
(1)Advice增强
(2)joinPoint链接点
(3)aspect切面
(4)weaving织入
(5)Target 目标对象
1.使用AspectJ
修改时期:代码的编译器,他的核心是提供你ajc编译器 并不限定具体的语言如java 加AspectJ在dart里面就叫AspectD在Dart里面的使用请参考咸鱼文档
简单概念
切点表达是Before After Around excution(切入点在哪)
实现原理在编译器切入click的源码 并修改
缺点:(1) 无法织入第三方的库
(2)在D8和gradle4.x有兼容性问题
(3)无法对lambda表达式进行埋点
2.使用ASM
埋点位置 在java的class文件转换成dex的时候埋点
关键技术:使用GradleTransform
实现原理:在自定义gradle的plugin中使用Transform,在mehtodVisitor里面找到View.Onclick方法并添加一个新的方法添加埋点
缺点:暂无 就是难学
3.使用Javassist
实现原理和ASM相同 就是在字节操作换成了加吧javassist
缺点:暂无 但是比上一个好学一些
4.使用AST
关键技术使用APT 即注解处理器,一java代码为输入以。java代码为输出,即在编译期通过注解生成java代码,该功能类似butterknife的注解
实现原理:
通过自定义注解处理器拿到Element对象,然后拿到对应的抽象语法树,然后通过visitMethodDef对方法进行判断,如果是目标方法则插入埋点代码
缺点:很难插入带返回值的方法
不支持lambda
不能扫描library
关于全埋点时间遇到的问题和扩展
问题
1.butterKnife的@OnClick注解时间的采集
2.Android:Onclick事件的采集
3.MenuItem的点击事件的采集
4.click的lanbda事件的采集
扩展
AlertDiaog点击事件的采集
checkBox SwitchCompat RadioButton ToggleButton RadioGroup 点击事件的采集
RatingBar点击事件的采集
SeekBar点击事件的采集
Spinner点击事件的采集
TabHost点击事件的采集
ListView GridView点击事件的采集
ExpandableListView点击事件的采集