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 个✨吧 ! 奥 利 给 !
我的公众微信号:
参考资料