神策Android全埋点方案分析

神策Android全埋点方案

原理简单分析: Activity生命周期通过监听Application.ActivityLifecycleCallbacks,fragment的生命周期 及一些点击事件则编译时通过ASM对相应方法进行hook

神策Android SDK分析

sdk git仓库

官网SDK介绍

Gradle 插件分析

仓库上好像没有插件代码,通过 http://jcenter.bintray.com/com/sensorsdata/analytics/android/android-gradle-plugin2/2.0.0/ 下载相应jar包解压

  • 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.