android-cn / android-discuss

Android 问题交流讨论坛, 微信公众号:codekk, 网站:
https://github.com/android-cn/android-discuss/issues
Apache License 2.0
4.08k stars 536 forks source link

[问答]如何检测主线程为何sleep? Skipped 2027246 frames! #644

Open dede1314 opened 7 years ago

dede1314 commented 7 years ago

现在在做一个行业定制的app。就是一个APP 始终运行在前台,充当控制终端。 系统是4.4。不需要再其他系统上运行,故没有在其他系统上运行。

在长时间运行基本的逻辑情况下(左右运动的属性动画和时间的变换 setText的方式),会界面卡死,此时不会输入任何应用相关的日志。从正常到界面卡死的时间不定,有时候一个小时就卡死了,有时候一两天还是正常的。 界面会一直卡,只有当连上adb 时会自动恢复,动画和时间开始动,后台log开始正常打印。

使用过WatchDog和BlockCanary,都不能有效解决。

现在判断是主线程被阻塞了,连上adb 查看线程pid 还是原来的pid。如果此时点击屏幕,会出现输入事件无响应的ANR。

正常的log最后如下: dalvikvm(26456): GC_FOR_ALLOC freed 2599K, 51% free 8365K/17032K, paused 61ms, total 62ms

阻塞后恢复正常的日志如下: 08-23 08:11:22.924 E/jdwp (26456): Failed sending b-req to debugger: Connection reset by peer (-1 of 52) 08-23 08:11:22.934 D/dalvikvm(26456): Debugger has detached; object registry had 1 entries 08-23 08:11:22.944 I/Choreographer(26456): Skipped 2027246 frames! The application may be doing too much work on its main thread.

但现在并没有发现主线程阻塞的地方。有内存泄漏,但应该不是导致这个问题出现的原因。

如何去检测主线程阻塞在何处?或者对这个问题有什么解决思路吗? 公司自己编译的rom。可以改动framework层加日志?但没有思路,不知道加在何处?

xmlxin commented 7 years ago

为什么要始终在前台呢,起个后台服务也可以啊

dede1314 commented 7 years ago

行业定制,就是说类似于商户的手持收款机一样,保持app 始终在前台运行。因为不会运行其他的应用。而我们的应用使用频率很高,因此保持始终在前台运行。

laiyuanwen commented 7 years ago

ARN不是有一个trace.txt日记的吗,看看能不鞥从这个日记中找到一下报错信息。 我记得我之前在使用Thread.sleep("100000")模拟一个ANR的Demo的时候,可以通过trace.txt找到阻塞的代码行信息。

catroom commented 7 years ago

用blockcanary监测下?

echojiangyq commented 7 years ago

注释掉业务逻辑,只加载ui,看看还会不会卡死,一点一点缩小范围,确认是哪里引起的问题。

dede1314 commented 6 years ago

@catroom blockcanary 和ANRwatchdog 都检测不到。

dede1314 commented 6 years ago

@helloworldwen 这个现象没有产生trace 文件。 如果去点击就会产生ANR。这个时候才有trace生成。界面卡住的时候没有产生ANR.

jp1017 commented 6 years ago

ANRwatchdog 都检测不到

这就尴尬了,坐等方案 @dede1314