你好!这里是风筝的博客,
欢迎和我一起交流。
其实我们知道,在手机里面,除了相机和整机性能,还有一个用户最关键的地方:功耗。
功耗一直是用户在意的地方,如果用户用手机发现耗电耗得飞起,那估计在 上能把人喷死。
所以这里,抛砖引玉,放一个数字耳机播放音乐功耗高的问题解析,仅供学习参考。
背景
【前提条件】飞行模式,默认音量,手动息屏
【操作步骤】
1.手机插入数字耳机,关闭音效,调节到默认媒体音量
2.打开音乐播放器,添加《测试专用音乐.mp3》到播放列表
3.点击播放歌曲2秒内手动息屏,播放45秒后记录播放2分钟的平均电流
音效开关位置:设置——声音与振动——全局音效(此处不同手机音效名字可能不一样)
【实际结果】测试版本S比R对比版本大32.4mA
【期望结果】测试版本与对比版本相差在3mA之内
这里解释一下,同一台手机,在从Android R升级Android S,升级之后,S版本上数字耳机播放音乐场景,比原先在Android R上多了32mA。
功耗拆解
因为都是用的同一台手机,所以硬件是一样的配置,功耗可以排除由硬件引起。
使用功耗板进行功耗数据拆解:
为了进一步测试功耗是否由C2编解码器引起的,做了一个实验,将MP3文件转换为WAV格式去播放,这样可以避免音乐文件进行解码。
对比测试,播放WAV和 MP3功耗差异在20mA 左右,并没有发现功耗有明显下降,可以确定多出来的功耗应该不是 decoder 造成的(对于硬解码负载增加功耗增益, MTK做过1080P30fps 视频播放, C2架构比OMX最多大5ma)。
但至少得出,播放MP3音乐比播放WAV格式音乐会多出10mA左右功耗,但不是本题的主要根因。
再次和测试沟通,发现同场景下,模拟耳机没有功耗问题,只有数字耳机存在问题。
这个就比较有意思了,因为在音频服务层framework代码里,是不区分模拟耳机和数字耳机的,它俩的播放流程是一致的!
再次抓取数字耳机场景下Android S和Android R两份systrace对比结果(左边S右边R):
Mix线程数字耳机S比R开销大:
此时到这里又觉得奇怪了,功耗拆解出来表示功耗差异主要由CPU引起,主要是在上层,(底层代码一般只做HW enable,是硬件功耗,不是CPU功耗),而且两次抓的systrace差异非常大,很不稳定,cpu loading表现完全不同。但总loading显示S负载还要低于R,所以功耗差异不应该在CPU上才对,这和功耗拆解出来的结论相互矛盾。
底层排查
不过问题还要继续分析,当前上层基本排查完毕,开始排查底层,使用tinyplay播放音乐测试,这样可以屏蔽上层差异,tinyplay播放这样只涉及底层音频驱动,结果…
发现tinyplay播放音乐场景,Android S和Android R上数字耳机功耗差异不大,大概在2-3mA左右,基本排除底层驱动和硬件原因。
此时上层和底层都排查完毕,还是没发现问题出在哪里…
CPU的差异
基于硬件提供的功耗拆解,耗电差异主要在CPU上,结合之前说过感觉systrace抓的有点问题,决定还是继续抓取systrace分析。
这次使用脚本和adb命令来抓取systrace,放到chrome://tracing/去分析!
多次试验然后抓取systrace发现,对比线程之间消耗差异不大,没有发现某个线程开销比较大。
不过从systrace可以看出:
这就比较耐人寻味了。
进一步实验发现,在Android S上,每次刷机完成之后,只要尽快息屏进行功耗测试,那么功耗就是正常的,功耗和Android R上一致,不管放多久只有不亮屏都是正常的,只要手机一从息屏变为亮屏且解锁之后,再次测试,功耗就变得异常了,也就是会比Android R上多出32mA:
好家伙,就我搁这分析了好几星期,结果还不是audio的锅,又给人擦屁股了,窝不响丸了!!!
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!