ANR以及电量优化
2022-03-01
3 min read
App启动优化分析
1.ANR是什么?
ANR(Application Not Responding)程序未响应,Android系统中如果在预定的时间内未得到有效的响应或响应时间过长,都会产生ANR,程序的响应性由ActivityManager和WindowManager系统服务监视。
2.ANR的产生原因?
- 对于前台服务,则超时为SERVICE_TIMEOUT = 20s;
- 对于后台服务,则超时为SERVICE_BACKGROUND_TIMEOUT = 200s
- 对于前台广播,则超时为BROADCAST_FG_TIMEOUT = 10s;
- 对于后台广播,则超时为BROADCAST_BG_TIMEOUT = 60s;
- ContentProvider超时为CONTENT_PROVIDER_PUBLISH_TIMEOUT = 10s;
- InputDispatching Timeout: 输入事件分发超时5s,包括按键和触摸事件。
注意事项: Input的超时机制与其他的不同,对于input来说即便某次事件执行时间超过timeout时长,只要用户后续在没有再生成输入事件,则不会触发ANR
-
Service超时检测机制:
- 超过一定时间没有执行完相应操作来触发移除延时消息,则会触发anr;
-
BroadcastReceiver超时检测机制:
- 有序广播的总执行时间超过 2* receiver个数 * timeout时长,则会触发anr;
有序广播的某一个receiver执行过程超过 timeout时长,则会触发anr;
- 有序广播的总执行时间超过 2* receiver个数 * timeout时长,则会触发anr;
-
另外:
- 对于Service, Broadcast, Input发生ANR之后,最终都会调用AMS.appNotResponding;
- 对于provider,在其进程启动时publish过程可能会出现ANR, 则会直接杀进程以及清理相应信息,而不会弹出ANR的对话框
3.ANR的定位分析
- 前台ANR发生后,系统会马上去抓取现场的信息,用于调试分析,收集的信息如下:
- 将am_anr信息输出到EventLog,也就是说ANR触发的时间点最接近的就是EventLog中输出的am_anr信息
- 收集以下重要进程的各个线程调用栈trace信息,保存在data/anr/traces.txt文件
- 当前发生ANR的进程,system_server进程以及所有persistent进程
- audioserver, cameraserver, mediaserver, surfaceflinger等重要的native进程
- CPU使用率排名前5的进程
- 将发生ANR的reason以及CPU使用情况信息输出到main log
- 将traces文件和CPU使用情况信息保存到dropbox,即data/system/dropbox目录
- 对用户可感知的进程则弹出ANR对话框告知用户,对用户不可感知的进程发生ANR则直接杀掉
- 分析步骤
- 定位发生ANR时间点
- 查看trace信息
- 分析是否有耗时的message,binder调用,锁的竞争,CPU资源的抢占
- 结合具体的业务场景的上下文来分析
4.电量优化工具
Profiler - NetWork(网络分析),CPU(CPU使用分析,查看当前CPU运行的状态,判断卡顿发生时的状态),Memory(内存使用分析,内存抖动,内存泄漏,OOM的分析)
5.电量优化方案
减少操作,例如数据下载是否每次都需要去更新最新的数据,是否有缓存的必要。
推迟操作,一些耗电操作是否在特定的状态下(电量满或者充电状态下)进行,例如持续的定位
合并操作
DNS的优化:HTTPDNS,可以接入三方提供的dns解析,阿里云HTTPDNS
数据压缩:Ptotobuf