安卓性能优化
1. 前言
ANR分析主要是通过查看/data/anr
下的log,分析主线程堆栈
、cpu
、锁信息
等。但是这种方法有一定的局限性,很多时候是没有办法查看堆栈信息的,例如有些高版本设备需要root权限才能访问/data/anr/
目录。这时候就需要应用来实现卡顿、ANR、死锁的监控方案。
2. 卡顿原理
一般,主线程有耗时会导致卡顿,如果卡顿超过阈值,就会触发ANR。 应用进程启动的时候,Zygote
会反射调用 ActivityThread
的 main
方法,启动 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的
queue.next()
阻塞。 - 注释3的
dispatchMessage
耗时太久。