issues
search
fWX228941
/
project
all by myself
1
stars
0
forks
source link
ANR
#35
Open
fWX228941
opened
5 years ago
fWX228941
commented
5 years ago
引起ANR问题的根本原因
应用进程自身引起的,主线程阻塞、挂起、死循环,应用进程的其他线程的CPU占用率高,使得主线程无法抢占到CPU时间片。
其他进程间接引起,当前应用进程进行进程间通信请求其他进程,其他进程的操作长时间没有反馈,其他进程的CPU占用率高,使得当前应用进程无法抢占到CPU时间片。
fWX228941
commented
5 years ago
分析
进程的虚拟机实例接收到SIGNAL_QUIT信号后会由"Signal Catcher"线程将进程中各个线程的函数堆栈信息输出到traces.txt文件中. /data/anr/traces.txt
看开头就知道是哪一个进程发生ANR,当前运行的其他进程也会把当前的函数堆栈信息输出到traces.txt文件中, 但发生ANR的进程正常情况下会第一个输出,所以一般情况下我们只看traces.txt的开头就行了.
分析CPU负载和CPU使用率.如果CPU使用量接近100%,说明当前设备很忙,有可能是CPU饥饿导致了ANR,如果CPU使用量很少,说明主线程被BLOCK了
traces 文件只能查看最新一次的ANR 至于老的ANR消息只能在DB文件中查看./data/system/dropbox”是DB指定的文件存放位置.
ANR:Application Not Responding,即应用无响应,android系统自身的一种检测机制.
KeyDispatchTimeout(5 seconds) –主要类型按键或触摸事件在特定时间内无响应.在系统输入管理服务进程(InputManagerService)中有一个线程(InputDispathcerThread)专门管理输入事件的分发,在该线程处理输入事件的过程中,回调用InputDispatcher对象方法不断的检测处理过程是否超时,一旦超时,则会通过一些列的回调调用InputMethod对象的notifyANR方法,其会最终出发AMS中handler对象的SHOW_NOT_RESPONDING_MSG这个事件,显示ANR对话框。
BroadcastTimeout(10 seconds) –BroadcastReceiver在特定时间内无法处理完成.只有有序(ordered)的广播才会发生超时,而在AndroidManifest中注册的广播都会被当做有序广播来处理,会被放在广播的队列中串行处理。AMS在处理广播队列时,会设置一个超时时间,当处理一个广播达到超时时间的限制时,就会触发BroadcastQueue类对象的processNextBroadcast方法来判断是否超时,如果超时,就会终止该广播,触发ANR对话框。
ServiceTimeout(20 seconds) –小概率类型 Service在特定的时间内无法处理完成
只有应用的主线程响应超时才会导致ANR,超时时间(Timeout):导致ANR的原因不同,系统限定的时间也不同,但只要超过时间上闲,系统就会发出Signal 3,产生ANR。
fWX228941
commented
5 years ago
怎么避免
耗时的工作(比如数据库操作,I/O,连接网络或者别的有可能阻碍UI线程的操作)把它放入单独的线程处理
尽量用Handler来处理UIthread和别的thread之间的交互
广播中如果有耗时操作,建议放在service中去执行,或者通过handlerThread分发执行。
fWX228941
commented
5 years ago
cpu占用率
ologcat中Load1(Load: 0.42 / 0.27 / 0.25,即cpu平均负载),各个进程总的CPU时间占用率,用户CPU时间占用率,核心态CPU时间占用率,以及iowait CPU时间占用率
在system日志里面输入 ActivityManager: ANR,搜索“Dalvik Thread”关键词,快速定位到本应用程序的虚拟机信息日志
引起ANR问题的根本原因