当前位置:   article > 正文

android 查看大图_Android 开源 | 新一代Android 性能监控框架Rabbit

android 性能监控 rabbit 使用

1c18bf0c9973a3560d080a003786322e.png

rabbit 是一个Android APM框架(工具), 它不仅可以让开发者很方便的在本地对App做性能监控,
也提供了完整的数据上报系统。目前包含的主要功能如下图:

5d02dced339e019b7d625268865168c5.png

本文将对rabbit的功能做一个简单的介绍,详细的使用文档地址: 使用文档

多图警告⚠️⚠️⚠️

功能介绍

应用测速

通过编译时代码插桩, rabbit可以非常方便的统计应用的冷启动时间与页面渲染时间。测速统计的关键时间点定义如下图:

d02af4c613d5bee117c19d31140ceef0.png

应用启动耗时统计

在对应用主页进行配置后,rabbit可以统计出如下图所示的冷启动耗时:

67cc01ba21a6f036bd7d0a113687ec0e.png

页面渲染与网络请求耗时统计

与网络请求耗时结合后,rabbit可以统计出一个页面的完全渲染耗时。这里的完全渲染耗时是指:从页面create到页面拿到请求结果并刷新页面所用的时间。核心思想参考自:Android自动化页面测速在美团的实践,最终统计的页面耗时如下图所示:

ae2c368212195fd4abd1f5c1b54da688.png

慢函数检测

基于编译时代码插桩, rabbit可以准确的统计每一个函数的耗时,并筛选出慢函数

慢函数定义为: 在主线程消耗时间超过一定阈值的函数(rabbit也支持配置检测其他线程的慢函数)。

rabbit支持分包检测慢函数:

e0ae8a45e92c3bf37a2bf3bc6d0deeb1.png

支持查看每一个包下的慢函数列表以及每一个慢函数的堆栈:

f31933edc8711e76025318131c9fc749.png

9c3eac9a121cddf0271f61ab6d529435.png

代码扫描

通过提供给rabbit一份代码扫描列表,rabbit可以在编译时扫描出这些代码调用的位置。默认会扫描一些阻塞代码, 比如下面这种:

SharePreferences$Editor.commit()

最终扫描结果会展示如下:

e94621b4273b1d1d095986498ad4b40f.png

点击右上角导出按钮可以把扫描结果以json的形式导出到SD卡中。

网络日志监控

rabbit可以记录网络请求日志并方便的查看返回的json数据:

fc458f4017e09ece4c3f20dd618ac28c.png

卡顿日志监控

rabbit通过Choreographer来检测主线程的运行情况,并异步采集主线程堆栈来还原卡顿现场。

对于下面代码:

Thread.sleep(2000)

rabbit会获得如下的卡顿采集结果:

c6ce35fd8262dc784601d22268cfa748.png

FPS分析

rabbit会在主线程looper运行时计算主线程FPS并实时的显示出来:

b94b9f066b6d4c030f68f24159dc678d.png

rabbit支持分页面分析FPS:

a517b264411dd947ae23b4bcbffb1d33.png

内存分析

功能类似于FPS分析,rabbit支持实时显示内存使用情况并分页面分析内存占用情况:

016eee2d211b783d5a27e8744807e696.png

分页面内存统计:

c22e2d9a7497f6ff468c3e1db8efa2a6.png

异常捕获

通过设置Thread.setDefaultUncaughtExceptionHandler,rabbit可以捕获java层异常并展示出来:

b2f7232942c6e27d4b42d4b11e69c6ab.png

内存泄漏捕获

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文件位置等信息:

  1. {
  2. "apkPath":"xxxx/app-Release.apk",
  3. "methodGroup":[{
  4. "name":"xxx",
  5. "package":"com.xxx.xx"
  6. }],
  7. "classMappingFilePath":"xxx/xxx.txt",
  8. "maxImageSizeKB":30
  9. }

最终分析结果会输出到一个json文件中:

apk-analyzer-result.json
  1. {
  2. "AppInfo": {
  3. "versionCode": "1004000",
  4. "versionName": "1.4.0",
  5. "appSize": "21.51 MB"
  6. },
  7. "BigImageRes": [
  8. {
  9. "name": "assets/flutter_assets/images/icons/xxLogo.png",
  10. "size": "76.73 KB"
  11. }
  12. ...
  13. ...
  14. ],
  15. "ApkCompose": [
  16. {
  17. "type": "so",
  18. "totalSizeStr": "8.05 MB"
  19. },
  20. {
  21. "type": "dex",
  22. "totalSizeStr": "6.54 MB"
  23. }
  24. ...
  25. ...
  26. ],
  27. "DuplicatedFile": [
  28. {
  29. "files": [
  30. "res/drawable-xxhdpi-v4/bg_home_water_ripple.webp",
  31. "res/drawable-xxhdpi-v4/bg_keyboard_shadow_line.webp"
  32. ],
  33. "fileSize": "",
  34. "md5Value": "d41d8cd98f00b204e9800998ecf8427e"
  35. }
  36. ....
  37. ],
  38. "MethodCount": {
  39. "total-count": 127732,
  40. "com.xxx.xx": 14800,
  41. "other-pkg": 112932
  42. }
  43. }

上报APK分析结果

需要在apk-analyzer-config.json中配置上报路径:

  1. {
  2. "apkPath":"xxxx/app-Release.apk",
  3. ...
  4. "uploadPath":"xxxxxx/upload"
  5. }

上报的数据格式与rabbit的基本上报数据格式保证一致:

数据上报

rabbit目前支持上报大部分检测数据。通过一些简单的配置就可以把检测数据上报到后台。rabbit数据上报的基本格式如下:

  1. {
  2. "device_info_str": "{....}",
  3. "info_str": "{...}",
  4. "time": 1577775888933,
  5. "type": "fps_info",
  6. "use_time": 19
  7. }
  • type : 上报的数据类型
  • device_info_str : 设备信息, 格式json字符串
  • info_str: 该类型的数据的具体内容, 格式为json字符串
  • use_time: 应用当前使用时长

rabbit提供了上报回调,可以通过这个回调很方便的来实现自定义的上报逻辑:

  1. rabbitConfig.reportConfig.dataReportListener = object :RabbitReportConfig.DataReportListener{
  2. override fun onPrepareReportData(data: Any, currentUseTime: Long) {
  3. //接入自己的上报逻辑
  4. }
  5. }

自定义面板

rabbit向外提供了UI扩展API,使用这些API可以很方便的把应用的“后门“放到rabbit中。

具体操作见 : 在rabbit中自定义页面

可用性与可配置性

rabbit的接入十分简单, 基本上就是一个init代码:

Rabbit.init(rabbitConfig)
相关支持配置见:RabbitConfig。

对于每一个功能,rabbit都提供了丰富的配置API和详细的使用文档。

在rabbit控制面板中你也可以很方便的控制这些功能:

监控开关设置

24c589360ceec3509f780c90c08618d8.png
快捷功能

f3c2eb37e333adcc3380a1e5563b3ef4.png
查看当前配置

6db7fd4989fb24a694cb7bd9697c0972.png

noop包

rabbit目前没有经过线上环境的验证,为了方便接入,提供了noop包。

具体引入步骤见 引入noop包

noop包中可以继续使用rabbit的UI功能

代码结构

rabbit并没有使用什么很特别架构,不过各功能间都使用module的形式做了组件隔离:

e8828ae0b5d007efcf7e2051472d07b1.png

后续开发计划

完善现有功能

rabbit目前提供的功能还比较简单,接下来会更细致的完善每一个功能来提高可用性。

性能测量模式

rabbit会利用现有的功能来做一个全局的性能检测并输出一个检测分数来评估应用的性能。具体实现逻辑我还在思考中。

管理后台

客户端功能做的比较完善后,计划做一个性能监控后台(two year late )。

贡献代码

rabbit目前维护者只有我一个人。 一个人的力量终究有限, 如果你对rabbit有兴趣或者感觉哪些功能不完善,欢迎提意见! 更欢迎提pr来加入到rabbit的开发中!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/341339
推荐阅读
相关标签
  

闽ICP备14008679号