github项目地址https://github.com/bravekingzhang/statis-report-framwork-android
项目目的
实现搜集并且上报App性能数据
本来打算自己动手实现一个性能搜集的系统,当然主要是自己之前也研究过一些他人实现的性能搜集相关的开源库,比如说:
https://square.github.io/leakcanary
https://github.com/markzhai/AndroidPerformanceMonitor
@DebugLog
public String getName(String first, String last) {
SystemClock.sleep(15); // Don't ever really do this!
return first + " " + last;
}
V/Example: ⇢ getName(first="Jake", last="Wharton")
V/Example: ⇠ getName [16ms] = "Jake Wharton"
https://github.com/JakeWharton/hugo
hugo可能还需要进行二次开发,且需要手动对方法加@DebugLog才可以实现对方法统计,可能还不具备自动收集的特性,当然也有一个思路,可以借助asm【字节码插装】方式来自动加@DebugLog,然后收集耗时方法上报
其实结合使用https://github.com/JakeWharton/hugo,可以轻松实现监控,就不在赘述。
但是仔细想一想,还是不要轻易动手自己来实现,还是先看看业界有哪些库可以对这个做搜集在说
这不,刚好瞌睡,就有人送枕头,稍微在github上逛一逛就发现了腾讯开发的matrix符合我的性能数据搜集需求:
Matrix-android 当前监控范围包括:应用安装包大小,帧率变化,启动耗时,卡顿,慢方法,SQLite 操作优化,文件读写,内存泄漏等等。
APK Checker: 针对 APK 安装包的分析检测工具,根据一系列设定好的规则,检测 APK 是否存在特定的问题,并输出较为详细的检测结果报告,用于分析排查问题以及版本追踪
Resource Canary: 基于 WeakReference 的特性和 Square Haha 库开发的 Activity 泄漏和 Bitmap 重复创建检测工具
Trace Canary: 监控界面流畅性、启动耗时、页面切换耗时、慢函数及卡顿等问题
SQLite Lint: 按官方最佳实践自动化检测 SQLite 语句的使用质量
IO Canary: 检测文件 IO 问题,包括:文件 IO 监控和 Closeable Leak 监控
而且比较愉快的一点是,matrix是支持IOS的,这意味着我们双端不用对搜集上来的数据做过多的归一化处理。
当然起初也是想着自己撸一个上报系统,主要要考虑的点有:
同样的道理,有了上面找收集系统的经验,不妨在github上在逛一逛看有没有符合需求的或基本符合需求的,一找还真找到一个(https://github.com/luojilab/DataReporter)https://github.com/luojilab/DataReporter,
1. 跨平台,DataReporter是跨平台实现,适用于Android和iOS。
2. 准实时上报,网络状态好,直接上报,网络状态不好在网络转好后上报,同时上报顺序不乱序。
3. 不丢数据,采用mmap实现缓冲区。即使发生应用crash或者进程被杀,数据不会丢失,下次启动会再次上报。
4. 低功耗,采用c++实现,整个上报共用一个线程,多实例多业务场景共用同一线程,当数据全部上报完成后,线程休眠。
5. 高效率,可配置一次上报数据条数。增加上报效率。有效利用网络。减少链接次数。同时采用native方式实现,性能方面更优秀。
看起来也挺符合需求的,而且也是支持IOS的,这就happy了。
嗯,将两个融合在一起,就是这个demo了,demo实现了:
最终实现上报的数据可以参考:NetPost.java中
IssueWrap issue = new GsonBuilder().create().fromJson(out.toString(), IssueWrap.class);
if (issue.getTag().equals(com.tencent.matrix.resource.config.SharePluginInfo.TAG_PLUGIN)) {
// TODO: 2019/10/11 更具类型调用不同的接口上报数据
} else if (issue.getTag().equals(com.tencent.matrix.trace.config.SharePluginInfo.TAG_PLUGIN)) {
} else if (issue.getTag().equals(com.tencent.matrix.trace.config.SharePluginInfo.TAG_PLUGIN_EVIL_METHOD)) {
} else if (issue.getTag().equals(com.tencent.matrix.trace.config.SharePluginInfo.TAG_PLUGIN_FPS)) {
} else if (issue.getTag().equals(com.tencent.matrix.trace.config.SharePluginInfo.TAG_PLUGIN_STARTUP)) {
} else if (issue.getTag().equals(com.tencent.matrix.iocanary.config.SharePluginInfo.TAG_PLUGIN)) {
}
最后看看效果:
上图可以看到由matrix搜集的性能数据,交给了DataReporter进行上报了。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。