Android 全埋點解決方案之 AspectJ
AOP
AOP 是 Aspect Oriented Programming 的縮寫,即“面向切面程式設計”。使用 AOP,可以在編譯期間對程式碼進行動態管理, 以達到統一維護的目的。AOP 是 OOP 程式設計的一種延續,也是 Spring 框架中的一個重要模組。利用 AOP 可以對業務邏輯 的各個模組進行隔離,從而使得業務邏輯各個部分之間的耦合度降低,提高程式的可重用性,同時提高開發的效率。利用 AOP,我們可以在無浸入的在宿主中插入一些程式碼邏輯,從而可以實現一些特殊的功能,比如日誌埋點、效能監控、動態 許可權控制、程式碼除錯等。
AOP 術語
以上概念,如果之前沒有接觸過,確實挺晦澀的。 我們下面有一段“白話”總結一下:
第一步:
我們通過定義一個表示式(PointCut)來告訴程式,我們需要對哪些地方增加額外的操作。通過這個表示式(PointCut), 我們得到那些需要通知的方法(JoinPoint)。
第二步:
我們還需要告訴程式,這些方法(JoinPoint)需要做怎樣的增強(Advice): 1) 什麼時候進行額外的操作(執行前 / 執行後 / 返回之前)? 2) 額外操作具體要做什麼? 我們把以上兩個步驟定義到一個地方(Aspect)。 上面兩個步驟涉及到的被修改的物件,我們稱之為目前物件(Target)。 完成上面的所有操作的動作,我們總稱為織入(Weaving)。
AspectJ
AOP 是一個概念,一個規範,本身並沒有設定具體語言的實現。AspectJ 實際上是對 AOP 程式設計思想的一個實現,它能夠和 Java 配合起來使用。
AspectJ 的核心就是它的編譯器 (ajc),它就做了一件事,將 AspectJ 的程式碼在編譯期插入到目標程式當中,執行時跟在其 它地方沒什麼兩樣。因此想要使用它最關鍵的就是使用它的編譯器去編譯程式碼。ajc 會構建目標程式與 AspectJ 程式碼的聯絡, 在編譯期將 AspectJ 程式碼插入被切出的 PointCut 中,達到 AOP 的目的。
關於 AspectJ 更詳細的介紹,可以參考其官網: ofollow,noindex" target="_blank">http://www.eclipse.org/aspectj/
原理概述
對於 Android 系統中的 View,它的點選處理邏輯,都是通過設定相應的 OnClickListener,然後重寫相應的方法實現的。 比如對於 Button、ImageView 等控制元件,它設定的 listener 均是 android.view.View.OnClickListener,然後重寫 onClick (android.view.View) 方法。我們只要在其 onClick(android.view.View) 方法中插入埋點程式碼,即可做到自動埋點。 我們可以把 AspectJ 的處理指令碼放到自定義的外掛裡,之後編寫相應的切面類,然後我們再定義合適的 PointCut 用來匹 配我們的織入目標方法,比如 android.view.View.OnClickListener.onClick(android.view.View),最後在編譯期間插入埋 點程式碼,從而就可達到自動埋點的效果。
實現步驟
完整的專案原始碼後續會 release 給大家。
缺點
• 無法織入第三方的庫
• 由於定義的切點依賴程式語言,該方案無法相容 Lambda 語法
• 會有一些相容性方面的問題,比如:D8、Gradle 4.x 等
知識點
• AOP
• AspectJ
• Gradle
• Gradle Plugin
• 註解
參考資料
[1] https://www.cnblogs.com/yangyquin/p/5462488.html
[2] 360doc.com/content/11/0414/16/3639038_109610987.shtml" rel="nofollow,noindex" target="_blank">http://www.360doc.com/content/11/0414/16/3639038_109610987.shtml
[3] https://www.jianshu.com/p/873eaee38cc1
[4] https://www.jianshu.com/p/aa1112dbebc7
[5] https://deemons.cn/2017/10/16/ 自定義 %20Gradle%20 外掛 /
[6] https://blog.csdn.net/Deemons/article/details/78473874
[7] https://github.com/uPhyca/gradle-android-aspectj-plugin
[8] https://github.com/JakeWharton/hugo
[9] https://github.com/HujiangTechnology/gradle plugin android_aspectjx [10] https://www.eclipse.org/aspectj/
注:該內容來自神策資料使用者行為洞察研究院出品的《Android 全埋點解決方案》白皮書,檢視完整白皮書可點選 《Android 全埋點解決方案》
更多白皮書、報告、乾貨和案例,可以關注“神策資料”和“使用者行為洞察研究院”公眾號瞭解~