Android设备功耗调试简述

###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

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linux老A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值