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的修改,因为我改了上面之后功耗就降了不少,所以此处不贴

猜你喜欢

转载自blog.csdn.net/LinuxArmbiggod/article/details/80623186
今日推荐