本文为现代化 Android 开发系列文章第七篇。

完整目录为:

  • 现代化 Android 开发:基础架构
  • 现代化 Android 开发:数据类
  • 现代化 Android 开发:逻辑层
  • 现代化 Android 开发:组件化与模块化的选择
  • 现代化 Android 开发:多 Activity 多 Page 的 UI 架构
  • 现代化 Android 开发:Jetpack Compose 最佳实践
  • 现代化 Android 开发:功能监控(本文)

功能优化是开发永久绕不过的论题,也是通往高手的必经之路。但功能优化的前提是搭建了完善的功能监控体系,大公司都会投入人力建设完善的 APM 监控体系,而小公司则更多的只能运用大公司供给的渠道与 SDK,乃至由于事务压力,往往也没有时刻去搞什么功能优化。所以说这方面的生长,那得后退几年,在大公司才有时机得到训练。而现在,该有的 APM 体系都有了,现已是维护为主了。对外的 SDK 与渠道都在想方设法收点费了,小公司能够看数据剖析的当地就更少了。

假如是学习的话,那么极客时刻上张绍文大佬的《Android开发高手课》便是十分推荐的学习资源了,溃散、内存、IO、存储、网络、发动、包体积、UI等方方面面都有讲得很深。而且大佬是十分重视线上监控的,力求做到问题早暴露、早处理。

作为事务开发的我,当然不是讨论各个底层的完成,而是利用各种库和东西来完成自己的监控意图,所以本文首要讨论的事务层能够运用哪些东西。

上报

各大渠道供给大而全的 SDK,则是采集-上报-剖析一条龙的都承包了,关于运用端而言则是几句代码的事了,所以它点费也是理所应当,不过,小公司,非必要,给钱是不或许给钱的了。所以我在 emo 中开发了通用的上报库 report,封装了当即上报、批次上报等行为逻辑,后端能够运用 Prometheus,这便是把监控也作为事务数据上报的一部分。而由于 report 是一个通用的上报库,运用者需求自定义数据协议,所以 emo 之前规划的一个开展便是定制各种监控的数据协议,和后端供给配套的 docker,不过也只是有心而无力,没这个排期。

Crash

CrashANROOM 应该是最受重视的监控目标,java 层的 crash 好捕捉,难的是 native 层的反常,难以捕捉,而且或许捕捉不到,所以往往为了获取详细的 crash 信息,大家都或许会一起接入几个 SDK 去监控。现在比较通用的或许仍是 Bugly,究竟免费。但 AndroidSDK 现在做得最好的或许是爱奇艺开源的 xCrash,假如想要学习的话,阅览它的源码,应该是一个十分好的手段。

Bugly 额定增加日志文件支撑得不是很好,可是许多 crash,咱们往往要去日志中去寻求反常原因。所以现在我自己的反常上报计划便是运用 xCrash,在 crash 时把日志也上报一份。

除此之外,官方也在 Android 11 供给了 App Exit Reasons 这个 API, 用于咱们获取用户是由于什么状况退出运用的,现在,应该干流的手机都升级到 11 以上了吧,所以它也能够用起来了,而且它的 reason 还包括 REASON_LOW_MEMORYREASON_EXCESSIVE_RESOURCE_USAGE 等很多原因,作为数据剖析,也是十分有用的。

内存走漏

内存走漏现在的干流剖析东西便是 LeakCanary 了,所以 App 怎样也得接入下,这个也是面试官十分喜欢问的问题了,属于面试必备了,了解下其完成原理也是很有必要的。

网络监控

网络监控首要是两个点,一个是上下行流量的监控,避免开发写了有问题的代码,出现在循环内张狂请求后台的状况,除了会给后台压力,也简单被用户投诉。emonetwork 做了一个简易的上下行流量的采样,能够一段时刻采样一次,看是否出现突发流量的状况。

另一个便是网络连接稳定、耗时的监控了,由于现在基本上都是 OKHttp 了,所以直接运用它供给的 EventListener 就满足用了,就能够把 ssl 握手时刻、dns 时刻、connect 时刻等都计算下来。网络请求一般是十分多的,一般客户端需求先聚合下再上报给后台。

卡顿监控

卡顿监控,曾经基本上便是以下两种计划:

  • Choreographer 回调
  • Looper 自定义 Printer

咱们能够运用微信的 Matrix 来监控卡顿,其完成计划是基于 Looper 来做的。

后面体系供给了 FrameMetrics 接口,然后 jetpcak 开发了库 Metricsjetpack 的完成确保了良好的兼容性,可惜现在稳定版还没到来,估计今后它便是干流了。

发动监控

发动优化也是一个重要的论题,假如首次发动时刻久了,用户或许就抛弃运用了。Google Play 能够选用大杀器 Baseline Profile 来优化运用首次装置后的发动时刻。而国内的厂商到现在都没有追随一下的意思,所以发动耗时就依赖于事务层的改进,把能晚点初始化的东西就晚点初始化。

微信的 Matrix 也供给了发动耗时的监控,用就行了。

体系也供给了 reportfullydrawn 方法,能够由事务方来告诉体系我的数据加载完成了,从而能够陈述发动到真正界面可用的时刻。不过这个是为了官方供给的剖析东西用的,不能直接用于线上监控。

最后

Matrix 除了上面提到的这些,还包括了:慢方法检测、APK 剖析、 SQLite 查看、电脑优化、内存重复图片检测、IO 检测等等。假如是国外市场,那就能够运用官方的各种诸如 Firebase Crashlytics 服务了。

假如是真的想学习这些技能,那就去看 xCrashLeakCanaryMatrix 源码,一切的常识尽含其间。但需求巨额的时刻投入。不过现已被作业压榨得喘不过气,又哪来的闲余时刻呢?大伙都在事务上卷得你死我活的,这种功能优化总会被无限期延迟,也就永久没有实践的时机。

总是背负着无尽的技能债,跪倒在一次又一次的需求改变前,过着大负大跪的程序员生活,偶尔翻看下被丢掉的计算机基础常识,以求温故知薪。

现在这个系列文章就写到这儿了,之后会继续更新一些技巧与细节的讨论与思考,诸如 Compose 跨页面通讯、Text 行高改变等常识。