開源 | 新一代Android 性能監控框架Rabbit

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會得到以下的卡頓採集結果:

FPS分析

rabbit會在主線程looper運行時計算主線程FPS並實時的顯示出來:

rabbit支持分頁面分析FPS:

內存分析

功能相似於FPS分析,rabbit支持實時顯示內存使用狀況並分頁面分析內存佔用狀況:

分頁面內存統計:

異常捕獲

經過設置Thread.setDefaultUncaughtExceptionHandler,rabbit能夠捕獲java層異常並展現出來:

內存泄漏捕獲

rabbit集成了leakcanary 2.0

apk包分析

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分析結果

須要在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
}
複製代碼
  • type : 上報的數據類型
  • device_info_str : 設備信息, 格式json字符串
  • info_str: 該類型的數據的具體內容, 格式爲json字符串
  • use_time: 應用當前使用時長

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控制面板中你也能夠很方便的控制這些功能:

監控開關設置

快捷功能

查看當前配置

noop包

rabbit目前沒有通過線上環境的驗證,爲了方便接入,提供了noop包。

具體引入步驟見 引入noop包

noop包中能夠繼續使用rabbit的UI功能

代碼結構

rabbit並無使用什麼很特別架構,不過各功能間都使用module的形式作了組件隔離:

後續開發計劃

完善現有功能

rabbit目前提供的功能還比較簡單,接下來會更細緻的完善每個功能來提升可用性。

性能測量模式

rabbit會利用現有的功能來作一個全局的性能檢測並輸出一個檢測分數來評估應用的性能。具體實現邏輯我還在思考中。

管理後臺

客戶端功能作的比較完善後,計劃作一個性能監控後臺(two year late😬)。

貢獻代碼

rabbit目前維護者只有我一我的。 一我的的力量終究有限, 若是你對rabbit有興趣或者感受哪些功能不完善,歡迎提意見! 更歡迎提pr來加入到rabbit的開發中!

最後

既然都看到這裏了, 給 Rabbit 個✨吧 ! 奧 利 給 !

我的公衆微信號:

參考資料

booster

matrix

DoraemonKit

ArgusAPM

fpsviewer

JsonViewer

AndroidPerformanceMonitor

...

相關文章
相關標籤/搜索