如何分析wakelock(wakeup source)持锁问题java
锁通常分为:APP透过PowerManager拿锁,以及kernel wakelock.android
分析上层持锁的问题:正则表达式
目前PowerManagerService的log 默认不会打开,能够经过修改:shell
frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java
ide
private static final boolean DEBUG = true; private static final boolean DEBUG_SPEW = DEBUG && false; 修改成: private static final boolean DEBUG = true; private static final boolean DEBUG_SPEW = true; 打开上层的log
经过syslog:搜索关键字:total_time=来肯定持锁的时间.测试
PowerManagerService: releaseWakeLockInternal: lock=31602562 [*job*/DownloadManager:com.android.providers.downloads], flags=0x0, total_time=600051ms
或者经过正则表达式:total_time=[\d]{4,}ms 过滤出持锁时间比较长的锁.debug
PowerManagerService: releaseWakeLockInternal: lock=31602562 [*job*/DownloadManager:com.android.providers.downloads], flags=0x0, total_time=600051ms PowerManagerService: releaseWakeLockInternal: lock=56317918 [*job*/DownloadManager:com.android.providers.downloads], flags=0x0, total_time=283062ms PowerManagerService: releaseWakeLockInternal: lock=216012597 [AudioMix], flags=0x0, total_time=120003ms PowerManagerService: releaseWakeLockInternal: lock=41036921 [AudioMix], flags=0x0, total_time=167984ms PowerManagerService: releaseWakeLockInternal: lock=70859243 [GsmInboundSmsHandler], flags=0x0, total_time=3206ms PowerManagerService: releaseWakeLockInternal: lock=242046348 [AudioMix], flags=0x0, total_time=122205ms
kernel的锁默认不会打印出来,通常是待机结束后经过节点来获取:excel
adb shell cat /sys/kernel/debug/wakeup_sources > wakeup_sources.logcode
通常状况下:server
若是是复现机,前面没有捉log,也没有dump log,只有一份wakeup_sources.log
能够看下prevent_suspend_time,通常时间越大越多是阻止系统进入suspend的wakeup sources.
若是测试先后,都有捉 wakeup_sources.log 请对两份wakeup_sources.log的total time的差值.
差值时间跟灭屏的时间对得上,通常就是这个锁引发的问题.
把捉出来的wakeup_sources.log复制到excel表格中,比较好对齐,一个是比较好计算.
其中dispsys_wakelock total_time的时间有697614mS 也就是总共有697s.
或者在待机测试结束后经过命令:
adb bugreport > bugreport.txt
搜索关键:
底层的锁:
All kernel wake locks: Kernel Wake lock ttyC0 : 1h 33m 15s 668ms (3856 times) realtime Kernel Wake lock radio-interface: 1h 20m 56s 210ms (3995 times) realtime Kernel Wake lock ccci3_at : 1h 9m 43s 491ms (2932 times) realtime Kernel Wake lock ccci_fs : 1h 0m 52s 818ms (3432 times) realtime Kernel Wake lock ccci3_at2 : 41m 16s 938ms (2465 times) realtime
上层的锁:
All partial wake locks: Wake lock 1001 RILJ: 5m 29s 768ms (13118 times) realtime Wake lock 1000 *alarm*: 4m 7s 823ms (2330 times) realtime Wake lock 1000 ConnectivityService: 59s 513ms (1 times) realtime Wake lock u0a111 *alarm*: 50s 334ms (751 times) realtime Wake lock u0a111 WakerLock:999603354: 28s 655ms (125 times) realtime Wake lock 1000 NetworkStats: 11s 434ms (569 times) realtime