Android 全埋點解決方案之AST
APT
APT 是 Annotation Processing Tool 的縮寫,即註解處理器,是一種處理註解的工具。確切的說它是 javac 的一個工具, 它用來在編譯時掃描和處理註解。註解處理器以 Java 程式碼(或者編譯過的位元組碼)作為輸入,生成 .java 檔案作為輸出。 簡單來說就是在編譯期,通過註解生成 .java 檔案。許可權控制、程式碼除錯等。
Element
自定義註解處理器,需要繼承 AbstractProcessor 類,而 AbstractProcessor 最終要的就是 process 方法。process 方法 處理的核心是 Element 物件。 Element 的原始碼原始碼如下:



Element 有 5 個直接子類,它們分別代表一種特定型別的元素。五個子類各有各的用處並且有各種獨有的方法,在使用的 時候可以強制將 Element 物件轉換成其中的任何一種,但是必須滿足轉換的條件,不然會丟擲異常。

其中 TypeElement 和 VariableElement 是最核心的兩個 Element,也是我們下文會使用到的。
ATP 例項
我們通過 APT 來實現一個功能,功能類似於 ButterKnife 中的 @BindView 註解。即:通過對 View 變數的註解,實現 View 的繫結(無需呼叫 findViewById)。
完整的專案原始碼後續會 release 給大家。
AST
AST,是 Abstract Syntax Tree 的縮寫,即“抽象語法樹”,是編輯器對程式碼的第一步加工之後的結果,是一個樹形式表示 的原始碼。原始碼的每個元素對映到一個節點或子樹。
Java 的編譯過程可以分成三個階段:
第一階段:所有的原始檔會被解析成語法樹;
第二階段:呼叫註解處理器,即 APT。如果註解處理器產生了新的原始檔,新的原始檔也要參與編譯;
第三階段:
語法樹會被分析並轉化成類檔案。
原理概述
編輯器對程式碼處理的流程大概是:
JavaTXT-> 詞語法分析 -> 生成 AST -> 語義分析 -> 編譯位元組碼
通過操作 AST,可以達到修改原始碼的功能。
可 以 在 注 解 處 理 器 的 process 函 數 裡,通 過 roundEnvironment.getRootEle- ments() 方法可以拿到所有的 Element 物件,通過 trees.getTree(element) 方 法可以拿到對應的抽象語法樹(AST),然後我們自定義一個 TreeTranslator, 在 visitMethodDef 裡即可對方法進行判斷。如果是目標處理方法,則通過 AST 的相關 API 插入埋點程式碼。
實現步驟
完整的專案原始碼後續會 release 給大家
知識點
• APT
• AST
缺點
• com.sun.tools.javac.tree 相關 API 語法晦澀,理解難度大,要求對編譯原理 有一定的基礎
• APT 無法掃描其他 module,導致 AST 無法處理其他 module
• 不支援 Lambda 語法
• 帶有返回值的方法,很難把埋點程式碼插入到方法之後
參考資料
[1]ofollow,noindex" target="_blank">https://www.jianshu.com/p/5514cf705666
[2]https://www.jianshu.com/p/7af58e8e3e18
[3]http://www.eclipse.org/articles/Article-JavaCodeManipulation_AST/
[4]http://developer.51cto.com/art/201305/392858.htm
[5]https://juejin.im/entry/5ae06228518825671278334d
[6]http://www.massapi.com/source/bitbucket/20/86/2086842069/- Processor/src/TimeAnnotationProcessor.java.html
注:該內容來自神策資料使用者行為洞察研究院出品的《Android 全埋點解決方案》白皮書,檢視完整白皮書可點選360775e118954518de2c?utm_source=WeChat&utm_medium=free&utm_term=%e9%98%85%e8%af%bb%e5%8e%9f%e6%96%87&utm_content=%e7%99%bd%e7%9a%ae%e4%b9%a6-Android%e5%85%a8%e5%9f%8b%e7%82%b9&utm_campaign=sensorsdata2" rel="nofollow,noindex" target="_blank">《Android 全埋點解決方案》
更多白皮書、報告、乾貨和案例,可以關注“神策資料”和“使用者行為洞察研究院”公眾號瞭解~