ANR

简介 #

Choreographer 的引入,主要是配合 Vsync ,给上层 App 的渲染提供一个稳定的 Message 处理的时机,也就是 Vsync 到来的时候 ,系统通过对 Vsync 信号周期的调整,来控制每一帧绘制操作的时机. 目前大部分手机都是 60Hz 的刷新率,也就是 16.6ms 刷新一次,系统为了配合屏幕的刷新频率,将 Vsync 的周期也设置为 16.6 ms,每个 16.6 ms , Vsync 信号唤醒 Choreographer 来做 App 的绘制操作 ,这就是引入 Choreographer 的主要作用。

线程状态 #

Java 线程状态 #

定义在 Thread.javaState 枚举中。

状态 说明
NEW(创建) 创建态:当一个已经被创建的线程处于未被启动时,即:还没有调用start方法时,就处于这个状态。
RUNNABLE(运行时) 处于可运行状态的线程正在Java虚拟机中执行,但它可能正在等待来自操作系统的其他资源,例如处理器。
BLOCKED(排队时) 阻塞态:当一个线程试图获取一个对象锁,而该对象锁被其他的线程持有,则该线程进入Blocked状态。当该线程持有锁时,该线程将自动变成RUNNABLE状态。
WAITING(休眠) 休眠态:一个线程在等待另一个线程执行一个(唤醒)动作时,该线程进入Waiting状态。进入这个状态后是不能自动唤醒的,必须等待另一个线程调用notify或者notifyAll方法才能够唤醒。
TIMED_WAITING (指定休眠时间) 指定时间休眠态:基本同WAITING状态,多了个超时参数,调用对应方法时线程将进入TIMED_WAITING状态,这一状态将一直保持到超时期满或者接收到唤醒通知,带有超时参数的常用方法有Thread.sleep、锁对象.wait() 。
TERMINATED (结束) 结束态:从RUNNABLE状态正常退出而死亡,或者因为没有捕获的异常终止了RUNNABLE状态而死亡。

Java 线程状态与 Cpp 线程状态映射 #

Thread.java中定义的状态 Thread.cpp中定义的状态 说明
TERMINATED ZOMBIE 线程死亡,终止运行
RUNNABLE RUNNING/RUNNABLE 线程可运行或正在运行
TIMED_WAITING TIMED_WAIT 执行了带有超时参数的wait、sleep或ioin函数
BLOCKED MONITOR 线程阻塞,等待获取对象锁
WAITING WAIT 执行了无超时参数的wait函数
NEW INITIALIZING 新建,正在初始化,为其分配资源
NEW STARTING 新建,正在启动
RUNNABLE NATIVE 正在在执行JNI本地函数
WAITING VMWAIT 正在等待VM资源
RUNNABLE SUSPENDED 线程暂停,通常是由于GC或debug被暂停
UNKNOWN 未知状态

问题分析 #

问题1 #

20s 内没有执行完生命周期,例如 onCreate

Reason: executing service YourService

Debug 技术 #

CPU 平均负载 #

Load后面的三个数字的意思分别是1分钟、5分钟、15分钟内系统的平均负载。

Load: 3.46 / 2.71 / 1.24

hwui呈现模式分析 #

adb shell setprop debug.hwui.profile [true/visual_bars/false]

Systrace #

https://developer.android.com/topic/performance/tracing/command-line?hl=zh-cn

插桩 #

插桩函数
使用 -a packageName 显示特定应用的插桩信息。

python C:\Users\Administrator\AppData\Local\Android\Sdk\platform-tools\systrace\systrace.py -t 10 -a com.intellyva.liveplayer -o C:\bz_temp\simon.html

https://mugenshenghuo.com/index.php/archives/36.html

https://www.jianshu.com/p/386bbb5fa29a

https://cloud.tencent.com/developer/article/1778496

https://developer.android.com/training/articles/perf-anr.html#anr