背景
终于跑出来anr了 跑了一个多小时monkey吧。
包含信息在哪里
/data/anr
可以通过adb拉取
adb pull /data/anr
普通权限就能拉,不需要root
拿到文件之后,找自己的进程信息,通常是这样的
----- pid 15569 at 2022-01-05 14:42:24 -----
Cmd line: com.demo.debug
从这个信息开始,下面知道end都是当前发生车祸的信息。
"main" prio=5 tid=1 WaitingPerformingGc
| group="main" sCount=1 dsCount=0 obj=0x7530a4a0 self=0xb2784400
| sysTid=15569 nice=-10 cgrp=default sched=0/0 handle=0xb5557534
| state=S schedstat=( 715323310615 25399745098 329313 ) utm=64845 stm=6687 core=3 HZ=100
| stack=0xbe5ed000-0xbe5ef000 stackSize=8MB
| held mutexes=
native: #00 pc 000173f4 /system/lib/libc.so (syscall+28)
native: #01 pc 000b6e49 /system/lib/libart.so (_ZN3art17ConditionVariable16WaitHoldingLocksEPNS_6ThreadE+92)
native: #02 pc 0019fa7b /system/lib/libart.so (_ZN3art2gc20ClearedReferenceTask3RunEPNS_6ThreadE+210)
native: #03 pc 0019f977 /system/lib/libart.so (_ZN3art2gc18ReferenceProcessor24EnqueueClearedReferencesEPNS_6ThreadE+174)
native: #04 pc 0019364b /system/lib/libart.so (_ZN3art2gc4Heap22CollectGarbageInternalENS0_9collector6GcTypeENS0_7GcCauseEb+2410)
native: #05 pc 000665e7 /data/dalvik-cache/arm/system@framework@boot.oat (Java_java_lang_Runtime_gc__+74)
at java.lang.Runtime.gc(Native method)
at java.lang.System.runFinalization(System.java:1477)
at android.os.StrictMode.decrementExpectedActivityCount(StrictMode.java:2278)
at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4211)
at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:4222)
at android.app.ActivityThread.-wrap6(ActivityThread.java:-1)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1539)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6121)
at java.lang.reflect.Method.invoke!(Native method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802)
这是我这次车祸的现场。
从堆栈信息可以看到,performDestroyActivity
然后下一步跑到StrictMode
? 这玩意叫严苛模式
,或者严格模式
,不知道可以去查查。
我懵逼,我有打开这个?
去application
中找下,反正代码不是我写的,前辈们写的。
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork()
.penaltyLog()
.build());
在onCreate
中找到这个,emmmm,而且还不区分release。也就是以前的版本发布出去的也是打开严苛模式的。这。。。。。。。。。。
找到了,既然开了,那就看看配置了什么。
detectDiskReads
,detectDiskWrites
,磁盘读写 detectNetwork
,网络 惩戒:penaltyLog
,打log。
Keeping disk and network operations off the main thread makes for much smoother, more responsive applications. By keeping your application’s main thread responsive, you also prevent ANR dialogs from being shown to users.
所以很大可能是在act销毁做了一些耗时的操作,触发gc,一直在等。且符合上面3个情况,其实是2个的一种。
但是我不知道发生的时候处于那个act,logcat信息没有了,在trace中也没有看到有关信息。
能做的事情就是,可能我要一个个页面去看onDestroy的实现了。
but,我不想看