
前言
神策分析 Android 埋點 SDK,是一款輕量級用于 Android 端的資料采集埋點 SDK,包含代碼埋點、全埋點、點擊圖和可視化全埋點功能,全埋點通過配合神策 Android 埋點插件來實作,神策分析 Android 埋點插件使用位元組碼插樁(ASM)的技術實作 Android 端的全埋點(無埋點 / 無碼埋點 / 無痕埋點 / 自動埋點),
SDK 目錄分層
神策分析 Android 埋點 SDK 自開源以來,從最開始為了滿足代碼埋點的需求,到后來全埋點、可視化全埋點的支持,SDK 的目錄結構不斷發生調整以及相關代碼的優化,目前開源代碼中存在demo、demoAndroidX、SensorsAnalyticsSDK 三個工程專案,其中:
-
/sa-sdk-android/demo :簡單的測驗工程
-
/sa-sdk-android/demoAndroidX :基于 AndroidX 庫的測驗工程
-
/sa-sdk-android/SensorsAnalyticsSDK:神策分析 SDK 工程專案

下面將以最新的 SDK 版本 v3.2.10 為基礎介紹 SensorsAnalyticsSDK 的目錄分層,

-
/src/androidTest:單元測驗代碼
-
/src/main/assets:用于運營商映射配置表
-
/src/main/java:SDK 核心代碼
-
/src/main/res:SDK 用到的資源檔案
資料流程
一條資料從觸發采集代碼到最終洗掉的流程圖如下所示:

SDK 采集一條資料首先會存入本地 SQLite 資料庫,判斷是否符合資料上報策略,如果符合則上報資料,若上報成功則洗掉已上報的資料,失敗則不洗掉;如果不符合發送策略,則資料不上傳、不洗掉,未上報的本地資料會在下一條資料采集時再次觸發該流程上報資料或者 APP 進入后臺時觸發上報,以此回圈,
架構詳解
一、簡介
如上所述,神策分析 Android SDK 是一款輕量級用于 Android 端的資料采集埋點 SDK,而資料采集是構建資料平臺的核心要素,資料采集是否完整,采集的資料是否準確,采集是否及時,采集的資料能否關聯打通,都直接影響整個資料平臺的應用效果,因此,神策分析 Android SDK 采用了良好的架構來保證資料的采集,
二、架構圖
神策分析 Android SDK 總體架構圖如下所示:

三、架構詳解
(一)配置模塊
SDK 初始化配置模塊中,不僅支持本地引數初始化配置,同時可支持后臺遠程配置初始化引數,下面將介紹 SDK 初始化配置及遠程配置策略,
1. SDK 初始化配置
在引入神策分析 Android SDK 之后,進行 SDK 的初始化時通過傳入 SAConfigOptions 進行 SDK 的相關配置,SAConfigOptions 提供默認配置項,無特殊需求客戶可以直接使用默認值進行初始化 SDK,涉及的檔案:
-
AbstractSAConfigOptions
-
SAConfigOptions
示例:

點擊圖片查看詳細內容
2. SDK 遠程配置
遠程配置通過訪問對應的資料接收地址下的 config 介面,得到 disableDebugMode、disableSDK 和 autoTrackMode 這三個配置項的值,來控制相應的功能,
初始化 SDK 可配置 SAConfigOptions 中的引數mDisableRandomTimeRequestRemoteConfig ,該引數控制是否禁用隨機時間請求遠程配置,該配置目的是通過設定可分散降低 SDK 遠程配置請求的頻次,
如果該值設定為 true,則每次 APP 啟動后都會訪問遠程配置介面獲取遠程配置,如果開啟隨機時間請求遠程配置后,可設定遠程配置請求最小間隔時長 mMinRequestInterval (單位為小時,默認值 24 )、遠程配置請求最大間隔時長 mMaxRequestInterval(單位為小時,默認值 48 ),SDK 根據設定的時間按照一定規則判斷是否滿足請求遠程配置條件,如果滿足條件則觸發遠程配置請求,若不滿足則不請求,請求失敗后,會自動最多重試 3 次,請求成功后更新配置,生效配置,
具體時間約束規則,參考 Android SDK 原始碼 SensorsDataUtils 類中 isRequestValid 方法,遠程配置請求流程如下圖所示:

下面分別介紹下這三個配置項的取值含義:
(1)disableDebugMode(目前已經廢棄)
-
true: 代表關閉 debugMode
-
false: 代表不做處理
-
默認值為 0,無法通過這種方式開啟 debugMode
(2)disableSDK
-
true:關閉 SDK
-
false:開啟 SDK
-
默認值為 false
(3)autoTrackMode
-
-1: 代表不做任何處理
-
0:代表關閉全埋點的所有事件
-
默認值:-1
如果要開啟全埋點中的部分事件,需要用下面的幾個值進行組合:
-
$AppStart:1
-
$AppEnd:2
-
$AppClick:4
-
$AppViewScreen:8
比如,我想開啟 $AppStart 和 $AppClick 事件,那 autoTrackMode 的值就是 5,即:1 + 4 = 5
(二)資料采集模塊
資料采集模塊是核心模塊,主要負責準確、完整地通過埋點來采集資料,資料采集模塊主要提供了下面幾個功能:
-
代碼埋點:在 SDK 初始化之后,對需要采集的事件,呼叫 track 介面方法埋點采集事件,
-
全埋點:無需開發工程師寫代碼或者寫少量的代碼,即可預先自動收集用戶的所有或者絕大部分的行為資料,
-
點擊圖:應用一種特殊高亮的顏色形式,顯示頁面或頁面組區域中不同元素被點擊的次數和占比,
-
可視化全埋點:通過可視化的方式,對界面上標識的可埋點元素創建新的埋點,標識顯示名或事件名,對已埋點元素可修改顯示名,
-
預制屬性:埋點 SDK 自動采集的一些任何用戶觸發的任何事件都需要攜帶一些最基本的屬性(資訊)(比如作業系統型別、作業系統版本號、運營商資訊、應用程式版本號、設備廠商等)
(三)資料存盤模塊
為了最大限度的保證事件資料的準確性和及時性,會要求資料采集 SDK 盡快將事件資料同步到服務端,但在某些情況下,例如用戶處于斷網環境,或者根據實際需求(對用戶體驗要求比較高的情況)會要求只有在 Wi-Fi 環境中才會同步資料,可能會導致事件資料無法同步或者同步失敗,因此,資料采集 SDK 一般采取的策略是:先把事件資料快取在本地,待符合一定的策略之后,再去同步資料,
在 Android 應用程式中,使用 SQLite 資料庫進行埋點事件的存盤,
(四)網路模塊
在資料存盤模塊中,介紹了如何把事件資料存盤到客戶端本地,如果事件資料一直快取在本地,是沒有意義的,我們還需要把資料同步到服務端,然后再經過服務端的存盤、抽取、分析和展現,才能充分發揮資料的價值,因此,網路模塊主要負責如何把快取在本地的事件資料同步給服務端,
在 Android 開發中,常見的網路請求框架有:OkHttp、Volley 等,但是對于 SDK 來說,一般的原則是不依賴第三方的庫,所以這里我們通過簡單封裝 HttpURLConnection 類進行網路請求的發送,這里會涉及到資料的網路發送策略,網路策略一方面是為了降低用戶使用資料采集 SDK 的難度和成本,另一方面更是為了確保資料的正確性、完整性和及時性,
在這里,我們以最常用的三種資料同步策略為例來介紹:
-
策略一:客戶端本地存盤的資料超過一定條數時同步資料(默認 100 條)
-
策略二:客戶端與上次發送的時間間隔大于預設的發送時間間隔 flushInterval (默認 15 秒)時同步資料
-
策略三:客戶端 APP 應用程式進入后臺時為了最大限度的保證資料的完整性,盡可能同步本地快取的所有資料
上述三種策略是自動同步資料策略,三種策略為“或”的關系,當滿足其中一個策略 SDK 就會上報資料,如果需要手動觸發資料同步,可以直接呼叫 flush() 方法同步資料,
(五)輔助工具
神策分析 Android SDK 提供了許多埋點相關的工具類,這些輔助工具可以幫助埋點的實作,例如 AopUtil 提供了獲取控制元件內容、獲取頁面標題內容,獲取組件顯示的文本內容、獲取控制元件位置等等方法;SensorsDataUtils 工具類獲取運營商資訊、獲取 UA、合并 JSON 、檢測 Android Permission 等等方法,關于這些輔助工具的功能和實作就不逐一贅述了,具體可以參考 SDK 的原始碼,
(六)日志服務
掃碼打開除錯模式后,SDK 同時自動開啟日志輸出功能,也可在測驗階段通過 enableLog 介面打開 SDK 日志輸出功能,
SDK 日志輸出開啟后,在 IDE Logcat 日志控制臺中篩選 SA. 關鍵詞進行日志篩選,
-
埋點事件觸發成功時,SDK 會輸出 【track event】 開頭的事件資料;
-
事件資料上報成功時,SDK 會輸出 【valid message】欄位開頭的事件資料;
-
事件資料上報失敗時,SDK 會輸出 【invalid message】 欄位開頭的事件資料并輸出錯誤原因,
日志示例:

點擊圖片查看詳細內容
總結
隨著業務不斷地發展以及 Android 技術的不斷更新,技術架構是一個持續更新的程序,以適應業務的不斷的發展,
*如果你喜歡更多內容,歡迎關注「神策資料開源社區服務號」,也可以在服務號回復“ 3 ”,獲取進入開源社區社群的方式,和一群熱愛技術的人聊技術、分享技術!
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/294252.html
標籤:其他
上一篇:解決Android Handler的handleMessage()方法內TextView.setText偶爾不執行的問題
下一篇:面試總結——Android篇
