ANR以及电量优化

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;
  • 另外:

    • 对于Service, Broadcast, Input发生ANR之后,最终都会调用AMS.appNotResponding;
    • 对于provider,在其进程启动时publish过程可能会出现ANR, 则会直接杀进程以及清理相应信息,而不会弹出ANR的对话框

3.ANR的定位分析

  1. 前台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则直接杀掉
  1. 分析步骤
    1. 定位发生ANR时间点
    2. 查看trace信息
    3. 分析是否有耗时的message,binder调用,锁的竞争,CPU资源的抢占
    4. 结合具体的业务场景的上下文来分析

4.电量优化工具

Profiler - NetWork(网络分析),CPU(CPU使用分析,查看当前CPU运行的状态,判断卡顿发生时的状态),Memory(内存使用分析,内存抖动,内存泄漏,OOM的分析)

5.电量优化方案

减少操作,例如数据下载是否每次都需要去更新最新的数据,是否有缓存的必要。
推迟操作,一些耗电操作是否在特定的状态下(电量满或者充电状态下)进行,例如持续的定位
合并操作
DNS的优化:HTTPDNS,可以接入三方提供的dns解析,阿里云HTTPDNS
数据压缩:Ptotobuf

阿里Mavne