Android無埋點的技術選型之路

數極客是國內新一代用戶行爲分析平臺,支持無埋點採集,前端代碼埋點採集,後端代碼埋點採集等多種混合數據採集方式,支持30多種數據可視化效果,是增長***必的備大數據分析工具,支持APP分析數據網站分析及用戶畫像,獨創了6大轉化率分析模型,的英文用戶行爲分析領域首家應用定量分析與定性分析方法的數據分析產品,運用數極客用戶行爲錄屏系統,可以分析並優化用戶體驗的細節,基於用戶行爲分析系統- ,了提供會員營銷系統- A / B測試工具兩大數據智能應用解決方案,企業使得可以快速的實現數據驅動增長。
歡迎關注數極客微信公衆號:shujujike,更全面的獲取無埋點及用戶行爲大數據分析的要點。
原創作者:楊永強數極客技術合夥人

概述
無埋點也叫全埋點、自動埋點,無埋點就是指不需要開發人員添加任何代碼,就可以實現數據的採集。
換句話說也就是在我們需要採集數據的位置插入採集數據的代碼,而這個插入採集代碼的過程不需要我們手動去添加,而是自動實現插入,這就是無埋點。
用戶行爲數據,就是用戶在操作app的過程中產生的行爲,比如 打開頁面 / 關閉頁面 / 瀏覽頁面 / 點擊按鈕 /退出後臺 / 返回前臺 等事件,這些行爲事件連起來就能組成一個用戶的行爲事件鏈條,這個鏈條可以理解爲這個用戶的行爲數據。

目錄
一 、技術方案對比
1.1 幾種無埋點實現方案介紹
1.2 處理時機對比
1.3 優缺點對比
二、實現ASM方案的準備知識
2.1 什麼是AOP
2.2 gradle plugin的實現
2.3 Android app的編譯過程
2.4 ASM介紹
三、 ASM方案實現方法
3.1實現gradle plugin
3.2通過ASM實現hook代碼
3.3根據業務邏輯實現自己的SDK代碼
四、總結

一 、技術方案對比
1.1 幾種無埋點實現方案介紹
在做無埋點技術選型時,我們對以下幾種主流Android 無埋點方案進行對比:
AspectJ 方案
Aspectj 是它有一套自己的Java編譯器,當我們用這個編譯器進行編譯時Aspectj會根據自己的方式進行代碼插入,從而實現在編譯期間插入埋點代碼。
可參考:
利用AspectJ實現Android端非侵入式埋點
AspectJ in Android (一),AspectJ 基礎概念
AspectJ in Android (二),AspectJ 語法
AspectJ in Android (三),AspectJ 兩種用法以及常見問題

AST 方案
當IDE對項目code進行編譯時,最先進行的是對源代碼進行編譯從而生成 .java 文件。
此方案就是利用這個時機,通過自定義註解器(APT)來切入我們需要插入代碼的點,再通過AST的語法來插入埋點代碼。
可參考:
Android AOP 抽象語法樹
基於AST的組件化自動插樁方案

Javassist 方案
在Android app編譯的過程中,.class 最終會轉換爲 .dex 文件,gradle 在編譯的過程中 允許開發人員通過gradle plugin來修改class文件。這樣就可以利用 Javassist 來修改 .class 字節碼文件,從而實現插入埋點代碼的目的。
可參考:
Javassist 使用指南 1 
Javassist 使用指南 2

ASM  方案
ASM和 Javassist 原理基本一樣,只是在操作.class 文件時用的是ASM。
本文將主要介紹此種方式。

1.2 處理時機對比
Android無埋點的技術選型之路

1.3 優缺點對比
Android無埋點的技術選型之路

AspectJ 功能非常強大,使用起來也很方便,但是其不支持三方庫的修改,所以果斷放棄。
AST 對於不瞭解語法樹 /註解 這些相對晦澀的知識點的不建議使用,後期維護起來非常不便,遂放棄。
Javassist 和 ASM兩者原理基本一樣,只是在後期操作字節碼時 ASM 比 Javassist性能更好,因爲javassist用到反射,所以性能上有犧牲。ASM是非常底層的,操作起來難度大,但是性能非常優秀。作爲三方SDK,對源代碼的侵入程度和性能要求非常嚴格,所以最終選擇ASM方案。

二、實現ASM方案的準備知識
2.1 什麼是AOP
AOP 面向切向編程(Aspect Oriented Programming)與之對應的是OOP(ObjectOriented Programming)面向對象編程。
也可以自行Google,不再贅述。
2.2 gradle plugin的實現
Android Gradle Plugin 版本在1.5.0及以上,Google 官方提供了可以通過實現Plugin<Project> 接口,來實現編譯成dex文件之前來修改.class 文件。
2.3 Android app的編譯過程
Android無埋點的技術選型之路

2.4 ASM介紹
ASM是一個java字節碼操縱框架,它能被用來動態生成類或者增強既有類的功能。ASM 可以直接產生二進制 class 文件,也可以在類被加載入 Java 虛擬機之前動態改變類行爲。
ASM相關可以參考:ASM 開發指導
三、 ASM方案實現方法
3.1實現gradle plugin
實現Plugin<Project>接口
Android無埋點的技術選型之路
繼承 Transform 
Android無埋點的技術選型之路
對於transform API 不熟悉的可以查看API。
最核心的代碼就是遍歷所有的class文件
Android無埋點的技術選型之路
3.2通過ASM實現hook代碼
在ASM的核心實現中,它主要有以下幾個類、接口(在org.objectweb.asm包中)。
Cla***eader類:字節碼的讀取與分析引擎。它採用類似SAX的事件讀取機制,每當有事件發生時,調用註冊的ClassVisitor、AnnotationVisitor、FieldVisitor、MethodVisitor做相應的處理。
ClassVisitor接口:定義在讀取Class字節碼時會觸發的事件,如類頭解析完成、註解解析、字段解析、方法解析等。
AnnotationVisitor接口:定義在解析註解時會觸發的事件,如解析到一個基本值類型的註解、enum值類型的註解、Array值類型的註解、註解值類型的註解等。
FieldVisitor接口:定義在解析字段時觸發的事件,如解析到字段上的註解、解析到字段相關的屬性等。
MethodVisitor接口:定義在解析方法時觸發的事件,如方法上的註解、屬性、代碼等。
ClassWriter類:它實現了ClassVisitor接口,用於拼接字節碼。
AnnotationWriter類:它實現了AnnotationVisitor接口,用於拼接註解相關字節碼。
FieldWriter類:它實現了FieldVisitor接口,用於拼接字段相關字節碼。
MethodWriter類:它實現了MethodVisitor接口,用於拼接方法相關字節碼。
SignatureReader類:對類定義、字段定義、方法定義、本地變量定義的簽名的解析。Signature因範型引入,用於存儲範型定義時的元數據(因爲這些元數據在運行時會被擦除)。
SignatureVisitor接口:定義在解析Signature時會觸發的事件,如正常的Type參數、類或接口的邊界等。
SignatureWriter類:它實現了SignatureVisitor接口,用於拼接範型相關字節碼。
Attribute類:字節碼中屬性的類抽象。
ByteVector類:字節碼二進制存儲的容器。
Opcodes接口:字節碼指令的一些常量定義。
Type類:類型相關的常量定義以及一些基於其上的操作。
Android無埋點的技術選型之路
參考: ASM 源碼解析  ,http://www.blogjava.net/DLevin/archive/2014/06/25/414292.html

步驟
1.通過Cla***eader 讀取class 文件
2.通過ClassWriter來修改class 文件,修改時需要用到ClassVisitor /MethodVisitor來訪問class 內部的成員 方法,再通過相關API來插入埋點代碼
Android無埋點的技術選型之路
3.3根據業務邏輯實現自己的SDK代碼
當hook成功後,剩下的就是自己根據業務邏輯去實現相關代碼,此處不贅述。
四、總結
本文是從宏觀上介紹無埋點的幾種技術,和ASM的實現思路,希望能對無埋點有一個全局的認識。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章