ANR优化实践


用简单通俗易懂的话和可执行方式来学习ANR

1.为什么设计ANR机制

从用户角度,当界面/事件处于长时间阻塞,给用户弹框以提示,提高用户良好体验感。
从开发者角度看,用于监控应用的性能,并进行性能异常提示。
Android系统设计的一套监控界面线程处于流畅

2.ANR是什么

在这里插入图片描述

2.1 定义

ANR全称Applicatipon No Response,应用无响应。

2.2 表象

页面长时间无响应时, 系统层面会弹出上图那样的ANR对话框。

2.3 本质

ANR就是应用的主线程处于阻塞状态过长,Android系统设计的一种监控机制。
Android 设计 ANR 的用意,是系统通过与之交互的组件(Activity,Service,Receiver,Provider)以及用户交互(InputEvent)进行超时监控,以判断应用进程(主线程)是否存在卡死或响应过慢的问题,通俗来说就是很多系统中看门狗(watchdog)的设计思想。

2.4 系统如何设计ANR机制

ANR机制实际上是超时监控机制,如何实现的监控机制?以Broadcast的超时监控,来总结分析实现。
在这里插入图片描述
简而言之,就是对于监控的组件/事件触发前,启动监控时间记录和超时Duration计算,从而到时间后检查是否未收到执行完消息,从而决定是否触发ANR的弹框。
1.计时机制是否会存在偏差,可以看handler.postDelay的实现?
2.其他组件/事件是否使用上面相同的原理?
3.计时是如何实现的?

2.5 ANR分类

在这里插入图片描述
1.什么是无感知场景?如何实现无感知场景判断?(无感知是否是在应用进程在前台?)
2.组件切换时设置TimeOut是什么意思?
从新计算超时TimeOut!

2.6 组件/事件ANR源码

2.6.1 Activity ANR

2.6.2 Boradcast ANR

2.6.3 Service ANR

2.6.4 ContentProvider AN

2.6.5 Input ANR

3.开发中如何避免ANR产生

(1)避免应用在主线程上非常缓慢地执行涉及 I/O 的操作。
(2)避免应用在主线程上进行长时间的计算。
(3)避免主线程在对另一个进程进行同步 binder 调用,而后者需要很长时间才能返回。
(4)避免主线程处于阻塞状态,为发生在另一个线程上的长操作等待同步的块。
(5)避免主线程在进程中或通过 binder 调用与另一个线程之间发生死锁。主线程不只是在等待长操作执行完毕,而且处于死锁状态。
(6)应用使用 Context.startForegroundService() 在前台启动新服务,但该服务在 5 秒内未调用 startForeground()

4.如何解决ANR问题

4.1 拉取trace文件

Android 会在遇到 ANR 时存储跟踪信息。在较低的操作系统版本中,设备上只有一个 /data/anr/traces.txt 文件。在较新的操作系统版本中,有多个 /data/anr/anr_* 文件。该操作需要超级权限,可以查看,不可以 adb pull

adb shell ls /data/anr
adb pull /data/anr/<filename>

在这里插入图片描述

4.1.1 错误上报获取方式

会在下面命令所在位置生成问题日志,其中就包括anr的trace.txt文件

adb bugreport

在这里插入图片描述
在指定的目录下查找anr文件。
在这里插入图片描述## 4.1.2 Bugly获取方式

4.2 trace文件解析

常见文件格式如下:

Subject: executing service com.tencent.mobileqq/com.qzone.preview.service.PictureService

----- pid 30377 at 2023-03-25 09:56:07.689002960+0800 -----
Cmd line: com.tencent.mobileqq:qzone
Build fingerprint: 'OPPO/PDSM00/OP4EA3:12/SP1A.210812.016/R.c9327f_622e:user/release-keys'
ABI: 'arm64'
Build type: optimized
Zygote loaded classes=40698 post zygote classes=5119
Dumping registered class loaders
#0 dalvik.system.PathClassLoader: [], parent #1
#1 java.lang.BootClassLoader: [], no parent
#2 dalvik.system.PathClassLoader: [/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes9.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes162.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes3.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes17.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes27.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes7.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes22.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes18.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes10.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes15.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes23.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes21.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes57.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes12.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes14.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes2.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes165.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes19.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes163.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes167.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes11.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes164.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes24.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes26.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes20.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes105.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes5.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes25.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes16.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes8.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes28.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes166.dex:/data/user/0/com.tencent.mobileqq/files/dynamic_feature/kandian_feature_impl-debug.apk:/data/user/0/com.tencent.mobileqq/files/dynamic_feature/aelight_impl-debug.apk:/data/user/0/com.tencent.mobileqq/files/dynamic_feature/qqpay_temp_impl-debug.apk:/data/user/0/com.tencent.mobileqq/files/dynamic_feature/qqmini_impl-debug.apk:/data/user/0/com.tencent.mobileqq/files/dynamic_feature/qqrtc_feature_impl-debug.apk:/data/user/0/com.tencent.mobileqq/files/dynamic_feature/qq_comic_impl-debug.apk:/data/user/0/com.tencent.mobileqq/files/dynamic_feature/cmshow_impl-debug.apk:/data/user/0/com.tencent.mobileqq/files/dynamic_feature/zplan_impl-debug.apk:/data/user/0/com.tencent.mobileqq/files/dynamic_feature/webview_impl-debug.apk:/data/user/0/com.tencent.mobileqq/files/dynamic_feature/qqavgame_impl-debug.apk:/data/user/0/com.tencent.mobileqq/files/dynamic_feature/qqpubaccount_impl-debug.apk:/data/user/0/com.tencent.mobileqq/files/dynamic_feature/qqnearby_impl-debug.apk:/data/user/0/com.tencent.mobileqq/files/dynamic_feature/qqweishi_impl-debug.apk:/data/user/0/com.tencent.mobileqq/files/dynamic_feature/qqexpand_impl-debug.apk:/data/user/0/com.tencent.mobileqq/files/dynamic_feature/wxmini_impl-debug.apk:/data/user/0/com.tencent.mobileqq/files/dynamic_feature/profilecard_feature_impl-debug.apk:/data/user/0/com.tencent.mobileqq/files/dynamic_feature/party_room_impl-debug.apk:/data/user/0/com.tencent.mobileqq/files/dynamic_feature/relation_common_business_impl-debug.apk:/data/user/0/com.tencent.mobileqq/files/dynamic_feature/matchfriend_impl-debug.apk:/data/user/0/com.tencent.mobileqq/files/dynamic_feature/mutualmark_impl-debug.apk:/data/user/0/com.tencent.mobileqq/files/dynamic_feature/qq_winkpublish_impl-debug.apk:/data/user/0/com.tencent.mobileqq/files/dynamic_feature/qqecommerce_impl-debug.apk:/data/user/0/com.tencent.mobileqq/files/dynamic_feature/qqecommerce_shell_impl-debug.apk!classes2.dex:/data/user/0/com.tencent.mobileqq/files/dynamic_feature/qzone_df_impl-debug.apk!classes2.dex:/data/user/0/com.tencent.mobileqq/files/dynamic_feature/qqguild_df_impl-debug.apk:/data/user/0/com.tencent.mobileqq/files/dynamic_feature/qq_debug_impl-debug.apk:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes13.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes90.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes4.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes156.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes67.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes132.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes92.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes51.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes33.dex:/data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/base.apk!classes65.dex], parent #1
Done dumping class loaders
Classes initialized: 0 in 0
Intern table: 50246 strong; 1493 weak
JNI: CheckJNI is on; globals=436 (plus 136 weak)
Libraries: /data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/lib/arm64/libc++_shared.so /data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/lib/arm64/libmmkv.so /data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/lib/arm64/libnative-memory-library-lib.so /data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/lib/arm64/libqimei.so /data/app/~~gyVwAxJwSrU-Un1LOEU9oQ==/com.tencent.mobileqq-V3MD34GlYOCA3DFJ55lYsA==/lib/arm64/libunitedconfig.so libandroid.so libaudioeffect_jni.so libcompiler_rt.so libframework-connectivity-jni.so libicu_jni.so libjavacore.so libjavacrypto.so libjnigraphics.so libmedia_jni.so libonetrace_jni.so libopenjdk.so liboplusextzawgyi.so liboplusgui_jni.so liboplushwui_jni.so libphoenix_jni.so librs_jni.so librtp_jni.so libsoundpool.so libstats_jni.so libwebviewchromium_loader.so (25)
Heap: 16% free, 9758KB/11MB; 263625 objects
Dumping cumulative Gc timings
Start Dumping Averages for 4 iterations for concurrent copying
ScanImmuneSpaces:	Sum: 49.380ms Avg: 12.345ms
VisitConcurrentRoots:	Sum: 35.482ms Avg: 8.870ms
ProcessMarkStack:	Sum: 29.895ms Avg: 7.473ms
MarkingPhase:	Sum: 26.095ms Avg: 6.523ms
ScanCardsForSpace:	Sum: 12.977ms Avg: 3.244ms
CaptureThreadRootsForMarking:	Sum: 8.531ms Avg: 2.132ms
GrayAllDirtyImmuneObjects:	Sum: 4.670ms Avg: 1.167ms
FlipThreadRoots:	Sum: 4.660ms Avg: 1.165ms
SweepSystemWeaks:	Sum: 2.834ms Avg: 708.500us
ClearFromSpace:	Sum: 2.557ms Avg: 639.250us
InitializePhase:	Sum: 1.938ms Avg: 484.500us
VisitNonThreadRoots:	Sum: 1.570ms Avg: 392.500us
CopyingPhase:	Sum: 1.402ms Avg: 350.500us
ForwardSoftReferences:	Sum: 1.013ms Avg: 253.250us
ThreadListFlip:	Sum: 903us Avg: 225.750us
ReclaimPhase:	Sum: 868us Avg: 217us
FlipOtherThreads:	Sum: 528us Avg: 132us
SweepLargeObjects:	Sum: 309us Avg: 77.250us
EmptyRBMarkBitStack:	Sum: 298us Avg: 74.500us
EnqueueFinalizerReferences:	Sum: 241us Avg: 60.250us
RecordFree:	Sum: 182us Avg: 45.500us
MarkStackAsLive:	Sum: 177us Avg: 44.250us
ProcessReferences:	Sum: 159us Avg: 39.750us
(Paused)GrayAllNewlyDirtyImmuneObjects:	Sum: 91us Avg: 22.750us
MarkZygoteLargeObjects:	Sum: 84us Avg: 21us
ResumeRunnableThreads:	Sum: 71us Avg: 17.750us
SweepAllocSpace:	Sum: 44us Avg: 11us
(Paused)ClearCards:	Sum: 41us Avg: 10.250us
SwapBitmaps:	Sum: 38us Avg: 9.500us
ResumeOtherThreads:	Sum: 17us Avg: 4.250us
(Paused)FlipCallback:	Sum: 8us Avg: 2us
Sweep:	Sum: 6us Avg: 1.500us
UnBindBitmaps:	Sum: 6us Avg: 1.500us
(Paused)SetFromSpace:	Sum: 5us Avg: 1.250us
Done Dumping Averages
concurrent copying paused:	Sum: 1.922ms 99% C.I. 17us-744us Avg: 240.250us Max: 744us
concurrent copying freed-bytes: Avg: 1265KB Max: 2747KB Min: 16KB
Freed-bytes histogram: 0:2,1920:1,2560:1
concurrent copying total time: 187.080ms mean time: 46.770ms
concurrent copying freed: 41694 objects with total size 5063KB
concurrent copying throughput: 222963/s / 26MB/s  per cpu-time: 52376080/s / 49MB/s
concurrent copying tracing throughput: 43MB/s  per cpu-time: 82MB/s
Average major GC reclaim bytes ratio 0.355639 over 4 GC cycles
Average major GC copied live bytes ratio 0.642999 over 8 major GCs
Cumulative bytes moved 31028928
Cumulative objects moved 590075
Peak regions allocated 57 (14MB) / 1536 (384MB)
Total madvise time 18.278ms
Start Dumping Averages for 20 iterations for young concurrent copying
ScanImmuneSpaces:	Sum: 158.234ms Avg: 7.911ms
ProcessMarkStack:	Sum: 153.274ms Avg: 7.663ms
VisitConcurrentRoots:	Sum: 66.094ms Avg: 3.304ms
CopyingPhase:	Sum: 61.886ms Avg: 3.094ms
ScanCardsForSpace:	Sum: 40.421ms Avg: 2.021ms
FlipThreadRoots:	Sum: 28.521ms Avg: 1.426ms
ClearFromSpace:	Sum: 18.903ms Avg: 945.150us
ThreadListFlip:	Sum: 14.804ms Avg: 740.200us
GrayAllDirtyImmuneObjects:	Sum: 11.127ms Avg: 556.350us
SweepSystemWeaks:	Sum: 8.751ms Avg: 437.550us
ReclaimPhase:	Sum: 8.652ms Avg: 432.600us
InitializePhase:	Sum: 7.050ms Avg: 352.500us
ForwardSoftReferences:	Sum: 4.514ms Avg: 225.700us
RecordFree:	Sum: 3.705ms Avg: 185.250us
FlipOtherThreads:	Sum: 3.378ms Avg: 168.900us
ResetStack:	Sum: 3.055ms Avg: 152.750us
ProcessReferences:	Sum: 2.323ms Avg: 116.150us
EmptyRBMarkBitStack:	Sum: 1.865ms Avg: 93.250us
SweepArray:	Sum: 1.504ms Avg: 75.200us
EnqueueFinalizerReferences:	Sum: 1.410ms Avg: 70.500us
(Paused)GrayAllNewlyDirtyImmuneObjects:	Sum: 489us Avg: 24.450us
ResumeRunnableThreads:	Sum: 466us Avg: 23.300us
VisitNonThreadRoots:	Sum: 413us Avg: 20.650us
(Paused)ClearCards:	Sum: 329us Avg: 16.450us
UnBindBitmaps:	Sum: 279us Avg: 13.950us
MarkZygoteLargeObjects:	Sum: 183us Avg: 9.150us
SwapBitmaps:	Sum: 177us Avg: 8.850us
ResumeOtherThreads:	Sum: 111us Avg: 5.550us
FreeList:	Sum: 60us Avg: 3us
(Paused)FlipCallback:	Sum: 49us Avg: 2.450us
(Paused)SetFromSpace:	Sum: 32us Avg: 1.600us
Done Dumping Averages
young concurrent copying paused:	Sum: 20.016ms 99% C.I. 15us-5000us Avg: 500.400us Max: 5450us
young concurrent copying freed-bytes: Avg: 1414KB Max: 4755KB Min: 176KB
Freed-bytes histogram: 0:5,640:4,1280:8,1920:1,3840:1,4480:1
young concurrent copying total time: 602.059ms mean time: 30.102ms
young concurrent copying freed: 272271 objects with total size 27MB
young concurrent copying throughput: 452277/s / 45MB/s  per cpu-time: 144886640/s / 138MB/s
young concurrent copying tracing throughput: 27MB/s  per cpu-time: 83MB/s
Average minor GC reclaim bytes ratio 0.252228 over 20 GC cycles
Average minor GC copied live bytes ratio 0.178124 over 21 minor GCs
Cumulative bytes moved 5718568
Cumulative objects moved 91742
Peak regions allocated 57 (14MB) / 1536 (384MB)
Total time spent in GC: 789.139ms
Mean GC size throughput: 41MB/s per cpu-time: 108MB/s
Mean GC object throughput: 397858 objects/s
Total number of allocations 577590
Total bytes allocated 42MB
Total bytes freed 32MB
Free memory 1996KB
Free memory until GC 1996KB
Free memory until OOME 374MB
Total memory 11MB
Max memory 384MB
Zygote space size 7460KB
Total mutator paused time: 21.938ms
Total time waiting for GC to complete: 32.223ms
Total GC count: 24
Total GC time: 789.139ms
Total blocking GC count: 3
Total blocking GC time: 118.783ms
Histogram of GC count per 10000 ms: 2:1,5:1
Histogram of blocking GC count per 10000 ms: 0:2
Native bytes total: 26666306 registered: 799786
Total native bytes at last GC: 26355970
/system/framework/oat/arm64/org.apache.http.legacy.odex: speed-profile
/system/framework/oat/arm64/android.hidl.base-V1.0-java.odex: verify
/system/framework/oat/arm64/android.hidl.manager-V1.0-java.odex: verify
/system/framework/oat/arm64/android.test.base.odex: verify
Current JIT code cache size (used / resident): 198KB / 256KB
Current JIT data cache size (used / resident): 123KB / 200KB
Zygote JIT code cache size (at point of fork): 13KB / 32KB
Zygote JIT data cache size (at point of fork): 9KB / 32KB
Current JIT mini-debug-info size: 43KB
Current JIT capacity: 512KB
Current number of JIT JNI stub entries: 0
Current number of JIT code cache entries: 360
Total number of JIT baseline compilations: 397
Total number of JIT optimized compilations: 31
Total number of JIT compilations for on stack replacement: 21
Total number of JIT code cache collections: 5
Memory used for stack maps: Avg: 154B Max: 1848B Min: 16B
Memory used for compiled code: Avg: 688B Max: 5856B Min: 24B
Memory used for profiling info: Avg: 101B Max: 1704B Min: 24B
Start Dumping Averages for 472 iterations for JIT timings
Compiling baseline:	Sum: 300.754ms Avg: 637.190us
Compiling optimized:	Sum: 55.310ms Avg: 117.182us
Code cache collection:	Sum: 50.515ms Avg: 107.023us
Compiling OSR:	Sum: 33.976ms Avg: 71.983us
TrimMaps:	Sum: 23.277ms Avg: 49.315us
Done Dumping Averages
Memory used for compilation: Avg: 53KB Max: 585KB Min: 13KB
ProfileSaver total_bytes_written=0
ProfileSaver total_number_of_writes=0
ProfileSaver total_number_of_code_cache_queries=0
ProfileSaver total_number_of_skipped_writes=0
ProfileSaver total_number_of_failed_writes=0
ProfileSaver total_ms_of_sleep=5000
ProfileSaver total_ms_of_work=0
ProfileSaver total_number_of_hot_spikes=8
ProfileSaver total_number_of_wake_ups=6

*** ART internal metrics ***
  Metadata:
    timestamp_since_start_ms: 21210
  Metrics:
    ClassLoadingTotalTime: count = 793319
    ClassVerificationTotalTime: count = 2699523
    ClassVerificationCount: count = 1520
    WorldStopTimeDuringGCAvg: count = 914
    YoungGcCount: count = 20
    FullGcCount: count = 4
    TotalBytesAllocated: count = 42215888
    TotalGcCollectionTime: count = 829
    YoungGcThroughputAvg: count = 48
    FullGcThroughputAvg: count = 16
    YoungGcTracingThroughputAvg: count = 35
    FullGcTracingThroughputAvg: count = 40
    JitMethodCompileTotalTime: count = 992382
    JitMethodCompileCount: count = 449
    YoungGcCollectionTime: range = 0...60000, buckets: 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    FullGcCollectionTime: range = 0...60000, buckets: 4,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    YoungGcThroughput: range = 0...10000, buckets: 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    FullGcThroughput: range = 0...10000, buckets: 4,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    YoungGcTracingThroughput: range = 0...10000, buckets: 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    FullGcTracingThroughput: range = 0...10000, buckets: 4,0,0,0,0,0,0,0,0,0,0,0,0,0,0
*** Done dumping ART internal metrics ***

suspend all histogram:	Sum: 20.257ms 99% C.I. 1us-4630.399us Avg: 311.646us Max: 5402us
DALVIK THREADS (47):
"Signal Catcher" daemon prio=10 tid=2 Runnable
  | group="system" sCount=0 ucsCount=0 flags=0 obj=0x12c80000 self=0x70efc2c000
  | sysTid=30383 nice=-20 cgrp=default sched=0/0 handle=0x70f0d18cb0
  | state=R schedstat=( 16619924 2057077 9 ) utm=1 stm=0 core=5 HZ=100
  | stack=0x70f0c21000-0x70f0c23000 stackSize=991KB
  | held mutexes= "mutator lock"(shared held)
  native: #00 pc 0000000000458f1c  /apex/com.android.art/lib64/libart.so (art::DumpNativeStack(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, int, BacktraceMap*, char const*, art::ArtMethod*, void*, bool)+120)
  native: #01 pc 00000000006f98a8  /apex/com.android.art/lib64/libart.so (art::Thread::DumpStack(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, bool, BacktraceMap*, bool) const+252)
  native: #02 pc 0000000000701380  /apex/com.android.art/lib64/libart.so (art::DumpCheckpoint::Run(art::Thread*)+304)
  native: #03 pc 0000000000311180  /apex/com.android.art/lib64/libart.so (art::ThreadList::RunCheckpoint(art::Closure*, art::Closure*)+628)
  native: #04 pc 00000000006e088c  /apex/com.android.art/lib64/libart.so (art::ThreadList::Dump(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, bool)+476)
  native: #05 pc 00000000006dedc0  /apex/com.android.art/lib64/libart.so (art::ThreadList::DumpForSigQuit(std::__1::basic_ostream<char, std::__1::char_traits<char> >&)+360)
  native: #06 pc 00000000006de65c  /apex/com.android.art/lib64/libart.so (art::Runtime::DumpForSigQuit(std::__1::basic_ostream<char, std::__1::char_traits<char> >&)+188)
  native: #07 pc 00000000004178bc  /apex/com.android.art/lib64/libart.so (art::SignalCatcher::HandleSigQuit()+456)
  native: #08 pc 0000000000416c38  /apex/com.android.art/lib64/libart.so (art::SignalCatcher::Run(void*)+256)
  native: #09 pc 00000000000dc188  /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+264)
  native: #10 pc 000000000007a438  /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64)
  (no managed stack frames)

"main" prio=5 tid=1 Runnable
  | group="main" sCount=0 ucsCount=0 flags=0 obj=0x734862d8 self=0xb400007108e10800
  | sysTid=30377 nice=0 cgrp=default sched=0/0 handle=0x71a472c4f8
  | state=R schedstat=( 12544015733 8268072158 23564 ) utm=1114 stm=139 core=6 HZ=100
  | stack=0x7fff5d9000-0x7fff5db000 stackSize=8188KB
  | held mutexes= "mutator lock"(shared held)
  native: #00 pc 0000000000458f1c  /apex/com.android.art/lib64/libart.so (art::DumpNativeStack(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, int, BacktraceMap*, char const*, art::ArtMethod*, void*, bool)+120)
  native: #01 pc 00000000006f98a8  /apex/com.android.art/lib64/libart.so (art::Thread::DumpStack(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, bool, BacktraceMap*, bool) const+252)
  native: #02 pc 0000000000701380  /apex/com.android.art/lib64/libart.so (art::DumpCheckpoint::Run(art::Thread*)+304)
  native: #03 pc 00000000003b38c0  /apex/com.android.art/lib64/libart.so (art::Thread::RunCheckpointFunction()+176)
  native: #04 pc 000000000034a314  /apex/com.android.art/lib64/libart.so (art::Thread::CheckSuspend()+68)
  native: #05 pc 0000000000762bd0  /apex/com.android.art/lib64/libart.so (art::JniMethodFastEnd(unsigned int, art::Thread*)+68)
  at java.lang.System.arraycopy(Native method)
  at com.android.internal.util.GrowingArrayUtils.insert(GrowingArrayUtils.java:155)
  at android.util.SparseArray.put(SparseArray.java:280)
  at android.content.res.StringBlock.getSequence(StringBlock.java:185)
  - locked <0x0ca1fb23> (a android.content.res.StringBlock)
  at android.content.res.ApkAssets.getStringFromPool(ApkAssets.java:350)
  - locked <0x0b8ec820> (a android.content.res.ApkAssets)
  at android.content.res.AssetManager.getPooledStringForCookie(AssetManager.java:866)
  at android.content.res.AssetManager.getResourceValue(AssetManager.java:576)
  - locked <0x058525d9> (a android.content.res.AssetManager)
  at android.content.res.ResourcesImpl.getValue(ResourcesImpl.java:245)
  at android.content.res.Resources.getValue(Resources.java:1447)
  at com.tencent.theme.DrawableLoader.<init>(DrawableLoader.java:130)
  at com.tencent.theme.SkinEngine.initIntercepter(SkinEngine.java:1043)
  at com.tencent.theme.SkinEngine.init(SkinEngine.java:504)
  at com.tencent.mobileqq.startup.step.InitSkin.initSkinEngine(InitSkin.java:640)
  at com.tencent.mobileqq.startup.step.InitSkin.initSkin(InitSkin.java:557)
  at com.tencent.mobileqq.startup.step.InitSkin.startInitSkinEngine(InitSkin.java:145)
  - locked <0x0a0f6b9e> (a java.lang.Class<com.tencent.mobileqq.startup.step.InitSkin>)
  at com.tencent.mobileqq.startup.step.InitSkin.doStep(InitSkin.java:87)
  at com.tencent.mobileqq.startup.step.Step.step(Step.java:117)
  at com.tencent.mobileqq.startup.step.OnceIfSuccessStep.step(OnceIfSuccessStep.java:18)
  at com.tencent.mobileqq.startup.director.StartupDirector.onApplicationCreate(StartupDirector.java:454)
  at com.tencent.common.app.BaseApplicationImpl.onCreate(BaseApplicationImpl.java:370)
  at com.tencent.mobileqq.qfix.QFixApplication.onCreate(QFixApplication.java:2)
  at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1225)
  at android.app.ActivityThread.handleBindApplication(ActivityThread.java:7070)
  at android.app.ActivityThread.access$1800(ActivityThread.java:258)
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2207)
  at android.os.Handler.dispatchMessage(Handler.java:106)
  at android.os.Looper.loopOnce(Looper.java:233)
  at android.os.Looper.loop(Looper.java:344)
  at android.app.ActivityThread.main(ActivityThread.java:8205)
  at java.lang.reflect.Method.invoke(Native method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:589)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1071)

5.站在巨人肩膀

1.ANR系列之一:ANR显示和日志生成原理讲解
2.今日头条 ANR 优化实践系列 - 设计原理及影响因素
3.花了2个月,终于串通ANR的一切
4.干货:ANR日志分析全面解析
5.ANR监测机制
6.android开发分享荐 反思|Android 输入系统 & ANR机制的设计与实现
7.Google开发者之ANR

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值