rabbit 是一個Android APM框架(工具), 它不只可讓開發者很方便的在本地對App作性能監控, 也提供了完整的數據上報系統。目前包含的主要功能以下圖:html
本文將對rabbit
的功能作一個簡單的介紹,詳細的使用文檔地址: 使用文檔java
多圖警告⚠️⚠️⚠️git
經過編譯時代碼插樁, rabbit
能夠很是方便的統計應用的冷啓動時間與頁面渲染時間。測速統計的關鍵時間點定義以下圖:github
在對應用主頁進行配置後,rabbit
能夠統計出以下圖所示的冷啓動耗時:web
與網絡請求耗時結合後,rabbit
能夠統計出一個頁面的徹底渲染耗時。這裏的徹底渲染耗時是指:從頁面create到頁面拿到請求結果並刷新頁面所用的時間。核心思想參考自:Android自動化頁面測速在美團的實踐,最終統計的頁面耗時以下圖所示:json
基於編譯時代碼插樁, rabbit能夠準確的統計每個函數的耗時,並篩選出慢函數。bash
慢函數定義爲: 在主線程消耗時間超過必定閾值的函數(rabbit也支持配置檢測其餘線程的慢函數)。微信
rabbit
支持分包檢測慢函數:markdown
支持查看每個包下的慢函數列表以及每個慢函數的堆棧:網絡
經過提供給rabbit
一份代碼掃描列表,rabbit能夠在編譯時掃描出這些代碼調用的位置。默認會掃描一些阻塞代碼, 好比下面這種:
SharePreferences$Editor.commit() 複製代碼
最終掃描結果會展現以下:
點擊右上角導出按鈕能夠把掃描結果以json
的形式導出到SD卡中。
rabbit能夠記錄網絡請求日誌並方便的查看返回的json
數據:
rabbit經過Choreographer
來檢測主線程的運行狀況,並異步採集主線程堆棧來還原卡頓現場。
對於下面代碼:
Thread.sleep(2000)
複製代碼
rabbit會得到以下的卡頓採集結果:
rabbit會在主線程looper運行時計算主線程FPS並實時的顯示出來:
rabbit支持分頁面分析FPS:
功能相似於FPS分析
,rabbit支持實時顯示內存使用狀況並分頁面分析內存佔用狀況:
分頁面內存統計:
經過設置Thread.setDefaultUncaughtExceptionHandler
,rabbit能夠捕獲java層異常並展現出來:
rabbit集成了leakcanary 2.0
。
rabbit提供了一個可執行的jar包, 它能夠準確的分析出apk中的大圖、重複文件、apk包大小與內容組成。核心思路參考自Matrix APK包分析。
運行方式爲:
java -jar apk-analyzer.jar apk-analyzer-config.json
複製代碼
apk-analyzer-config.json
用來配置待分析的apk路徑以及mapping文件位置等信息:
{ "apkPath":"xxxx/app-Release.apk", "methodGroup":[{ "name":"xxx", "package":"com.xxx.xx" }], "classMappingFilePath":"xxx/xxx.txt", "maxImageSizeKB":30 } 複製代碼
最終分析結果會輸出到一個json文件中:
apk-analyzer-result.json
{ "AppInfo": { "versionCode": "1004000", "versionName": "1.4.0", "appSize": "21.51 MB" }, "BigImageRes": [ { "name": "assets/flutter_assets/images/icons/xxLogo.png", "size": "76.73 KB" } ... ... ], "ApkCompose": [ { "type": "so", "totalSizeStr": "8.05 MB" }, { "type": "dex", "totalSizeStr": "6.54 MB" } ... ... ], "DuplicatedFile": [ { "files": [ "res/drawable-xxhdpi-v4/bg_home_water_ripple.webp", "res/drawable-xxhdpi-v4/bg_keyboard_shadow_line.webp" ], "fileSize": "", "md5Value": "d41d8cd98f00b204e9800998ecf8427e" } .... ], "MethodCount": { "total-count": 127732, "com.xxx.xx": 14800, "other-pkg": 112932 } } 複製代碼
須要在apk-analyzer-config.json
中配置上報路徑:
{ "apkPath":"xxxx/app-Release.apk", ... "uploadPath":"xxxxxx/upload" } 複製代碼
上報的數據格式與rabbit的基本上報數據格式保證一致:
rabbit目前支持上報大部分檢測數據。經過一些簡單的配置就能夠把檢測數據上報到後臺。rabbit數據上報的基本格式以下:
{ "device_info_str": "{....}", "info_str": "{...}", "time": 1577775888933, "type": "fps_info", "use_time": 19 } 複製代碼
rabbit提供了上報回調,能夠經過這個回調很方便的來實現自定義的上報邏輯:
rabbitConfig.reportConfig.dataReportListener = object :RabbitReportConfig.DataReportListener{
override fun onPrepareReportData(data: Any, currentUseTime: Long) {
//接入本身的上報邏輯
}
}
複製代碼
rabbit向外提供了UI
擴展API,使用這些API能夠很方便的把應用的「後門「放到rabbit中。
具體操做見 : 在rabbit中自定義頁面
rabbit的接入十分簡單, 基本上就是一個init代碼:
Rabbit.init(rabbitConfig)
複製代碼
相關支持配置見:RabbitConfig。
對於每個功能,rabbit都提供了豐富的配置API和詳細的使用文檔。
在rabbit控制面板中你也能夠很方便的控制這些功能:
監控開關設置
快捷功能
查看當前配置
rabbit目前沒有通過線上環境的驗證,爲了方便接入,提供了noop包。
具體引入步驟見 引入noop包
noop包中能夠繼續使用rabbit的UI功能
rabbit並無使用什麼很特別架構,不過各功能間都使用module的形式作了組件隔離:
rabbit目前提供的功能還比較簡單,接下來會更細緻的完善每個功能來提升可用性。
rabbit會利用現有的功能來作一個全局的性能檢測並輸出一個檢測分數來評估應用的性能。具體實現邏輯我還在思考中。
客戶端功能作的比較完善後,計劃作一個性能監控後臺(two year late😬)。
rabbit目前維護者只有我一我的。 一我的的力量終究有限, 若是你對rabbit有興趣或者感受哪些功能不完善,歡迎提意見! 更歡迎提pr來加入到rabbit的開發中!
既然都看到這裏了, 給 Rabbit 個✨吧 ! 奧 利 給 !
我的公衆微信號:
參考資料