神策Android全埋點(diǎn)方案
原理簡單分析: Activity生命周期通過監(jiān)聽Application.ActivityLifecycleCallbacks,fragment的生命周期 及一些點(diǎn)擊事件則編譯時(shí)通過ASM對相應(yīng)方法進(jìn)行hook
神策Android SDK分析
Gradle 插件分析
倉庫上好像沒有插件代碼,通過http://jcenter.bintray.com/com/sensorsdata/analytics/android/android-gradle-plugin2/2.0.0/ 下載相應(yīng)jar包解壓

目錄

gradle plugin uml
- SensorsAnalyticPlugin 插件入口
- SensorsAnalyticsExtension 配置文件(debug 是否輸出日日志,disableJar是否修改jar包,exclude不修改的包)
- SensorsAnalyticsTransform 遍歷jar 遍歷目錄滿足條件調(diào)用SensorsAnalyticsClassVisitor
- SensorsAnalyticsClassVisitor 掃描到SensorsAnalyticsHookConfig 中配置的方法時(shí)字節(jié)碼修改調(diào)用sdk中com/sensorsdata/analytics/android/sdk/SensorsDataAutoTrackHelper的方法
SDK 分析
org.aspectj:aspectjrt:1.8.10 實(shí)際上并沒用到 其實(shí)用的是上面的ASM 所以可以去除這個(gè)依賴以及 com.sensorsdata.analytics.android.sdk.aop這個(gè)包
AnalyticsMessages 類用于上報(bào)。邏輯簡單看了下 開了個(gè)Work線程。直接上報(bào) 或者間隔一端時(shí)間去上報(bào)。
TrackTaskManager 任務(wù)列表(每次track都是個(gè)任務(wù))對應(yīng)TrackTaskManagerThread
TrackTaskManagerThread 這是個(gè)Runable 里面開了個(gè)單線程線程池每個(gè)3秒去 任務(wù)列表拉任務(wù)并執(zhí)行
關(guān)鍵的類和方法
- SensorsDataAutoTrackHelper 用于v4/Fragment生命周期和各種視圖事件的track 和插件 SensorsAnalyticsHookConfig中相對應(yīng)
- SensorsDataActivityLifecycleCallbacks Activity生命周期track
- SensorsDataAPI如下方法(主要附加了一些當(dāng)前環(huán)境數(shù)據(jù)的track 每次track都需要走到這里這個(gè)可能比較耗時(shí))
private void trackEvent(final EventType eventType, final String eventName, final JSONObject properties, final String
originalDistinctId)
總結(jié)
-
涉及的業(yè)務(wù)的還是需要額外寫入代碼 比如點(diǎn)擊按鈕也只能獲取到當(dāng)前頁面和按鈕上的文字
對于B端比較關(guān)注一些業(yè)務(wù)數(shù)據(jù)的不合適 還需要尋找新的解決方法
每次頁面操作和點(diǎn)擊事件都會(huì)去額外執(zhí)行的方法需要 測下耗時(shí) 還有打點(diǎn)前后對app性能的影響
sdk采集數(shù)據(jù)可以參考上面的關(guān)鍵方法和類。 打包插件可以參考fork一份 方便自己配置需要Hook哪些方法
額外知識(shí)
- handle是否提交了相應(yīng)任務(wù)可以用這個(gè)方法判斷
/**
* 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);
}