原理简单分析: Activity生命周期通过监听Application.ActivityLifecycleCallbacks,fragment的生命周期 及一些点击事件则编译时通过ASM对相应方法进行hook
神策Android SDK分析
Gradle 插件分析
仓库上好像没有插件代码,通过http://jcenter.bintray.com/com/sensorsdata/analytics/android/android-gradle-plugin2/2.0.0/ 下载相应jar包解压
![](http://image109.360doc.cn/DownloadImg/2021/06/2420/224855713_1_20210624085117614.png)
目录
![](http://image109.360doc.cn/DownloadImg/2021/06/2420/224855713_2_202106240851185.png)
gradle plugin uml
SensorsAnalyticPlugin 插件入口
SensorsAnalyticsExtension 配置文件(debug 是否输出日日志,disableJar是否修改jar包,exclude不修改的包)
SensorsAnalyticsTransform 遍历jar 遍历目录满足条件调用SensorsAnalyticsClassVisitor
SensorsAnalyticsClassVisitor 扫描到SensorsAnalyticsHookConfig 中配置的方法时字节码修改调用sdk中com/sensorsdata/analytics/android/sdk/SensorsDataAutoTrackHelper的方法
SDK 分析
org.aspectj:aspectjrt:1.8.10 实际上并没用到 其实用的是上面的ASM 所以可以去除这个依赖以及 com.sensorsdata.analytics.android.sdk.aop这个包
AnalyticsMessages 类用于上报。逻辑简单看了下 开了个Work线程。直接上报 或者间隔一端时间去上报。
TrackTaskManager 任务列表(每次track都是个任务)对应TrackTaskManagerThread
TrackTaskManagerThread 这是个Runable 里面开了个单线程线程池每个3秒去 任务列表拉任务并执行
关键的类和方法
SensorsDataAutoTrackHelper 用于v4/Fragment生命周期和各种视图事件的track 和插件 SensorsAnalyticsHookConfig中相对应
SensorsDataActivityLifecycleCallbacks Activity生命周期track
SensorsDataAPI如下方法(主要附加了一些当前环境数据的track 每次track都需要走到这里这个可能比较耗时)
private void trackEvent(final EventType eventType, final String eventName, final JSONObject properties, final String originalDistinctId)
总结
涉及的业务的还是需要额外写入代码 比如点击按钮也只能获取到当前页面和按钮上的文字
对于B端比较关注一些业务数据的不合适 还需要寻找新的解决方法
每次页面操作和点击事件都会去额外执行的方法需要 测下耗时 还有打点前后对app性能的影响
sdk采集数据可以参考上面的关键方法和类。 打包插件可以参考fork一份 方便自己配置需要Hook哪些方法
额外知识
handle是否提交了相应任务可以用这个方法判断
/** * Check if there are any pending posts of messages with code 'what' in * the message queue. */ public final boolean hasMessages(int what) { return mQueue.hasMessages(this, what, null); }