如何分析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

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

  1. Android功耗优化(6)---如何确定阻止进入suspend的原因

    如何确定阻止进入suspend的原因 系统没有进入suspend,主要的原因是因为系统有锁导致. 锁一般分为:APP透过PowerManager拿锁,以及kernel wakelock. 分析上层持锁 ...

  2. android功耗优化,Android功耗测试小工具集锦

    {,](cpGs,uQ0电池时间一直是移动无线设备设计中的关键因素.随着移动设备变得越来越小.越来越轻,使用大电池并不是好的选择.分析电池耗电量可以帮助优化这些设备的电池工作时间.功耗,指的是终端各个 ...

  3. Android 功耗优化(4)---android 7.0低电耗Doze模式

    android 7.0低电耗Doze模式 从 Android 6.0(API 级别 23)开始,Android 引入了两个省电功能,可通过管理应用在设备未连接至电源时的行为方式为用户延长电池寿命. 低 ...

  4. Android 功耗优化(1)----使用Battery Historian生成电量消耗报告

    性能优化之电量优化-使用Battery Historian生成电量消耗报告 1 数据准备 1.1 先断开adb服务,然后开启adb服务 (a)adb kill-server 1 这一步很重要,因为当我 ...

  5. Android 功耗优化(3)---Android后台调度与省电

    Android后台调度与省电 I. Handler: 在进程存活的期间有效使用, Google官方推荐使用. 相关机制可以参见: Android Handler Looper机制 简单易用. 稳定高效 ...

  6. android功耗优化(2)--对齐唤醒

    概况 Android手机上安装的很多应用都会频繁唤醒手机(唤醒系统.唤醒屏幕),造成手机耗电等现象.良好的对齐唤醒管理方案,就是对后台应用待机时不频繁唤醒,智能节省电量. 实现原理:APK作为该功能的 ...

  7. Android 功耗优化(13)---功耗基础知识

    SODI (screen on deep idle) 背景知识---SODI SODI跟deep idle类似,是SPM的另外一种工作模式 SODI:Screen On Deep Idle SODI的 ...

  8. Android功耗优化(10)---功耗基础知识

    SPM SPM以及时钟请求信号控制流程 因为整个系统不只是AP(MCU),还包括modem.connectivity等子系统: CPU进入WFI后,整个系统就依靠一颗SCP:SPM来控制睡眠/唤醒的流 ...

  9. Android系统性能优化(54)---Android性能分析专题

    Android性能分析专题 1.  背景:Android App优化, 要怎么做? 2.  Android App优化之性能分析工具 3.  Android App优化之提升你的App启动速度之理论基 ...

最新文章

  1. 东北大米为何如此好吃
  2. 根据Android架构分层推荐开发书籍
  3. html5 video全屏api,H5+ app使用多媒体(video、webview)API视频展示以及全屏
  4. golang字符串类型及使用细节
  5. DCMTK:测试DcmSCPPool类,包括DcmSCP和DcmSCU交互
  6. Python自动化办公之Excel对比工具
  7. linux 应用层时间和随机数,zigbee cc2530时间
  8. imx8m开发板资料
  9. [转]想要成为一名优秀的Java程序员,这份文档必读
  10. sublime python插件配置_sublime text 3 + python配置,完整搭建及常用插件安装
  11. ubuntu下安装php openssl扩展
  12. 关于电脑安装多个版本JDK后使用时的切换
  13. 将10个成绩排序java程序_快速排序——成绩排序
  14. Forrester报告:人工智能将取代6%的工作岗位
  15. IOS 状态栏 显示与隐藏网络活动状态
  16. 【数字信号调制】基于matlab GUI数字信号调制仿真系统【含Matlab源码 336期】
  17. [原创]把vscode的快捷键json配置批量导入微信小程序开发工具
  18. bcm5396交换机级联配置_工业以太网交换机的专业术语汇总
  19. centos网络显示已连接但无法打开网页
  20. FPGA always 和assign 用法

热门文章

  1. linux中split函数用法,Linux split命令参数及使用方法详解
  2. 单一课和综合课的划分依据_缠论108课第105课:股票的操作中远离小聪明,保持机械性的操作...
  3. linux关于权限、目录、重要的指令以及如何使用包管理器
  4. 嵌入式Linux系统编程学习之二十六多线程概述
  5. 【设计模式】第三章 单例模式
  6. 根据函数名称调用函数
  7. MS Server中varchar与nvarchar的区别
  8. JSP 九大内置对象详解
  9. C# - 多线程(基础)
  10. POJ 1986:Distance Queries(倍增求LCA)