"main" prio=5 tid=1 Native | group="main" sCount=1 dsCount=0 flags=1 obj=0x72c8bbf8 self=0xb400007b0ec10800 | sysTid=5991 nice=-10 cgrp=default sched=0/0 handle=0x7b95f61500 | state=S schedstat=( 8070532492675623241494 ) utm=63 stm=17 core=3 HZ=100 | stack=0x7fcccd9000-0x7fcccdb000 stackSize=8192KB | held mutexes= native: #00 pc 00000000000c6418 /apex/com.android.runtime/lib64/bionic/libc.so (__epoll_pwait+8) native: #01 pc 0000000000019a9c /system/lib64/libutils.so (android::Looper::pollInner(int)+184) native: #02 pc 000000000001997c /system/lib64/libutils.so (android::Looper::pollOnce(int, int*, int*, void**)+112) native: #03 pc 0000000000114310 /system/lib64/libandroid_runtime.so (android::android_os_MessageQueue_nativePollOnce(_JNIEnv*, _jobject*, long, int)+44) at android.os.MessageQueue.nativePollOnce(Native method) at android.os.MessageQueue.next(MessageQueue.java:339) at android.os.Looper.loop(Looper.java:198) at android.app.ActivityThread.main(ActivityThread.java:8142) at java.lang.reflect.Method.invoke(Native method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1006)
上面 Trace 中 部分字段的含义
线程堆栈
下面是该线程对应的调用堆栈
1 2 3 4 5 6 7 8 9 10 11
native: #00 pc 00000000000c6418 /apex/com.android.runtime/lib64/bionic/libc.so (__epoll_pwait+8) native: #01 pc 0000000000019a9c /system/lib64/libutils.so (android::Looper::pollInner(int)+184) native: #02 pc 000000000001997c /system/lib64/libutils.so (android::Looper::pollOnce(int, int*, int*, void**)+112) native: #03 pc 0000000000114310 /system/lib64/libandroid_runtime.so (android::android_os_MessageQueue_nativePollOnce(_JNIEnv*, _jobject*, long, int)+44) at android.os.MessageQueue.nativePollOnce(Native method) at android.os.MessageQueue.next(MessageQueue.java:339) at android.os.Looper.loop(Looper.java:198) at android.app.ActivityThread.main(ActivityThread.java:8142) at java.lang.reflect.Method.invoke(Native method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1006)
// State stored in our C++ class Thread. // When we refer to "a suspended state", or when function names mention "ToSuspended" or // "FromSuspended", we mean any state other than kRunnable, i.e. any state in which the thread is // guaranteed not to access the Java heap. The kSuspended state is merely one of these. enumThreadState { // Java // Thread.State JDWP state kTerminated = 66, // TERMINATED TS_ZOMBIE Thread.run has returned, but Thread* still around kRunnable, // RUNNABLE TS_RUNNING runnable kTimedWaiting, // TIMED_WAITING TS_WAIT in Object.wait() with a timeout kSleeping, // TIMED_WAITING TS_SLEEPING in Thread.sleep() kBlocked, // BLOCKED TS_MONITOR blocked on a monitor kWaiting, // WAITING TS_WAIT in Object.wait() kWaitingForLockInflation, // WAITING TS_WAIT blocked inflating a thin-lock kWaitingForTaskProcessor, // WAITING TS_WAIT blocked waiting for taskProcessor kWaitingForGcToComplete, // WAITING TS_WAIT blocked waiting for GC kWaitingForCheckPointsToRun, // WAITING TS_WAIT GC waiting for checkpoints to run kWaitingPerformingGc, // WAITING TS_WAIT performing GC kWaitingForDebuggerSend, // WAITING TS_WAIT blocked waiting for events to be sent kWaitingForDebuggerToAttach, // WAITING TS_WAIT blocked waiting for debugger to attach kWaitingInMainDebuggerLoop, // WAITING TS_WAIT blocking/reading/processing debugger events kWaitingForDebuggerSuspension, // WAITING TS_WAIT waiting for debugger suspend all kWaitingForJniOnLoad, // WAITING TS_WAIT waiting for execution of dlopen and JNI on load code kWaitingForSignalCatcherOutput, // WAITING TS_WAIT waiting for signal catcher IO to complete kWaitingInMainSignalCatcherLoop, // WAITING TS_WAIT blocking/reading/processing signals kWaitingForDeoptimization, // WAITING TS_WAIT waiting for deoptimization suspend all kWaitingForMethodTracingStart, // WAITING TS_WAIT waiting for method tracing to start kWaitingForVisitObjects, // WAITING TS_WAIT waiting for visiting objects kWaitingForGetObjectsAllocated, // WAITING TS_WAIT waiting for getting the number of allocated objects kWaitingWeakGcRootRead, // WAITING TS_WAIT waiting on the GC to read a weak root kWaitingForGcThreadFlip, // WAITING TS_WAIT waiting on the GC thread flip (CC collector) to finish kNativeForAbort, // WAITING TS_WAIT checking other threads are not run on abort. kStarting, // NEW TS_WAIT native thread started, not yet ready to run managed code kNative, // RUNNABLE TS_RUNNING running in a JNI native method kSuspended, // RUNNABLE TS_RUNNING suspended by GC or debugger };
Trace 文件中,线程名的最后一行标识的就是当前线程的状态
正常主线程 Trace
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
"main" prio=5 tid=1 Native | group="main" sCount=1 dsCount=0 flags=1 obj=0x72c8bbf8 self=0xb400007b0ec10800 | sysTid=5991 nice=-10 cgrp=default sched=0/0 handle=0x7b95f61500 | state=S schedstat=( 8070532492675623241494 ) utm=63 stm=17 core=3 HZ=100 | stack=0x7fcccd9000-0x7fcccdb000 stackSize=8192KB | held mutexes= native: #00 pc 00000000000c6418 /apex/com.android.runtime/lib64/bionic/libc.so (__epoll_pwait+8) native: #01 pc 0000000000019a9c /system/lib64/libutils.so (android::Looper::pollInner(int)+184) native: #02 pc 000000000001997c /system/lib64/libutils.so (android::Looper::pollOnce(int, int*, int*, void**)+112) native: #03 pc 0000000000114310 /system/lib64/libandroid_runtime.so (android::android_os_MessageQueue_nativePollOnce(_JNIEnv*, _jobject*, long, int)+44) at android.os.MessageQueue.nativePollOnce(Native method) at android.os.MessageQueue.next(MessageQueue.java:339) at android.os.Looper.loop(Looper.java:198) at android.app.ActivityThread.main(ActivityThread.java:8142) at java.lang.reflect.Method.invoke(Native method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1006)
异常主线程 Trace
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
"main" prio=5 tid=1 Blocked | group="main" sCount=1 dsCount=0 flags=1 obj=0x70f65400 self=0xe28dae00 | sysTid=22002 nice=-10 cgrp=default sched=0/0 handle=0xe9674474 | state=S schedstat=( 19431599012906473621661 ) utm=159 stm=34 core=7 HZ=100 | stack=0xff041000-0xff043000 stackSize=8192KB | held mutexes= at com.facebook.cache.disk.DiskStorageCache.e(DiskStorageCache.java:3) - waiting to lock <0x0e57c91f> (a java.lang.Object) held by thread 89 at com.xxx.community.util.imageloader.FrescoImageLoader.a(FrescoImageLoader.java:18) at com.xxx.community.util.imageloader.FrescoImageLoader$2$1.run(FrescoImageLoader.java:2) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:254) at android.app.ActivityThread.main(ActivityThread.java:8142) at java.lang.reflect.Method.invoke(Native method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1006)
ActivityManager: ANR in com.xxx.launcher (com.xxx.launcher/.Launcher)(进程名) ActivityManager: PID: 5991(进程 pid) ActivityManager: Reason: Input dispatching timed out(6a6083a com.xxx.launcher/com.xxx.launcher.Launcher (server) is not responding. Waited 5001ms forFocusEvent(hasFocus=true))(原因) ActivityManager: Parent: com.xxx.launcher/.Launcher ActivityManager: Load: 15.29 / 5.19 / 1.87(Load 表明是 1 分钟,5 分钟,15 分钟 CPU 的负载) ActivityManager: ----- Output from /proc/pressure/memory -----(内存压力) ActivityManager: somavg10=1.35 avg60=0.31 avg300=0.06 total=346727 ActivityManager: full avg10=0.00 avg60=0.00 avg300=0.00 total=34803 ActivityManager: ----- End output from /proc/pressure/memory -----
// 13s 内的 cpu 使用情况 ActivityManager: CPU usage from 0ms to 13135ms later(2020-09-09 02:09:54.942 to 2020-09-09 02:10:08.077): ActivityManager: 191%(CPU 的使用率) 1948/system_server: 72%(用户态的使用率) user + 119%(内核态的使用率) kernel / faults: 78816 minor 9 major ActivityManager: 10% 2218/android.bg: 3.6% user + 6.6% kernel ActivityManager: 30% 5991/com.xxx.launcher: 23% user + 6.4% kernel / faults: 118172 minor(高速缓存的缺页次数) 2 major(内存的缺页次数) ActivityManager: 16% 6174/launcher-loader: 13% user + 2.8% kernel ActivityManager: 3.9% 5991/m.xxx.launcher: 3.1% user + 0.8% kernel ActivityManager: 20% 6549/com.xxx.xxx: 16% user + 3.7% kernel / faults: 3541 minor ActivityManager: 10% 6889/DBCacheManager: 8.7% user + 1.2% kernel ActivityManager: 9.4% 6942/DefaultDispatch: 7.1% user + 2.2% kernel
// 1s 内的 各个进程各个线程的 cpu 使用情况 ActivityManager: CPU usage from 246ms to 1271ms later(2020-09-09 02:09:55.188 to 2020-09-09 02:09:56.213): ActivityManager: 290% 1948/system_server: 114% user + 176% kernel / faults: 9353 minor ActivityManager: 32% 5159/LockSettingsSer: 29% user + 2.9% kernel ActivityManager: 25% 8661/AnrConsumer: 8.8% user + 16% kernel ActivityManager: 44% 5991/com.xxx.launcher: 37% user + 7.4% kernel / faults: 5756 minor ActivityManager: 16% 6174/launcher-loader: 13% user + 3.7% kernel ActivityManager: 14% 5991/m.xxx.launcher: 14% user + 0% kernel ActivityManager: 37% 6549/com.xxx.xxx: 28% user + 9.3% kernel / faults: 153 minor ActivityManager: 37% 6942/DefaultDispatch: 28% user + 9.3% kernel ActivityManager: 20% 5962/com.android.phone: 14% user + 5.5% kernel / faults: 1345 minor ActivityManager: 11% 5962/m.android.phone: 7.4% user + 3.7% kernel
CPU 负载
1
ActivityManager: Load: 15.29 / 5.19 / 1.871
Load 后面的三个数字的意思分别是 1 分钟、5 分钟、15 分钟内系统的平均负荷。当 CPU 完全空闲的时候,平均负荷为 0;当 CPU 工作量饱和的时候,平均负荷为 1,通过 Load 可以判断系统负荷是否过重
有一个形象的比喻:个= CPU 想象成一座大桥,桥上只有一根车道,所有车辆都必须从这根车道上通过,系统负荷为 0,意味着大桥上一辆车也没有,系统负荷为 0.5,意味着大桥一半的路段有车,系统负荷为 1.0,意味着大桥的所有路段都有车,也就是说大桥已经”满”了,系统负荷为 2.0,意味着车辆太多了,大桥已经被占满了 (100%),后面等着上桥的车辆还有一倍。大桥的通行能力,就是 CPU 的最大工作量;桥梁上的车辆,就是一个个等待 CPU 处理的进程(process)
经验法则是这样的
1.当系统负荷持续大于 0.7,你必须开始调查了,问题出在哪里,防止情况恶化
2.当系统负荷持续大于 1.0,你必须动手寻找解决办法,把这个值降下来
3.当系统负荷达到 5.0,就表明你的系统有很严重的问题
现在的手机是多核 CPU 架构,八核的多的是,意味着 Cpu 处理的能力就乘以了8,每个核运行的时间可以从下面的文件中得到,/sys/devices/system/cpu/cpu%d/cpufreq/stats/time_in_state 中读取的,%d 代表是 CPU 的核。文件中记录了 CPU 从开机到读取文件时,在各个频率下的运行时间,单位:10 ms
Memory 负载
1 2 3 4
ActivityManager: ----- Output from /proc/pressure/memory -----(内存压力) ActivityManager: somavg10=1.35 avg60=0.31 avg300=0.06 total=346727 ActivityManager: full avg10=0.00 avg60=0.00 avg300=0.00 total=34803 ActivityManager: ----- End output from /proc/pressure/memory -----
some 这一行,代表至少有一个任务在某个资源上阻塞的时间占比,full 这一行,代表所有的非 idle 任务同时被阻塞的时间占比,这期间 cpu 被完全浪费,会带来严重的性能问题。我们以 IO 的 some 和 full 来举例说明,假设在 60 秒的时间段内,系统有两个 task,在 60 秒的周期内的运行情况如下图所示:
红色阴影部分表示任务由于等待 IO 资源而进入阻塞状态。Task A 和 Task B 同时阻塞的部分为 full,占比 16.66%;至少有一个任务阻塞(仅 Task B 阻塞的部分也计算入内)的部分为 some,占比 50%。
voidcheckTime(long startTime, String where) { longnow= SystemClock.uptimeMillis(); if ((now-startTime) > 50) { // If we are taking more than 50ms, log about it. Slog.w(TAG, "Slow operation: " + (now-startTime) + "ms so far, now at " + where); } }
ActivityManager: Slow operation: 138ms so far, now at startProcess: done updating battery stats ActivityManager: Slow operation: 138ms so far, now at startProcess: building log message ActivityManager: Slow operation: 138ms so far, now at startProcess: starting to update pids map
Looper : Slow dispatch
1
Looper : Slow dispatch took 418ms main h=android.app.ActivityThread$H c=android.app.-$$Lambda$LoadedApk$ReceiverDispatcher$Args$_BumDX2UKsnxLVrE6UJsJZkotuA@e68bdc4 m=0
Looper : Slow delivery
1
Looper : Slow delivery took 361ms android.ui h=com.android.server.am.ActivityManagerService$UiHandler c=null m=53
Looper:Slow Looper
1
W/Looper: Slow Looper main: Activity com.androidperformance.memoryfix/.MainActivity is 439ms late(wall=0ms running=0ms ClientTransaction{ callbacks=[android.app.servertransaction.TopResumedActivityChangeItem] }) because of 3 msg, msg 2 took 268ms (seq=2 running=207ms runnable=15ms late=1ms h=android.app.ActivityThread$H w=110), msg 3 took 171ms (seq=3 running=140ms runnable=5ms io=1ms late=268ms h=android.app.ActivityThread$H w=159)
其中对应的 static final int TRANSACTION_addAccessibilityInteractionConnection = (android.os.IBinder.FIRST_CALL_TRANSACTION + 5)
Long monitor contention
1
1680914216 W system_server: Long monitor contention with owner InputDispatcher(17039) at android.content.res.Configuration com.android.server.wm.ActivityTaskManagerService.getGlobalConfigurationForPid(int)(ActivityTaskManagerService.java:1066) waiters=0 in boolean com.android.server.wm.WindowProcessController.hasActivities() for 141ms
18102470 I intercept_power: [ACTION_DOWN,1,0] 18102470 I intercept_power: [ACTION_UP,1,0] 18101810 I screen_toggled: 1// 1 代表亮屏 18101810 I power_screen_broadcast_send: 1 18101810 I power_screen_state: [1,0,0,0,319] 18101810 I power_screen_broadcast_done: [1,633,1] // 1 代表亮屏,633 是亮屏时间
解锁完整 Log
wm_set_keyguard_shown 的值
(keyguardShowing|1) :Keyguard 是否在显示
(aodShowing|1) :aodShowing 是否在显示
(keyguardGoingAway|1) :Keyguard 消失
(Reason|3) :原因
1 2 3 4 5 6 7 8 9 10
18105711 I wm_set_keyguard_shown: [1,0,1,keyguardGoingAway] // 桌面 Resume 18105711 I wm_set_resumed_activity: [0,com.xxx.launcher/.Launcher,resumeTopActivityInnerLocked] 18105711 I wm_resume_activity: [0,93093883,63,com.xxx.launcher/.Launcher] 2061520615 I wm_on_restart_called: [93093883,com.xxx.launcher.Launcher,performRestartActivity] 2061520615 I wm_on_start_called: [93093883,com.xxx.launcher.Launcher,handleStartActivity] 2061520615 I wm_on_resume_called: [93093883,com.xxx.launcher.Launcher,RESUME_ACTIVITY] 2061520615 I wm_on_top_resumed_gained_called: [93093883,com.xxx.launcher.Launcher,topWhenResuming]
18105711 I wm_set_keyguard_shown: [0,0,1,setKeyguardShown] // keyguard 不显示,aod 不显示,keyguardGoingAway,原因是调用了 setKeyguardShown 显示桌面
通知栏下拉完整 Log
1 2 3 4 5 6
27682768 I sysui_multi_action: [757,803,799,panel_open,802,1] 27682768 I sysui_multi_action: [757,1328,758,4,1326,29,1327,0,1329,0] 18103004 I notification_visibility: [-1|android|55|null|1000,1,457483196,457483196,0,4] 18103004 I notification_visibility: [0|com.android.systemui|10005|null|10132,1,97168545,97168545,0,2] 18103004 I notification_visibility: [0|com.android.systemui|2147483647|ranker_group|10132|ranker_group,1,97168236,97168236,0,1] 18103004 I notification_visibility: [-1|com.android.systemui|10006|null|10132,1,82586063,82586063,0,0]
通知栏折叠完整 Log
1 2 3 4 5
27682768 I sysui_multi_action: [757,111,758,2] 18105473 I notification_visibility: [-1|android|55|null|1000,0,457546516,457546516,0,4] 18105473 I notification_visibility: [0|com.android.systemui|10005|null|10132,0,97231865,97231865,0,2] 18105473 I notification_visibility: [0|com.android.systemui|2147483647|ranker_group|10132|ranker_group,0,97231557,97231557,0,1] 18105473 I notification_visibility: [-1|com.android.systemui|10006|null|10132,0,82649384,82649384,0,0]
// 创建 Task 18105473 I wm_task_created: [100,-1] 18105473 I wm_stack_created: 100 18105473 I wm_create_task: [0,100]
// 创建 Activity 18105473 I wm_create_activity: [0,231348670,100,com.androidperformance.memoryfix/.MainActivity,android.intent.action.MAIN,NULL,NULL,270532608]
// 桌面走 pause 流程 18105473 I wm_pause_activity: [0,93093883,com.xxx.launcher/.Launcher,userLeaving=true] 061520615 I wm_on_top_resumed_lost_called: [93093883,com.xxx.launcher.Launcher,topStateChangedWhenResumed] 061520615 I wm_on_paused_called: [93093883,com.xxx.launcher.Launcher,performPause] 18103720 I wm_add_to_stopping: [0,93093883,com.xxx.launcher/.Launcher,makeInvisible]
//启动 Activity 18102045 I am_proc_start: [0,18803,10263,com.androidperformance.memoryfix,pre-top-activity,{com.androidperformance.memoryfix/com.androidperformance.memoryfix.MainActivity}] 18103428 I am_proc_bound: [0,18803,com.androidperformance.memoryfix] 18103428 I wm_restart_activity: [0,231348670,100,com.androidperformance.memoryfix/.MainActivity] 18103428 I wm_set_resumed_activity: [0,com.androidperformance.memoryfix/.MainActivity,minimalResumeActivityLocked] 880318803 I wm_on_create_called: [231348670,com.androidperformance.memoryfix.MainActivity,performCreate] 880318803 I wm_on_start_called: [231348670,com.androidperformance.memoryfix.MainActivity,handleStartActivity] 880318803 I wm_on_resume_called: [231348670,com.androidperformance.memoryfix.MainActivity,RESUME_ACTIVITY] 880318803 I wm_on_top_resumed_gained_called: [231348670,com.androidperformance.memoryfix.MainActivity,topStateChangedWhenResumed] 18102034 I wm_activity_launch_time: [0,231348670,com.androidperformance.memoryfix/.MainActivity,471]
// 桌面走 stop 流程 18101978 I wm_stop_activity: [0,93093883,com.xxx.launcher/.Launcher] 061520615 I wm_on_stop_called: [93093883,com.xxx.launcher.Launcher,STOP_ACTIVITY_ITEM]
Window Focus 相关的流程
1 2 3 4 5 6 7 8 9 10 11 12 13 14
// 从桌面启动 App,focus 变化 :Launcher => null => App WindowManager: Changing focus from Window{b0416d7 u0 com.xxx.launcher/com.xxx.launcher.Launcher} to null,diplayid=0 WindowManager: Changing focus from null to Window{10f5145 u0 com.android.settings/com.android.settings.Settings},diplayid=0
// 从 App 返回桌面,focus 变化 :App => null => Launcher WindowManager: Changing focus from Window{10f5145 u0 com.android.settings/com.android.settings.Settings} to null,diplayid=0 WindowManager: Changing focus from null to Window{b0416d7 u0 com.xxx.launcher/com.xxx.launcher.Launcher},diplayid=0
// 从 App 界面进入锁屏:focus 变化 :App => null => 锁屏 WindowManager: Changing focus from Window{10f5145 u0 com.android.settings/com.android.settings.Settings} to null,diplayid=0 WindowManager: Changing focus from null to Window{82e5f30 u0 NotificationShade},diplayid=0
// 从锁屏界面解锁进入 App,focus 变化 :锁屏 => App WindowManager: Changing focus from Window{82e5f30 u0 NotificationShade} to Window{10f5145 u0 com.android.settings/com.android.settings.Settings},diplayid=0