利用周末的時間,寫了一個檢測Android代碼JIT友好度的工具,取個名字為DroidJitChecker。希望可以協助大家快速發現有壞味道的代碼,並且及時修正。
名詞解釋
- JIT:JIT全稱Just-in-time compilation。意思為Just-In-Time 編譯,是JVM中一種最佳化技術,對頻繁調用並且合格方法進行最佳化將位元組碼翻譯成機器代碼,提升執行效率。
- 方法大小:每個方法的方法體實現都可用位元組作為單位進行衡量,通常情況下,方法體越大,其方法大小也越大。
- JIT友好:通常方法體實現越小越簡單,越對JIT編譯友好。
這是什麼
- 這是一個檢測Android(目錄組織圖)代碼JIT友好度的工具
- 該工具基於AdoptOpenJDK/jitwatch中的jarScan.sh進行組裝
- 輸出結果支援html,便於在瀏覽器中查看
前提準備
- 所檢測Android項目可以支援Gradle編譯成功
- 安裝jitwatch套件
- ruby運行環境
安裝
安裝jitwatch組件
擷取代碼
git clone git@github.com:AdoptOpenJDK/jitwatch.git
編譯
進入上面的repo目錄,採用以下三種方法之一即可
ant
ant clean compile test run
Maven
mvn clean compile test exec:java
Gradle
gradlew clean build run
配置
擷取本repo的代碼,並開啟config.ini檔案修改
[setup]jarScan = "/Users/androidyue/github/jitwatch/jarScan.sh"maxMethodSize = 325outputDir = "/tmp/DroidJitChecker/output_new/"
修改說明
- jarScan 必須修改,修改成已經安裝的的JarScan路徑
- maxMethodSize 無需更改,如更改請謹慎
- 輸出目錄,outputDir,建議修改為可以持續存在的目錄
如何使用
使用比較簡單,開啟終端,執行如下語句
ruby jitChecker.rb your_android_project jarTask
注意:jarTask是一個將工程的java檔案編譯成jar包的任務,可以通過執行./gradlew tasks 查看,然後選擇以jar開頭的任務即可。
查看結果
- 檢查結束後,會自動使用瀏覽器開啟結果
- 結果檔案路徑也會輸出到終端
- 結果檔案名中包含了相關的jarTask資訊,便於尋找
- 結果內容,依照方法的位元組大小,從大到小降序排列
一個典型的內容樣本
MD4.mdfour64
Package:com.app.utilsParameters:int[]ByteSize:1129
- MD4.mdfour64 對JIT不友好的方法及其所屬類
- Package:com.app.utils 上述MD4所屬的包
- Parameters:int[] mdfour64方法接受的參數
- ByteSize:1129 表示mdfour64方法持有的大小
如何解決
- 書寫邏輯簡單,職責單一的小方法
- 書寫邏輯簡單,職責單一的小方法
- 書寫邏輯簡單,職責單一的小方法
貢獻代碼
任何有協助的建議都歡迎。
以下代碼貢獻更收歡迎
美化結果展示頁面(HTML,CSS)
問題
問:位元組量大的方法一定要修改麼,修改後就能JIT編譯麼
答:位元組量大的方法建議修改,非強制,修改後不一定就能JIT編譯,因為對JIT最佳化並不意味著JIT就編譯該方法,還需要其他因素,比如該方法的調用頻率。所以這是一個你情我願的事情。
為什麼用Ruby
答:有了idea時很糾結,因為不確定用什麼語言實現,尤其是在Python和ruby之間,為此問了不少同學,最後“一意孤行”決定用Ruby了,不喜歡Python的強制對齊,超級喜歡Ruby的字串模板。Ruby很簡單,很人性化,相信你會喜歡的。
源碼
DroidJitChecker@Github
以上就是對Android JIT 代碼友好度偵查工具的資料整理,謝謝大家對本站的支援!