什麼是全埋點?
全埋點,也叫無埋點、無碼埋點、自動埋點。 全埋點是指預先收集使用者的所有行為資料,然後再根據實際分析需求從中提取行為資料。
全埋點採集的事件主要包括下面四種:
• $AppStart 事件:指 App 啟動,包括冷啟動和熱啟動。
• $AppEnd 事件:指 App 退出,包括正常退出、進入後臺、 App 崩潰、App 被強殺。
• $AppViewScreen 事件:指 App 頁面瀏覽 ,對於 Android 來說,就是指切換 Activity。
• $AppClick 事件:指 App 控制元件被點選。
在採集的這四種事件當中,最重要並且採集難度最大的是 $AppClick 事件。所以,全埋點基本上也都是圍繞著如何採集 $AppClick 事件。
全埋點的整體解決思路,就是要找到那個被點選的 View 的點選處理邏輯(也叫原處理邏輯),然後利用一定的技術原理,對原處理邏輯進行“攔截”,或者在原處理邏輯的前面或者後面“插入”相應的埋點程式碼,從而達到自動埋點的效果。
至於如何做到自動“攔截”View 的原點選處理邏輯,一般都是參考 Android 系統 View 點選事件處理機制來進行的。 至於如何做到自動“插入”埋點程式碼,基本上都是參考編譯器對 Java 程式碼的處理流程來進行的即:
JavaCode --> .java --> .class --> .dex
選擇在不同的處理階段“插入”程式碼,其所用的技術或者原理也不盡相同,所以全埋點的解決方案也是多種多樣的。
面對這麼多的全埋點方案,我們究竟該如何選擇呢?
在選擇全埋點的方案時,需要從效率、相容性、擴充套件性等 方面綜合考慮。
• 效率
全埋點的基本原理,其實就是利用某些技術對某些方法 (View 被點選時的處理邏輯)進行代理(或者叫 Hook),或者“插入”程式碼。按照“在什麼時候去代理或者插入程式碼” 這個條件來區分的話,Android 全埋點技術可以大致分為 下面兩種方式 :
靜態代理
所謂靜態,就是指通過 Gradle Plugin 在編譯期間“插入” 或者修改程式碼(.class 文 件)。比如 AspectJ、ASM、javassist、AST 等方案均是這種方式,我們後面介紹的第四種方案到第七種方案均屬於靜態代理。
這幾種方式處理的時機可以參考下圖:
動態代理
所謂動態,就是指在程式碼執行的時候去進行代理。比如我們比較常見的代理 View.OnClickListener、Window.Call- back、View.AccessibilityDelegate 等方案均是這種方式。我們後面介紹的第一種方案到第三種方案均屬於動態代理。
不同的方案,其處理、執行效率也各不相同,同時對 App的浸入程度以及對 App 的整體效能的影響也各不相同。整理上來說,靜態代理明顯優於動態代理,這是因為靜態代理的“動 作”是在 App 的編譯階段處理的,不會對 App 的正常業務(App 執行時)邏輯有太大的影響。
• 相容性
隨著 Android 生態系統的快速發展,不管是 Android 系統本身,還是與 Android App 開發相關的元件和技術,都在飛速 發展快速迭代,從而也給研發全埋點方案帶來一定的難度。比如不同的 Android App 有不同的開發語言(Java 、Kotlin)、 也有不同的 Java 版本(Java7、Java8)、也有不同的開發 IDE(eclipse、Android Studio)、更有不同的開發方式(原生開發、 H5、混合開發)、不同的第三方開發框架(React Native、APICloud、Weex)、不同的 Gradle 版本、以及 Lambda、D8、 Instant Run、DataBinding、Fragment 等,都會給全埋點帶來很多相容性方面的問題。
• 擴充套件性
隨著業務的發展和資料分析需求的不斷提高,即使對於全埋點,也提出了更高的採集要求。一方面要求能全部自動埋點(採 集的範圍),同時又要求能有更精細化的採集控制(採集自定義)。比如,如何給某個控制元件新增自定義屬性 ?如果不想採集 某個控制元件的點選事件如何處理 ?如果不想採集某種控制元件型別(ImageView)的點選事件如何處理 ?如果某個頁面 (Activity)上所有控制元件的點選事件都不想採集如何處理 ?...... 任何一種全埋點的方案,都有其優點和缺點。沒有普適的完美方案。針對不同的應用場景,選擇最合適的資料採集方案即可。
注:該內容來自神策資料使用者行為洞察研究院出品的《Android 全埋點解決方案》白皮書,檢視完整白皮書可點選 ofollow,noindex" target="_blank">《Android 全埋點解決方案》
更多白皮書、報告、乾貨和案例,可以關注“神策資料”和“使用者行為洞察研究院”公眾號瞭解~