极力推荐Android 开发大总结文章:欢迎收藏
程序员Android 力荐 ,Android 开发者需要的必备技能
本篇文章主要介绍手机开发中的功耗部分知识点,功耗直接影响到手机的待机时间,通过阅读本篇文章,您将收获以下内容:
一、手机功耗问题浅析博文
二、Sleep 、suspend
三、SPM (System Power Manager)
四、Deep idle
五、SODI (screen on deep idle)
六、systrace/ftrace
七、wireshark
八、layerdump
九、如何确定阻止进入suspend的原因
十、如何分析wakelock(wakeup source)持锁问题
十一、如何看SPM的状态是否正确
十二、如何查找待机唤醒源
十三、如何找到阻止进入deep idle / SODI的元凶
手机功耗问题直接影响到手机的待机时长,因此,解决功耗篇问题对于智能机十分必要。
之前有写过一个功耗浅析的文章,可以先参考下:
手机功耗问题浅析博文
这里的确切的说是的 ,也就是进入状态();因为对整个系统来说,进是整个系统睡眠的先决条件,我们也是从是否进入开始,从的角度来说,进入就是完全不跑了,停在里面。
从灭屏到进入的大体流程框架如下:
从灭屏到`CPU`进入suspend的大体流程框架
相关code路径:
因为整个系统不只是,还包括等子系统;
CPU 进入 WFI 后,整个系统就依靠一颗 来控制睡眠/唤醒的流程,它会去关注各个子系统的状态
SPM =System Power Manager
它掌控着之后系统是否能掉到最小电流的关键逻辑,你可以把它理解成一个投票机制,当系统的关键资源()没有任何人使用的时候,它就会让系统进入一个真正的深睡状态(最小电流)只要它检测到有任何资源请求还没释放,系统就无法降到底电
所以在底电问题上的流程中,我们不仅仅要看有没有成功,还要看的状态是否正确,里面有一个可编程控制器。在进去之前会把的写入,然后就依据的逻辑来控制的工作
跟强相关的一个东西就是系统中的时钟请求信号,也就是时钟开关的控制逻辑;因为系统工作在最小电流的时候,只依靠时钟工作;因此要判断系统是不是已经到深睡状态,就要看有没有关闭
时钟的控制逻辑概要如下图
26M 时钟控制逻辑
所以从上图我们就可以看到, 有没有关,就只要看这个信号有没有关闭;而对这个信号的输出以及子系统的信号输入,都会记录在的寄存器里面,这个就是我们通过排查的依据
代码路径
Deep idle 基本概念
首先顾名思义,这是一种进入空闲后的状态,也就是在进程中执行的
简单地说,会在进入空闲的情况下,再去关闭一些不必要的,以达到最省电的目的,因为空闲的时候,其实系统中有不少的也是不需要运行的,不这样做的话,就仅仅是这块的电省下来 ,达不到省电的目的。
Mediatek的做法是在在进入进程后,会去判断当前系统的状态是否满足进入更省电状态的条件,首先就会检查是否能进入,因为dpidle最省电
系统进入dpidle需要满足的条件是
- 单核(BY_CPU)
- 预设的能block deep idle的所有clock都已经关闭(BY_CLOCK)
- CPU在2ms内没有从idle task调度出去的需求(BY_TMR)
- BY_VTG / BY_OTH的case很少(BY_OTH在个别平台跟TEE(SPI指纹模块)有关)
我们可以从波形上检查系统是否进入deep idle
下图中电流的底部就是的状态,在播放的状态大约;
如果没有进,这个底部会被抬高
deep idle的状态
也是由来控制它的执行逻辑,跟一样,在进去之前会把的写入,这个跟是完全不一样的。
SODI:Screen On Deep Idle
跟类似,是SPM的另外一种工作模式.的进入条件跟 是类似的,区别只是要检查的跟不完全一样 ,对功耗的影响相对于是不一样的
前面讲过了的差别,其实就很容易理解这一点:因为下,CPU不用送数据出去,因此可以不用送,这整条路径上的东西都可以关闭,而且跟VDO相比也可以做更多省电的;所以对的省电效果会比VDO的效果更明显,是否进入SODI也可以从波形上明显地看到:
下图示的波形比较
CMD mode:SODI on(左) vs SODI off(右)
CMD mode
VDO mode:SODI on(左) vs SODI off(右)
VDO mode
重点关注波形的形状,电流下降的数值不同平台不一样
也是我们分析功耗问题常用的工具,可以帮你定位到是谁在使用CPU,也可以用来分析idle状态下的毛刺波形是谁触发的,来定位。
为什么要使用
是我们用来分析的一个工具.通常用来定位开数据连接的待机功耗问题,查找是哪个在使用数据可以在公共网络上下载到,一般公司负责这些部门也会有这个工具
怎么使用
首先需要在抓时,打开中的,就可以找到对应的文件
netlog
用打开这个文件,界面如下
用wireshark打开这个.cap文件
有时候最前面的【时间戳】格式会不对,会跟对不上,如果遇到了,可以通过如下菜单调整
时间戳格式
查看图层的 命令:
下面是界面的图层:
launcher的图层
系统没有进入,主要的原因是 因为系统有锁导致.
锁一般分为:
- 通过拿锁,
- 以及.
分析上层持锁的问题:
目前的log 默认不会打开,可以通过修改:
通过:搜索关键字:total_time= 来确定持锁的时间.
的锁默认不会打印出来,一般是待机结束后通过节点来获取:
一般情况下:
如果是复现机,前面没有捉,也没有,只有一份
可以看下,一般时间越大越可能是阻止系统进入的.
如果测试前后,都有捉 请对比两份的的差值.
差值时间跟灭屏的时间对得上,一般就是这个锁引起的问题.
比两份`wakeup_sources.log`的`total time`的差值
把捉出来的复制到表格中,比较好对齐,一个是比较好计算.
image.png
其中,的时间有 也就是总共有
image.png
或者在待机测试结束后通过命令:
底层的锁:
上层的锁:
待机被唤醒之后,确认:大部分最后的bit位是不是 f or ff, 说明系统还有模块咬住,系统并没有最后进入真正的.
譬如下面的 最后 位是 0 都是有问题的:
0
0
系统场景的唤醒源如下:
- EINT
- CONN
- CLDMA
EINT:
PMIC的唤醒.
-
a.Powerkey
唤醒后面的会有 pwrkey_int_handler -
b. rtc alarm
唤醒后面的会有 alarm time is up
rtc alarm
具体类型的唤醒包,可以确认:
从里面搜索关键字 wakeup alarm:
wakeup alarm
一般的唤醒,除了第三方APK之外,有时会遇到类似的唤醒.
确认具体android的唤醒的原因,需要确定唤醒后,紧接着发下来的事件.
Broadcast: Intent { act=android.content.syncmanager.SYNC_ALARM· flg=0x114 (has extras) } ordered=true userid=0 callerApp=null·
搜索:android.content.syncmanager.SYNC_ALARM ,可以定位到:
进一步找对应owner确认.
phone apk的唤醒:
数据网络的定时恢复.
- c. others
有关键字:EINT.is pending*
序号:,,需要结合DCT跟cat /proc/interrupts
1.通过DCT:
通过DCT
2.对应的序号是
CLDMA:
确认唤醒的,关键字:CLDMA_MD, wakeup source
CLDMA 唤醒源确认
常用的唤醒的channel:
[channel 10]:
channel 10
常见的AT command的唤醒:参考下面【常见AT 命令解析】
[channel 14]
一般是跟一起产生,小区消息变化,会记录小区的信息到.
[channel20/24]
数据连接的唤醒.
channel20/24
使用打开
winshark
main log里面搜索IP 地址:
[channel32]
获取状态所造成的唤醒. 这部分情况比较少,确认贵司是否有相关的
[channel34]
跟有部分频段是重叠的,需要把频段的信息通知所造成的唤醒. 这部分属于正常的
[channel55]
网络的唤醒.
[channel6/42]
这是打开造成的,分析功耗问题除非发现跟有关系,否则捉时,不要打开modem log
具体的channel 对应的定义可以参考:
N版本:
L版本:
/kernel-3.10/include/mach/mt_ccci_common.h
[channel 14与10]常见AT 命令解析,注意红色字体部分字段
网络切换状态AT:
信号强度相关AT:
网络注册状态AT:
网络VOLTE支持情况上报:
image.png
如果是由于CLOCK 卡住,请参考下面的flow:
Debug节点:/sys/kernel/debug/cpuidle/
从节点中确认:/sys/kernel/debug/cpuidle/dpidle_state
其中里面的数值对应的bit位为的,代表对应的卡住系统进入省电idle了.
从上图看:
以此类推
N版本对应平台的clock ID:
cg_clk_id
至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!
如有侵权,请联系小编,小编对此深感抱歉,届时小编会删除文章,立即停止侵权行为,请您多多包涵。
既然都看到这里,领两个红包在走吧!
以下两个红包每天都可以领取
1.支付宝搜索 522398497,或扫码支付宝红包海报。
支付宝扫一扫,每天领取大红包
2.微信红包,微信扫一扫即可领取红包
微信扫一扫,每天领取微信红包