所谓『APM』,就是Application Performance Management的简称,我们利用这个系统来对应用的性能、可靠性进行线上的监控和预警的一种机制。现在App的开发技术相对成熟,而提升App的使用体验,就成了不同App之间的一个竞争点。
1、我们可以了解到线上App的实际使用情况,了解到App的奔溃、异常数据,从而针对潜在的风险问题进行预警,并进行相应的处理,例如发布补丁包、调整服务器策略等等。
2、了解App的真实使用信息,还有助于后端服务器了解客户端使用情况,根据不同的策略进行服务端的架构调整,同时有针对性的提高App使用体验,提高用户使用黏性。
APM实际上是一个比较大的工程,这里我们主要讲解客户端的实现,但仅仅是客户端的实现,就已经包含了很多我们需要去解决的问题,例如:混合编程对性能数据采集的影响,采集程序对宿主App的性能影响、侵入程度、可拓展性和可定制性等等,同时Android的碎片化和iOS的一些封闭性,造成了不同设备、不同平台上的数据采集有很多的问题。
另外,APM系统对后端的要求也比较高,例如:数据的采集汇总,分析处理,如果App的用户量比较大,对服务器的压力也是一个比较大的问题,毕竟性能数据的量会比较大。
首先我们来看看『内存』,内存的重要性相信大家毋庸置疑,它是对App性能的一个综合性反映,通常我们会考虑到『内存峰值、内存均值、内存抖动、内存泄漏』这样几个方面,这几个考量维度综合反映了App在对象操作、内存使用是否合理、精简内存以及在内存泄漏上的处理是否恰当。
在Android中,我们可以通过Runtime来获取当前App所分配的内存信息,这也是获取实际内存信息最准确的方法。另外,我们还可以借助『LeakCanary』来帮助我们分析内存泄漏,将它集成到我们自己的APM系统中,获取它的内存泄漏信息。
『CPU』也是大家非常关心的一个方面,他主要影响了App的发热和卡顿,我们主要通过『CPU峰值、CPU均值』来评判一个App对CPU的优化程度,在Android中,我们可以通过读取/proc目录下的CPUInfo来获取CPU的一些性能信息。
『启动时间』是大家比较容易忽视的一个点,现在App接入的第三方SDK越来越多,大部分都需要在Application中进行初始化操作,这就会极大的拖慢启动时间,这也是我们优化的重点,关于App的启动优化,大家可以参考这篇文章http://blog.csdn.net/eclipsexys/article/details/53044990。
另外,启动优化也包括了页面的启动时间的考量,也就是页面的渲染时间,在Android中,我们可以通过Choreographer和Activitylifecyclecallbacks来进行监听,同时,对于一些关键信息,通过使用AOP,我们可以获取更加详细的信息。
『UI性能』实际上在前一页中已经有所体现了,除了前面考量的页面渲染性能外,我们对于『UI重绘、滚动帧率、页面ANR』也要进行详细的评测。这些东西,我们可以借助开发者选项中的相关内容来进行测试。
『耗电量』实际上是App性能的一个上层表现,通过batteryhistorian我们可以在内测阶段,分析App的耗电异常,在线上,通过监控App的使用和耗电,及时排除可能存在的异常。
『网络性能』是一个App看不见的体验,国内网络环境错综复杂,要面对各种流量劫持和各种不稳定因素,所以,对于网络接口性能,也是我们非常关注的点,例如『复杂网络环境、接口往返时间、接口数据异常、CDN、服务器异常』这些都是我们需要考虑的。
那么为了保证在使用APM系统的时候,能够降低接入的成本,所以这块我们通过AOP方式来进行注入,避免大范围的改动。
『用户行为路径』按道理来说并不算是APM的范畴,但是通过用户行为路径的分析,我们可以针对用户访问量大的内容进行集中力量的优化,有助于提高我们优化的效率。
APM系统监控的方式主要有两种,在内部测试阶段,我们使用『PC端性能检测,它不影响性能,无需侵入代码,可测试竞品,但是需连接ADB』,在线上阶段,我们使用『客户端性能检测SDK,它不受设备限制、可进行场测,但对宿主App代码有侵入、性能有一定影响』。
有了采集的性能数据,我们就可以对数据进行分析和展示了,对于这块,后端其实有很多成熟的方案,很多类似的数据展示图表控件,这里只举几个例子。
图表~~
这是借助ELK平台做的展示。ELK平台是一个非常好的数据展示框架,详细内容大家可以参考这篇文章http://blog.csdn.net/eclipsexys/article/details/53364480。
前面我们了解了现有APM系统的一些内容,当然,APM系统也是个与时俱进的系统,在现有的基础内容上,我们还能做很多事,例如『AI分析数据Pattern、本地异常数据监控算法、异常数据预警机制、服务端指令控制』,这些也是我们后面的奋斗目标。
问答环节~
1、在省电节能方面,到底要怎么做
省电这一块 主要是需要控制wakelock的使用。控制无谓的CPU运行和计算 这些内容都可以通过BatteryHistorion来进行查看
2、监控会不会很费流量?
流量的话是一个考虑的因素,我们可以通过不同的策略来进行管理 比如 在WIFI情况下上传。同时 使用pb等高压缩协议来进行流量的优化
3、现在不是都流行无埋点技术,这方面有什么不一样
无痕埋点 主要是为了解决用户行为数据和业务行为数据 和性能不太一样
4、在频繁定位的情况下,如何达到省电节能呢
频繁定位类的App 确实是耗电大户,可以在非必须的情况下,采用缓存数据,或者通过简化业务流程的情况下来进行优化
5、做视频下载那块时,当用户一次性选择几百个下载任务下载时,这时候界面会停留很久,等待添加下载任务的完成,请问这块可以从哪些方面优化?
一次几百个下载,这种确实很难优化,毕竟CPU是死的,有CPU运算,就会耗电,可以尽量将这些任务后台化
6、如果有app申请wakelock不释放,系统有什么好的应对策略么,如果我们自己就是系统的话,医生大神会有什么好的建议让系统怎么做呢
作为上层App,你只能控制自己的WakeLock 其它App的耗电,交给系统去处理吧,大部分wakelock造成的问题 都是异常流程没有考虑清楚导致的 。**作为系统开发者,可以给出提示,让用户来操作 或者Kill这些耗电进程
7、如果本地的应用产生bug崩溃了,这种要怎么监控到呢?
本地的异常、崩溃信息,Android有专门的接口可以拿到 收集这些数据后上传,用于分析。android提供了UncaughtExceptionHandler来帮助你处理崩溃
最后推荐一本书
性能优化的具体代码和操作分析方法《Android群英传 神兵利器》