###Android设备功耗调试简述
重点内容
本文记录了调试Android小型设备功耗的全过程,并且成功降低设备功耗,转载请注明出处。
一 Android设备功耗概述
二 功耗调节
.
###一:Android设备功耗概述
所有便携式的Android设备都会对设备的功耗提出要求,尽量在最快的运行速度的情况下,降低电池的消耗,降低设备温度。 本文所描述的设备功耗具体是包含Android智能手机,Android智能手表等小型便携式Android设备。 根据行业内部默认水准,我列出如下几条功耗要求:
1 设备整机(插SIM卡,拔除USB线)待机功耗的最小电流调节之3mA左右
2 设备连接后台数据的情况下待机每小时平均功耗 < 10mA(严格的说是 7mA)
3 依据设备电池容量限制设备充电功耗
4 设备通话10分钟~20分钟后的温度一般限制在45度以下
###二:功耗调节
本人调试的是 Android智能手表,Android智能手机情况类似,根据调试要求,我分为以下四个方向调节设备功耗
1 设备整机(插SIM卡,拔除USB线)待机功耗的最小电流调节之3mA左右
2 设备连接后台数据的情况下待机每小时平均功耗 < 10mA(严格的说是 7mA)
3 依据设备电池容量限制设备充电功耗
4 设备通话10分钟~20分钟后的温度一般限制在45度以下
#####2.1 设备整机待机最小功耗调节
确认设备整机(有sim卡的插上卡),测量待机最小电流,如果发现待机最小电流 大于3mA很多,就要逐步排查问题所在了,以下是我总结的两个方向:
1 硬件方向:逐步拔出外设,比如 TP LCD Camera等基本外设,这种方式简单粗暴,很容易定位功耗消耗源所在,比如我遇到的问题就是TP在待机的时候消耗电池,是某个引脚漏电。
2 软件方向:
第一部分:抓取Android电池消耗记录,查看CPU唤醒源。此处要介绍一个工具Battery Historian,这是一款由Google提供的Android系统电量分析工具. 在网页中展示手机的电量消耗过程, 输入电量分析文件, 显示消耗情况. 最后提供一些电量优化的方法,关于此工具的安装方式,网上或者我在另一个博客中有详细说明,需要的话请挪步查看。此处会介绍此工具的使用方式以及功能。
第二部分:关核降频
第一步:插上usb线,先断开adb服务,然后开启adb服务
(1)adb kill-server
(2)adb start-server
第二步:重置电池数据、收集数据
(3)adb shell dumpsys batterystats --enable full-wake-history
(4)adb shell dumpsys batterystats --reset
第三步:拔出usb线,避免其他不必要的影响,等待Android系统内部工具记录设备电池消耗过程,等待时间根据个人情况而定,我一般等待1小时,中间确保设备没有亮屏操作。
第四步:插上usb线,收集设备电池消耗情况,并且将文档转化为html文件。
(5)adb bugreport > bugreport.txt
(6)python historian.py -a bugreport.txt > battery.html
第五步:翻墙,用google浏览器打开battery.html,表格类似如下:
第六步:根据自己的图表信息,分析cpu被唤醒原因,如果一直被唤醒,就无法进入休眠,肯定会耗电的,关闭其中可关闭的不重要的唤醒源。
第七步:
如果以上步骤还没有有效的降低你的设备功耗,那只有关核降频了,根据自己的平台,关闭锁屏默认开启的cpu数量以及降低ddr频率,我使用的是高通平台msm8909,msm8909默认开启2个CPU。此处就要说明关核降频的方式了,刚开始我用网上的方式通过adb shell 命令关核调频,但是没效果,具体原因不详,所以只好选择在代码里写死开启CPU的数量了,如下:
######7.1
此处CPU数量最少只能关闭至剩下2个核:“Maximum number of CPUs (2-32)”
kernel/arch/arm/Kconfig
config NR_CPUS
int “Maximum number of CPUs (2-32)”
range 2 32
depends on SMP
default “4”
如果想关闭只剩下一个核,我是这样改的:
kernel/kernel/cpu.c
int __cpuinit cpu_up(unsigned int cpu)
{
在开始处加:
if(cpu > 0)
{
return -EINVAL;
}
}
######7.2
如果关闭到只剩下2个核或者一个核还是没有改变功耗过高的状况,可是尝试修改cpu的频率,此处介绍关于 adb shell 调节cpu频率的方式:
1 查看当前cpu cpu0频率的选择范围
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
2 查看当前cpu cpu0的当前最大频率
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
3 查看当前cpu cpu0的当前最小频率
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
4 查看当前cpu cpu0的运行频率
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
6 关闭/打开 cpu0, 查看cpu0状态
echo 0 > /sys/devices/system/cpu/cpu0/online
echo 1 > /sys/devices/system/cpu/cpu0/online
cat /sys/devices/system/cpu/cpu0/online
7 写cpu cpu0的频率
echo 1094400 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
如果想在代码中写死 cpu频率可以在设备树中写死,高通平台的位置如下:
kernel/arch/arm/boot/dts/qcom/msm8909.dtsi
qcom,msm-cpufreq {
reg = <0 4>;
compatible = "qcom,msm-cpufreq";
clocks = <&clock_cpu clk_a7ssmux>,
<&clock_cpu clk_a7ssmux>,
<&clock_cpu clk_a7ssmux>,
<&clock_cpu clk_a7ssmux>;
clock-names = "cpu0_clk", "cpu1_clk",
"cpu2_clk", "cpu3_clk";
qcom,cpufreq-table =
// < 200000 >,
// < 400000 >,
// < 533330 >;
< 800000 >;
// < 998400 >;
// < 1094400 >;
// < 1190400 >,
// < 1248000 >,
// < 1267200 >;
};
#####2.2 设备连接后台数据的情况下待机每小时平均功耗 < 10mA(严格的说是 7mA)
和2.1一样,待机功耗降下来之后,一般情况下,平均功耗也会降下来。
#####2.3 依据设备电池容量限制设备充电功耗
2.3 依据设备电池容量限制设备充电功耗
限制充电电流,在代码中可以限制,高通msm8909平台修改两处即可:
kernel/arch/arm/boot/dts/qcom/msm-pm8909.dtsi
kernel/arch/arm/boot/dts/qcom/msm8909-pm8909-mtp.dtsi
kernel/arch/arm/boot/dts/qcom/msm8909-pm8909-mtp.dtsi
&pm8909_chg {
qcom,vddmax-mv = <4350>;
qcom,vddsafe-mv = <4380>;
qcom,vinmin-mv = <4470>;
qcom,ibatmax-ma = <250>;//充电电流限制250mA
qcom,batt-hot-percentage = <25>;
qcom,batt-cold-percentage = <80>;
qcom,tchg-mins = <360>;
qcom,chgr-led-support;
status = "okay";
};
kernel/arch/arm/boot/dts/qcom/msm-pm8909.dtsi
pm8909_chg: qcom,charger {
spmi-dev-container;
compatible = "qcom,qpnp-linear-charger";
#address-cells = <1>;
#size-cells = <1>;
qcom,vddmax-mv = <4200>;
qcom,vddsafe-mv = <4200>;
qcom,vinmin-mv = <4308>;
qcom,ibatsafe-ma = <250>;//充电电流限制250mA
...
...
}
#####2.4 设备通话10分钟~20分钟后的温度一般限制在45度以下
这一项主要的温度来源于射频,在调节测试的时候不要连接usb线,会增强信号;
注意:本文没有说明 ddr的修改,因为我改了上面之后功耗就降了不少,所以此处不贴
后期遇到 后台进程唤醒cpu 后,需要25s才能睡眠的问题,过长的休眠时间导致功耗无法降到需求标准。
了解一下 android 休眠机制 weak_lock
相关命令 :
cat /sys/kernel/debug/wakeup_sources
dumpsys power
相关开关:
1
将CONFIG_PM_DEBUG=y
CONFIG_PM_SLEEP_DEBUG=y
这个两个宏定义在你们的kernel config文件中打开
2
DeviceIdleController.java updateConstants这个方法中的一些默认值的调整
3
确认config_enableAutoPowerModes这个值是否打开
config_enableAutoPowerModes