神策Android全埋點(diǎn)方案分析

神策Android全埋點(diǎn)方案

原理簡單分析: Activity生命周期通過監(jiān)聽Application.ActivityLifecycleCallbacks,fragment的生命周期 及一些點(diǎn)擊事件則編譯時(shí)通過ASM對相應(yīng)方法進(jìn)行hook

神策Android SDK分析

sdk git倉庫

官網(wǎng)SDK介紹

Gradle 插件分析

倉庫上好像沒有插件代碼,通過http://jcenter.bintray.com/com/sensorsdata/analytics/android/android-gradle-plugin2/2.0.0/ 下載相應(yīng)jar包解壓

image-20180916112522297.png

目錄


sa-gradle.png

gradle plugin uml

  1. SensorsAnalyticPlugin 插件入口
  2. SensorsAnalyticsExtension 配置文件(debug 是否輸出日日志,disableJar是否修改jar包,exclude不修改的包)
  3. SensorsAnalyticsTransform 遍歷jar 遍歷目錄滿足條件調(diào)用SensorsAnalyticsClassVisitor
  4. SensorsAnalyticsClassVisitor 掃描到SensorsAnalyticsHookConfig 中配置的方法時(shí)字節(jié)碼修改調(diào)用sdk中com/sensorsdata/analytics/android/sdk/SensorsDataAutoTrackHelper的方法

SDK 分析

  1. org.aspectj:aspectjrt:1.8.10 實(shí)際上并沒用到 其實(shí)用的是上面的ASM 所以可以去除這個(gè)依賴以及 com.sensorsdata.analytics.android.sdk.aop這個(gè)包

  2. AnalyticsMessages 類用于上報(bào)。邏輯簡單看了下 開了個(gè)Work線程。直接上報(bào) 或者間隔一端時(shí)間去上報(bào)。

  3. TrackTaskManager 任務(wù)列表(每次track都是個(gè)任務(wù))對應(yīng)TrackTaskManagerThread

  4. TrackTaskManagerThread 這是個(gè)Runable 里面開了個(gè)單線程線程池每個(gè)3秒去 任務(wù)列表拉任務(wù)并執(zhí)行

關(guān)鍵的類和方法

  1. SensorsDataAutoTrackHelper 用于v4/Fragment生命周期和各種視圖事件的track 和插件 SensorsAnalyticsHookConfig中相對應(yīng)
  2. SensorsDataActivityLifecycleCallbacks Activity生命周期track
  3. 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é)

  1. 涉及的業(yè)務(wù)的還是需要額外寫入代碼 比如點(diǎn)擊按鈕也只能獲取到當(dāng)前頁面和按鈕上的文字

    對于B端比較關(guān)注一些業(yè)務(wù)數(shù)據(jù)的不合適 還需要尋找新的解決方法

  2. 每次頁面操作和點(diǎn)擊事件都會(huì)去額外執(zhí)行的方法需要 測下耗時(shí) 還有打點(diǎn)前后對app性能的影響

  3. sdk采集數(shù)據(jù)可以參考上面的關(guān)鍵方法和類。 打包插件可以參考fork一份 方便自己配置需要Hook哪些方法

額外知識(shí)

  1. 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);
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在 Android Studio 構(gòu)建的項(xiàng)目中,基于 Gradle 進(jìn)行項(xiàng)目的構(gòu)建,同時(shí)使用 Android DS...
    Ant_way閱讀 7,585評(píng)論 0 16
  • Android開發(fā)工具 Android Studio Android開發(fā)環(huán)境,基于IntelliJ IDEA,谷歌...
    奈何心善閱讀 2,523評(píng)論 1 18
  • 目前為止,我們已經(jīng)學(xué)習(xí)了如何修改Gradle構(gòu)建屬性,以及如何運(yùn)行任務(wù)。本章,我們會(huì)深入了解這些屬性,并且創(chuàng)建我們...
    sollian閱讀 2,754評(píng)論 0 8
  • 說明 本文主要介紹和Gradle關(guān)系密切、相對不容易理解的配置,偏重概念介紹。部分內(nèi)容是Android特有的(例如...
    搬磚的小明閱讀 16,155評(píng)論 1 62
  • 1.介紹 如果你正在查閱build.gradle文件的所有可選項(xiàng),請點(diǎn)擊這里進(jìn)行查閱:DSL參考 1.1新構(gòu)建系統(tǒng)...
    Chuckiefan閱讀 12,356評(píng)論 8 72

友情鏈接更多精彩內(nèi)容