編譯插樁就是在代碼編譯期間修改已有的代碼或者生成新代碼
爲什麼說是編譯插樁呢?其實它是一個動作和一個修飾,編譯: 代碼在編譯期間,插樁: 在編譯時期將需要的動作或者是邏輯插入已經編譯的class文件中。
任何不能促使自己提高生產力的技術都沒有學習的意義,那怎麼將這個技術使用到Android開發中呢?
首先,在Android中,編譯的過程爲.java -> .class -> .dex,既然能在.class 文件中插入我們想要的邏輯,是否可以在轉換爲.dex之前實現想要的功能呢?
一、來一個疑問?
統計每個Activity打開的次數,用於數據統計,要求是不能只統計自己寫的Activity,第三方的Activity也需要統計,哦,怎麼搞,按照我們慣有的思維,應該是在每個Activity中的onCreate\onDestory中添加上報的代碼,那第三方的Activity不能修改,該怎麼去做統計呢?
1.1 可以在啓動的地方統計
針對上述的問題,在啓動的地方是能統計的,但是,拋開關閉不好統計的影響之外,在第三方的Activity 中啓動的Activity怎麼統計?
1.2 使用插樁技術
這個單獨做記錄,
- 自定義Gradle文件
- 自定義Transform
二、 應用場景
對於Android開發者來講,我們不再只需要記住編譯插樁需要怎麼做,和能怎麼做就可以了,這項技術就可以在我們日常開發中添磚加瓦了
2.1 場景及步驟
場景:
- 日誌埋點;
- 性能監控;
- 動態權限控制;
- 業務邏輯跳轉時,校驗是否已經登錄;
- 其他
使用 - 首先理解自己的業務場景,是否需要此項技術,此項技術是否帶來大工作量而帶來少量的效益
- 創建自己定義的gradle文件,這項技術就是在groovy 實現的,需要gradle
- 自定義Transform,在transform方法中實現自己的邏輯
2.2 怎麼插到Activity,也就是Android中
- ASM
ASM是生成和轉換已編譯的Java類工具,就是我們插樁需要使用的工具。
具體操作在Demo中體現