关于Android发展至今,在各项功能十分成熟的情况下,我们越来越重视App的性能优化,以及用户体验,这关乎一个线上应用的DAU持续增长的基础,以及用户口碑的问题,今天刘某人带大家来一起分析一下崩溃/卡顿/ANR/OOM/启动慢等问题是如何解决的,以及使用友盟性能监控平台U-APM的便捷。
一.启动慢/白屏/黑屏优化
我们在应用开发的时候,常常会提前初始化一些数据和功能,来保证用户使用的过程中,不会产生额外的停留,等待时间,那么当一个项目十分庞大的时候,初始化的数据也非常的多,另外由于设备的性能,渲染的机制等各种原因,时常会出现启动慢导致白屏,黑屏等情况,基于此情况,我们来看下如何解决。
1.修改主题/背景图
我们先来看下Activity的结构
负责更新界面的应用主线程无法处理用户输入事件或绘制操作,这样会引起用户的不满,所以系统会根据当前的场景等待,等待超时则停止响应,一般以下几种情况会导致ANR。
- 1.当您的 Activity 位于前台时,您的应用在 5 秒钟内未响应输入事件或 BroadcastReceiver(如按键或屏幕轻触事件)。
- 2.虽然前台没有 Activity,但您的 BroadcastReceiver 用了相当长的时间仍未执行完毕。
Android 提供了一些方式来帮助我们分析出问题,详情可以查看下官方的文档
https://developer.android.google.cn/topic/performance/vitals/anrl=zh-cn
当然,关于线上的App出现问题,我们就需要借助友盟的U-App来采集日志,才方便我们分析问题,使用方法见下文。
3.OOM
OOM内存溢出,出现的情况大多数是在引用图片上出的问题,全称“Out Of Memory”,最常见的OOM情况有以下三种:
- java.lang.OutOfMemoryError: Java heap space
- java堆内存溢出,此种情况最常见,一般由于内存泄露或者堆的大小设置不当引起。对于内存泄露,需要通过内存监控软件查找程序中的泄露代码,而堆大小可以通过虚拟机参数-Xms,-Xmx等修改。
- java.lang.OutOfMemoryError: PermGen space
- java永久代溢出,即方法区溢出了,一般出现于大量Class或者jsp页面,或者采用cglib等反射机制的情况,因为上述情况会产生大量的Class信息存储于方法区。此种情况可以通过更改方法区的大小来解决,使用类似-XX:PermSize=64m -XX:MaxPermSize=256m的形式修改。另外,过多的常量尤其是字符串也会导致方法区溢出。
- java.lang.StackOverflowError
- 不会抛OOM error,但也是比较常见的Java内存溢出。JAVA虚拟机栈溢出,一般是由于程序中存在死循环或者深度递归调用造成的,栈大小设置太小也会出现此种溢出。可以通过虚拟机参数-Xss来设置栈的大小。
我们通常使用heapdump来分析内存的波形查找问题,当然,我们也可以先采集日志,见下文
三.U-APM
1.集成
我们可以使用友盟的APM先把日志采集了,便于我们解决问题,U-APM是在原U-App 稳定性分析基础上全新升级的独立产品,所以已计入的同学直接升级即可:https://at.umtrack.com/LrKb0f
1.我们首先在project的build.gradle中添加友盟的仓库,如图示代码
3.添加权限
好的,一切准备就绪,我们就可以来模拟下错误的采集了,但是要注意,APP_KEY是需要自己去申请的,而APP_CHANNEL对应的是渠道标记,如果没有多渠道,可以无视,如果有多渠道的打包和统计,那么传入对应渠道名即可。
2.使用
来到友盟APM管理平台
可以看到,实时显示,并且抓到的日志是比较精准的,我们来看下详情

这样就大功告成了,再有崩溃,ANR,OOM都能捕捉到了,而且可以基于友盟的基础能力,我们可以实时统计日活,事件上 等功能,还是蛮不错的。
当然,采集到日志,包括检测到异常,我们拿到日志,都是要自己分析的,这个分析的过程,还是需要个人的经验,以及细心和耐心,解决Bug的道路是枯燥且乏味的,静下心来,才能体验代码之美。
文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览91459 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!