Skip to content

安卓性能优化

1. 前言

ANR分析主要是通过查看/data/anr下的log,分析主线程堆栈cpu锁信息等。但是这种方法有一定的局限性,很多时候是没有办法查看堆栈信息的,例如有些高版本设备需要root权限才能访问/data/anr/目录。这时候就需要应用来实现卡顿、ANR、死锁的监控方案。

2. 卡顿原理

一般,主线程有耗时会导致卡顿,如果卡顿超过阈值,就会触发ANR。 应用进程启动的时候,Zygote 会反射调用 ActivityThreadmain 方法,启动 loop 循环。

ActivityThread

java
public static void main(String[] args) {
      ...
    Looper.prepareMainLooper();
    Looper.loop();
    ...
}

Looper的loop方法

java
public static void loop() {
      for (;;) {
            //1、取消息
            Message msg = queue.next(); // might block
            ...
            //2、消息处理前回调
            if (logging != null) {
                logging.println(">>>>> Dispatching to " + msg.target + " " +
                        msg.callback + ": " + msg.what);
            }
            ...

            //3、消息开始处理
            msg.target.dispatchMessage(msg);// 分发处理消息
            ...

            //4、消息处理完回调
            if (logging != null) {
                logging.println("<<<<< Finished to " + msg.target + " " + msg.callback);
            }
       }
       ...
}

由于loop循环存在,所以主线程可以长时间运行。如果想要在主线程执行某个任务,唯一的办法就是通过主线程Handler post一个任务到消息队列里去,然后loop循环中拿到这个msg,交给这个msg的target处理,这个target是Handler。

从上面看,导致卡顿的原因可能有两个地方:

  1. 注释1的queue.next()阻塞。
  2. 注释3的dispatchMessage耗时太久。

Released under the MIT License.