专栏首页linux驱动个人学习Android功耗优化(7)---如何分析wakelock(wakeup source)持锁问题

Android功耗优化(7)---如何分析wakelock(wakeup source)持锁问题

如何分析wakelock(wakeup source)持锁问题

锁一般分为:APP透过PowerManager拿锁,以及kernel wakelock.

分析上层持锁的问题:

目前PowerManagerService的log 默认不会打开,可以通过修改:

frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java

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 过滤出持锁时间比较长的锁.

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的锁默认不会打印出来,一般是待机结束后通过节点来获取:

adb shell cat /sys/kernel/debug/wakeup_sources > wakeup_sources.log

  • active_count:对应wakeup source被激活的次数.
  • event_count:被信号唤醒的次数
  • wakeup_count:中止suspend的次数.
  • expire_count:对应wakeup source超时的次数.
  • active_since:上一次还活跃的时间点.时间单位跟kernel log前缀时间是一样(kernel单调递增时间).
  • total_time:对应wakeup source活跃的总时长.
  • max_time:对应的wakeup source持续活跃最长的一次时间.
  • last_change:上一次wakeup source变化的时间(从持锁到释放or释放到持锁),时间单位跟kernel log前缀时间是一样(kernel单调递增时间).
  • prevent_suspend_time:对应wakeup source阻止进入autosleep的总累加时间.

一般情况下:

如果是复现机,前面没有捉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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux电源管理(7)_Wakeup events framework

    本文继续“Linux电源管理(6)_Generic PM之Suspend功能”中有关suspend同步以及PM wakeup的话题。这个话题,是近几年Linux...

    233333
  • 高通 display 驱动【转】

    233333
  • 启动期间的内存管理之bootmem_init初始化内存管理–Linux内存管理(十二)

    首先我们来看看start_kernel是如何初始化系统的, start_kerne定义在init/main.c?v=4.7, line 479

    233333
  • HAWQ技术解析(二) —— 安装部署

    一、安装规划 1. 选择安装介质         HAWQ的安装介质有两种选择,一是下载源码手工编译,二是使用Pivotal公司提供的HDB安装包。源码的下载地...

    用户1148526
  • range函数小应用

    在Python语言中,有很多方式能够生成序列类对象。range函数就是这样一个,现在用的都是Python3了,但是,这个函数从Python2开始就已经有了,显然...

    老齐
  • [php]Windows环境下Composer的安装教程

    下载Composer-Setup.exe后安装,它会自动搜索 php.exe 路径, 如果找不到,则手动添加路径。

    landv
  • Buffered channel、slice和mutex的简单性能测试

    测试代码: package main import ( "fmt" "runtime" "sync" "time" ) co...

    李海彬
  • php面试题整理

    1.禁用COOKIE 后 SEESION 还能用吗? 答:通常服务器端的session是借助于seesion cookie来和客户端交互的。 但如果客户端禁用了...

    joshua317
  • 探索常见的几种限流策略和实现

    常见的算法有 漏桶(leaky bucket)、 令牌桶(TokenBucket)、 计数器,本章通过最简单的代码和最直白的文字描述三种的实现方式(基于本地而不...

    battcn
  • 页面结构化在 Android 上的尝试

    导语:MVP开发模式可以帮助项目结构解耦,但其庞大的方法数增加,较为笨重设计对于手Q项目并不很适合。参考之前Web开发经验,提出以页面结构化的解耦方式组织代码。...

    腾讯Bugly

扫码关注云+社区

领取腾讯云代金券