-
2019-09-04 14:25:39
Andorid功耗分析(0)功耗基础
Android功耗分析(1)功耗分析方法和优化
Andorid功耗分析(2)高通平台功耗优化基础
Android功耗分析(3)高通功耗问题分析
Android功耗分析(4)MTK平台待机功耗分析流程
Android功耗分析(5)功耗调试方法
Android功耗分析(6)整机功耗测试
Android功耗分析(7)思维导图
Android功耗分析(8)Camera功耗分析与拆解
Android功耗分析(9)MTK平台功耗问题分析
Android功耗分析(10)MTK各场景功耗数据测试
Android功耗分析(11)功耗分析之WakeLock
Android功耗分析(12)省电续航-相互唤醒
Android功耗分析(13)sleep和suspend
Android功耗分析(14)睡眠时大电流debug处理
Android功耗分析(15)功耗分析之系统耗电
Android功耗分析(16)自启动管理
Android功耗分析(17)省电续航-AAL 屏幕内容省电
Android功耗分析(18)省电和提高效率
Android功耗分析(19)LCD背光驱动节电技术-LABC/CABC
Android功耗分析(20)后台调度与省电
Android功耗分析(21)MTK低功耗
Android功耗分析(22)MTK功耗问题分析
Android功耗分析(23)功耗相关因子
Android功耗分析(24)不待机分析
Android功耗分析(25)使用Battery Historian生成电量消耗报告更多相关内容 -
工作积累(11)-android功耗分析
2019-04-09 01:09:13NULL 博文链接:https://410063005.iteye.com/blog/1624334 -
Android唤醒锁检测及功耗优化机制
2021-05-06 12:45:08Android操作系统提供了唤醒锁机制用于避免系统进入休眠状态.但若存在唤醒锁的误用,将导致设备能耗的加剧并严重影响用户体验.本文分析总结了常见的唤醒锁误用类型及原因,并实现了一款安卓应用,用以检测当前系统中... -
android 功耗(1)---android 功耗分析方法和优化
2019-02-22 10:35:49可以采用功耗问题时间追踪表来精确追踪功耗异常。 可以使用如下命令来打开指定文件的kernel log(以qpnp-adc-tm.c和qpnp-adc-common.c为例): adb shell mount -t debugfs none /sys/kernel/debug ...1、底电流调试(Rock Bottom Current Optimization)
底电流在手机飞行模式下调试。每个平台的底电流数据可能不一样,具体可以参考release出来的Current Consumption Data文档或者release note。一般情况下的底电流参考数据上限是:
512M RAM < 1.5mA; 1G RAM < 2mA; 2G RAM < 2.6mA
1.1校准RF
保证RF的PA、Antenna switch、Tuner、APT、GPIO工作在正常状态
1.2飞行模式
开启飞行模式、关闭GPS、关闭自动旋转屏幕、关闭自动亮度调节、关闭其他特效效果设置
开启飞行模式,可以基本避免蓝牙、wifi、NFC、网络、FM等的一般影响;
关闭GPS,可以基本排除开启GPS对底电流的影响;
关闭自动旋转屏幕,可以基本排除sensor的影响;
关闭自动亮度调节,可以基本排除距离感应到的影响;
关闭其他特效效果设置,如指纹识别、黑屏手势、智能体感、手势隔空操作。。。。。。
1.3使用perf_defconfig
修改device/qcom//AndroidBoard.mk。如果KERNEL_DEFCONFIG := _defconfig,那么改成KERNEL_DEFCONFIG := -perf_defconfig
同时,kernel代码改用/kernel/arch/arm/configs/-perf_defconfig
是平台名称或者项目名称
1.4移除debugging APKs
/system/app/Logkit.apk
/system/app/com.qualcomm.qlogcat.apk
/system/xbin/qlogd
1.5把应用尽量删除
在设置-->应用,禁用正在运行的应用
1.6去掉CPU占用高的进程
adb shell
top
查看CPU占用,去掉在休眠模式下CPU占用大于0的进程。kill掉该进程,若kill不掉则rm掉相关应用。对于占用CPU高的kwork,需要查找驱动原因。
1.7手动移除所有可以移除的外设
手机连上安捷伦电源,手机开机,然后让手机进入待机状态。手动移除TP、LCM、前camera、后camera、sensor、SD卡、SIM卡等可以手动移除的外围器件,同时观察并记录底电流变化。
直接移除WLAN芯片可能会导致开不了机,所以在移除WLAN之前,先对软件做如下处理:
# mount -o rw,remount -t vfat /dev/block/bootdevice/by-name/modem
# cd /firmware/image
# rm wcnss.*
# reboot
或者
#lsmod
#rmmod WLAN
移除其他可以移除的芯片(sensor、NFC。。。)
1.8移除驱动模块
在/kernel/arch/arm/configs/-perf_defconfig中把sensor、TP、LCM、camera等的驱动模块移除;
或者在对应驱动的Makefile里面,移除驱动代码
然后编译bootimage,烧入手机观察底电流变化
1.9配置不用的GPIO
将不用的GPIO置为输入、拉低;配置成SPI、I2C的GPIO,若不用,置为悬空
在boot_images/core/systemdrivers/tlmm/config/platform/TLMMChipset.xml,修改GPIO配置。该处配置GPIO的初始状态,驱动有可能会修改GPIO。
对比项目原理图与平台参考原理图,项目原理图中多出的NC GPIO要处理掉。
1.10检查power相关的NV items
需要跟CE确认。一般如下:
1027 = 0
1895 = 0
1892 = 0
1962 = 0
4679 = 16
4201 = 0
3851 = 0
3852 = 6
7157 = 1
69745 rxd_enable = 0
WCDMA NV:
NV3581 = 0
NV3852 = 6
1.11排查GPIO、LDO、总线
对比项目原理图与平台参考原理图,排查硬件不一样的GPIO、LDO、总线配置。
量测各GPIO、LDO、I2C在休眠时候的电压,需用万用表准确测量。
休眠时各路I2C GPIO的电压是多少v,用万用表准确测量。
如果条件允许,测量所有LDO在休眠前和休眠后的准确电压。
对于LDO,调试方法如下:
(1)adb shell关闭LDO
如关闭L3:
cd /sys/kernel/debug/regulator/8916_l3/
echo 0 > enable
(2)LDO太多设备用到,不适合用adb shell来关。可以这样调试:
cat /sys/kernel/debug/regulator/8916_l6/consumers
shell@msm8916_32:/sys/kernel/debug/regulator/8916_l6 $ cat consumers
Device-Supply EN Min_uV Max_uV load_uA
0-000c-vio Y 1800000 1800000 0
0-0068-vi2c N 1800000 1800000 0
5-0038-vcc_i2c Y 1800000 1800000 0
1a98000.qcom,mdss_dsi-vddio N 1800000 1800000 100
1a98300.qcom,mdss_dsi_pll-vddio N 1800000 1800000 100
8916_l6 N 0 0 0
这样就可以看到是哪些设备请求了LDO6。然后 找到对应的代码,在休眠时关掉LDO,唤醒时再打开。
0-000c: 挂在I2C0上地址为0xc
5-0038: 挂在I2C0上地址为0x38
查看这两个设备的驱动代码是否有执行regulator_enable。
(3)通过寄存器地址关闭LDO
如LDO6的地址是0x14546,则关闭方法是:
# cd /sys/kernel/debug/spmi/spmi-0
# echo 0x14546 > address
# echo 1 > count
# cat data 可以读寄存器
# echo 0x00 > data 关LDO6
(4)关闭MPP
在休眠前关闭MPP1、MPP2、MPP3、MPP4
如PM8916的寄存器地址分别是0xA046、0xA146、0xA246、0xA346
在关闭前先cat data以查看原来的值。
GPIO状态读取的方法如下:
(1)GPIO dump
为了得到休眠时的GPIO状态,增加下面的打印:
rpm_proc/core/power/sleep/src/lpr_definition_uber.c
#include "tlmm_hwio.h"
void deep_sleep_enter(void)
{
uint64 sleep_duration;
...
SWEVENT(SLEEP_DEEP_SLEEP_ENTER_COMPLETE, sleep_mode.deep_sleep_mode, sleep_duration);
// For test
{
int num;
int i=11;
volatile uint32 cfg ,inout, val;
num = 122; //8916 only. Need modify for 8974/8x10/8x26 etc.
cfg = *(volatile uint32*)HWIO_TLMM_GPIO_CFGn_ADDR(i); //(0x61000000 + i * 0x1000)
inout = *(volatile uint32*)HWIO_TLMM_GPIO_IN_OUTn_ADDR(i);//(0x61000004 + i * 0x1000)
val = ((cfg << 16)&0xffff0000) | (inout&0xffff);
SWEVENT(SLEEP_GPIO_DUMP, i, val);
}
mpm_sw_done(sleep_mode.deep_sleep_mode, sleep_duration);
} while(FALSE);
}
增加for test下面这一段代码。
然后再修改:
rpm_proc\core\power\sleep\build\SConscript
if 'USES_QDSS_SWE' in env:
QDSS_IMG = ['QDSS_EN_IMG']
events = [['SLEEP_DEEP_SLEEP_ENTER=320','deep sleep enter. (sleep mode: %d) (count: %d)'],
['SLEEP_DEEP_SLEEP_EXIT','deep sleep exit (sleep mode: %d)'],
['SLEEP_NO_DEEP_SLEEP','bail early from deep sleep. (sleep mode: %d) (reason: %d)'],
['SLEEP_RPM_HALT_ENTER','rpm halt enter'],
['SLEEP_RPM_HALT_EXIT','rpm halt exit'],
['SLEEP_MPM_INTS','pending mpm interrupts at wakeup: (interrupt_status_1 %d), (interrupt_status_2 %d)'],
['SLEEP_DEEP_SLEEP_ENTER_COMPLETE','deep sleep exit complete (sleep mode: %d)'],
['SLEEP_DEEP_SLEEP_EXIT_COMPLETE','deep sleep exit (sleep mode: %d)'],
['SLEEP_MPM_WAKEUP_TIME','mpm wake up time (wakeup time: 0x%0.8x%0.8x)'],
['SLEEP_GPIO_DUMP','gpio [%d] configuration is %d'],
['SLEEP_EVENT_LAST=383','sleep last event placeholder']
增加SLEEP_GPIO_DUMP这一项。
编译烧写rpm.mbn。
让机器休眠,进入download,抓dump,然后将如下日志发给平台技术支持分析。
CODERAM.bin
MSGRAM.bin
DATARAM.bin
以及新编译出来的RPM_AAAAANAZR.elf。
(2)GPIO寄存器读取
在RPM可能不是很方便,也可以用busybox来读取寄存器,例如读GPIO11:
Physical Address for GPIO_CFG11 = 0x100B000
root@android:/data/busybox # ./busybox devmem 0x100B000 32
./busybox devmem 0x100B000 32
0x00000203
GPIO_PULL = "11" PULL_UP
FUNC_SEL = "0000" FUNCTION GPIO
DRV_STRENGTH = "000" DRV_2_MA
GPIO_OE = "1" Output Enable
1.12 rpm dump
抓rpm dump,然后把log提供给平台技术支持。
方法如下:
(1)ps_hold接地
在休眠状态下,接ps_hold到地少于200mS,机器会进入紧急下载状态,插入USB,QPST会自动得到memory dump,然后上传以下几个文件:
CODERAM.bin
MSGRAM.bin
DATARAM.bin
以及RPM_AAAAANAZR.elf(必须与机器的编译时间一致匹配的elf)
(2)改reset为download key
发这些命令改reset为download key:
# cd /sys/kernel/debug/spmi/spmi-0
# echo 0x844 > address
# echo 4 > count
# cat data
00840 -- -- -- -- 0F 07 04 00
# echo 0x00 0x00 0x01 0x00 > data
# cat data
00840 -- -- -- -- 00 00 01 00
# echo 0x00 0x00 0x01 0x80 > data
# cat data
00840 -- -- -- -- 00 00 01 80
然后长按下键,会进入download。之后抓取log方法同上。
如果进不了download,需要确认:
CONFIG_MSM_DLOAD_MODE=y
另外也有可能与nv 4399和905有关系。
1.13检查rpm_stats
检查rpm_stats是否进入vdd min或者xo/no shutdown。使用下面的命令检查rpm lower power mode count:
cat /sys/kernel/debug/rpm_stats
如果vmin的count是0,则表明设备从来没有进入vdd min;non-zero则说明设备进入过vdd_min。
RPM Mode: xosd
count:0
time in last mode(msec):0
time since last mode(sec):794
actual last sleep(msec):0
RPM Mode:vmin
count:11
time in last mode(msec):0
time since last mode(sec):359
actual last sleep(msec):110000
1.14使用Trace32
可以dump出来完整详细的gpio/clk/pmic信息,排除休眠时候的状态异常。
2、待机电流优化(Standby Current Optimization)
2.1通过adb log排查
adb logcat -v time > YearMounthDayHourMinute_logcat.txt //main log
adb logcat -v time -b events > YearMounthDayHourMinute_logcat_event.txt //event log
adb logcat -v time -b radio > YearMounthDayHourMinute_logcat_radio.txt //radio log
adb shell dmesg > YearMounthDayHourMinute_dmesg.txt //kernel log
可以采用功耗问题时间追踪表来精确追踪功耗异常。
可以使用如下命令来打开指定文件的kernel log(以qpnp-adc-tm.c和qpnp-adc-common.c为例):
adb shell mount -t debugfs none /sys/kernel/debug
adb shell "echo 8 > /proc/sys/kernel/printk"
adb shell "echo 'file qpnp-adc-tm.c +p' > /sys/kernel/debug/dynamic_debug/control"
adb shell "echo 'file qpnp-adc-common.c +p' > /sys/kernel/debug/dynamic_debug/control"
adb shell "echo 8 > /proc/sys/kernel/printk"
为指定的函数开启log,以qpnpint_handle_irq为例:
adb shell "echo 'func qpnpint_handle_irq +p' > /sys/kernel/debug/dynamic_debug/control"
*#logkit#*调出logkit apk,可以保存logcat、dmesg、crash、QXDM、GPU log等日志信息到手机里面。
2.2 top
通过top命令,可以查询到cpu占用较高的应用。如果一个应用一直在占用cpu,而此时并没有打开该应用,那么该应用很可能会导致待机异常。
adb shell
top
“该场景下CPU使用率”是User+System+IOW+IRQ
“模块相关的CPU占用率”是模块相关进程占用CPU使用率的总和
2.3正在运行
设置-->应用-->正在运行,可以看到正在运行的应用或者服务。禁止掉应用或者服务,观察待机电流变化。
2.4 wakeup debug mask
调试wakeup问题,可以使能debug功能,然后抓取log。Log中会增加一些debug信息。
mount -t debugfs none /sys/kernel/debug
echo 1 > /sys/kernel/debug/clk/debug_suspend
echo 1 > /sys/module/msm_show_resume_irq/parameters/debug_mask
echo 4 > /sys/module/wakelock/parameters/debug_mask
echo 1 > /sys/module/lpm_levels/parameters/debug_mask
echo 0x16 > /sys/module/smd/parameters/debug_mask
2.5 wakelock
1、wakeup_sources
kernel wakelock和userspace wakelock都有可能阻止系统睡眠。所有的wakeup_sources均保存在sys节点/sys/kernel/debug/wakeup_sources里面。
该文件包含了如下信息:
(1)the total amount of time a wakeup source has prevented suspend
(2)the amount of time a wakelock has been active since the last activation etc. The unit of time is milliseconds.
2、active_since
active_since值可以用来确认wakelock是否正在阻止休眠。如果该值不是零,那么这个wakelock正在工作并且阻止休眠。
3、获取wakeup_sources的命令
adb root 67754400
adb remount
adb shell
cat /sys/kernel/debug/wakeup_sources > /data/wakeup_sources.txt
adb pull /data/wakeup_sources.txt
获得wakeup_sources.txt以后,通过Excel打开,active_since不为0的项为wakeup source。以表2为例,msm_dwc3对应的active-since值481756>0,这意味着msm_dwc3驱动在阻止系统睡眠,下一步需要检查msm_dwc3驱动代码及相关log。
表格 2 Wakeup source opened in Excel
4、power:wakeup_source_activate and power:wakeup_source_deactivate events
当一个wakeup source被acquire或者release时候,power:wakeup_source_activate和power:wakeup_source_deactivate event将随即被写到trace buffer里面,这样可以记录wakeup source被driver使用的频率。
开启该功能的方法:
echo "power:wakeup_source_activate power:wakeup_source_deactivate" > /sys/kernel/debug/tracing/set_event
The power:wakeup_source_activate and power:wakeup_source_deactivate events are written to the trace buffer any time a wakeup source is acquired or released and it can provide information on how often a wakeup source is being used by a driver.
To enable these events, you can enable following:
echo "power:wakeup_source_activate power:wakeup_source_deactivate" > /sys/kernel/debug/tracing/set_event
Once the above done, the traces will be present in /sys/kernel/debug/tracing/trace.
2.6 powertop
powertop用来看CPU的运行统计以协助调试power问题。powertop的用法如下:
powertop --h
Usage: powertop [OPTION...]
n -d, --dump read wakeups once and print list of top offenders
n -t, --time=DOUBLE default time to gather data in seconds
n -r, --reset Reset PM stats data
n -h, --help Show this help message
n -v, --version Show version information and exit
获取powertop log的方法:
1. 通过USB连接手机到电脑
2. adb shell,然后执行如下命令:
sleep 10 && /data/powertop [-r] -d -t 30 > /data/powertop.log &
3. 拔掉USB线,等待10秒后开始功耗测试
4. 插上USB
5. adb pull /data/powertop.log
2.7 CPU freq log
打开CPU freq change log:
mount -t debugfs none /sys/kernel/debug
cd /sys/kernel/debug
echo -n 'file acpuclock-8x60.c +p' > dynamic_debug/control
echo -n 'file acpuclock-krait.c +p' > dynamic_debug/control
查看cpu freq stats:
cat /sys/devices/system/cpu/cpu0/cpufreq/stats
cat /sys/devices/system/cpu/cpu1/cpufreq/stats
cat /sys/devices/system/cpu/cpu2/cpufreq/stats
cat /sys/devices/system/cpu/cpu3/cpufreq/stats
To lock cpu freg:
echo the same freq to following sys mode will lock cpu freq to the setting freq.
/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
/sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
To enable/disable specific freq for ACPU
ACPU freq table is defined in acpu_freq_tbl_* structure of specific platform.
arch/arm/mach-msm/acpuclock-.c
For 8974, it is defined in arch/arm/mach-msm/acpuclock-8974.c. the first column of following table used to enable/disable freq in the row: 1:enable, 0:disable
static struct acpu_level acpu_freq_tbl_2p3g_pvs0[] __initdata = {
{ 1, { 300000, PLL_0, 0, 0 }, L2(0), 800000, 72 },
{ 0, { 345600, HFPLL, 2, 36 }, L2(1), 800000, 83 },
{ 1, { 422400, HFPLL, 2, 44 }, L2(2), 800000, 101 },
{ 0, { 499200, HFPLL, 2, 52 }, L2(2), 805000, 120 },
{ 0, { 576000, HFPLL, 1, 30 }, L2(3), 815000, 139 },
{ 1, { 652800, HFPLL, 1, 34 }, L2(3), 825000, 159 },
{ 1, { 729600, HFPLL, 1, 38 }, L2(4), 835000, 180 },
{ 0, { 806400, HFPLL, 1, 42 }, L2(4), 845000, 200 },
{ 1, { 883200, HFPLL, 1, 46 }, L2(4), 855000, 221 },
{ 1, { 960000, HFPLL, 1, 50 }, L2(9), 865000, 242 },
{ 1, { 1036800, HFPLL, 1, 54 }, L2(10), 875000, 264 },
{ 0, { 1113600, HFPLL, 1, 58 }, L2(10), 890000, 287 },
{ 1, { 1190400, HFPLL, 1, 62 }, L2(10), 900000, 308 },
…
{ 1, { 1958400, HFPLL, 1, 102 }, L2(19), 1040000, 565 },
{ 0, { 2035200, HFPLL, 1, 106 }, L2(19), 1055000, 596 },
{ 0, { 2112000, HFPLL, 1, 110 }, L2(19), 1070000, 627 },
{ 0, { 2188800, HFPLL, 1, 114 }, L2(19), 1085000, 659 },
{ 1, { 2265600, HFPLL, 1, 118 }, L2(19), 1100000, 691 },
{ 0, { 0 } }
};
2.8 Hoplug cores
Core 0 can’t be hotplugged, Core 1/2/3 can be hotplugged,
To remove core :
echo 0 > /sys/devices/system/cpu/cpu1/online
echo 0 > /sys/devices/system/cpu/cpu2/online
echo 0 > /sys/devices/system/cpu/cpu3/online
To add back core:
echo 1 > /sys/devices/system/cpu/cpu1/online
echo 1 > /sys/devices/system/cpu/cpu2/online
echo 1 > /sys/devices/system/cpu/cpu3/online
2.9 Scaling governor
To check scaling governor:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
To set new governor:
echo > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
比如:
echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
2.10 Mpdecision
Use Mpdecison daemon to start/stop/enable debug with commands below:
Start mpdecison:
start mpdecision
n
Stop mpdecison:
stop mpdecision
Enable mpdecision debug :
start mpdecision --debug
2.11 Power feature enable/disable
Following sys node can be used to enable the lower resource,
echo 2 > /sys/module/lpm_resources/enable_low_power/l2
echo 1 > /sys/module/lpm_resources/enable_low_power/pxo
echo 1 > /sys/module/lpm_resources/enable_low_power/vdd_dig
echo 1 > /sys/module/lpm_resources/enable_low_power/vdd_mem
echo 1 > /sys/module/pm_8x60/modes/cpu0/power_collapse/suspend_enabled
echo 1 > /sys/module/pm_8x60/modes/cpu1/power_collapse/suspend_enabled
echo 1 > /sys/module/pm_8x60/modes/cpu2/power_collapse/suspend_enabled
echo 1 > /sys/module/pm_8x60/modes/cpu3/power_collapse/suspend_enabled
echo 1 > /sys/module/pm_8x60/modes/cpu0/power_collapse/idle_enabled
echo 1 > /sys/module/pm_8x60/modes/cpu0/standalone_power_collapse/suspend_enabled
echo 1 > /sys/module/pm_8x60/modes/cpu1/standalone_power_collapse/suspend_enabled
echo 1 > /sys/module/pm_8x60/modes/cpu2/standalone_power_collapse/suspend_enabled
echo 1 > /sys/module/pm_8x60/modes/cpu3/standalone_power_collapse/suspend_enabled
echo 1 > /sys/module/pm_8x60/modes/cpu0/standalone_power_collapse/idle_enabled
echo 1 > /sys/module/pm_8x60/modes/cpu1/standalone_power_collapse/idle_enabled
echo 1 > /sys/module/pm_8x60/modes/cpu2/standalone_power_collapse/idle_enabled
echo 1 > /sys/module/pm_8x60/modes/cpu3/standalone_power_collapse/idle_enabled
echo 0 to above sys node will disable related low power mode.
2.12 Check system alarm
get android alarms and statistics:
adb dumpsys alarm > alarms.txt
enable android debug message in logcat:
setprop persist.alarm.debug 1
2.13 Kernel timer check
Sys node /proc/timer_stats can be used to check kernel timer stastics, customer can use following command to get timer statics in specific scenario:
echo 0 > /proc/timer_stats && sleep 10 && echo 1 > /proc/timer_stats && sleep 30 && cat /proc/timer_stats > /data/timer_stats &
OEMs need to provide file /data/timer_stats to salesforce case for check.
3、其他功耗项的优化
3.1屏幕对功耗的影响
屏幕亮度等级不同,功耗不同。亮度越低,功耗越低。调低屏幕默认背光亮度等级和屏幕最高亮度设置时候的背光亮度等级,可以优化手机整体功耗表现。
LCD背光等级的设备节点:
/sys/class/leds/lcd-backlight/brightness
默认背光等级和最高亮度背光等级需要同时考虑到用户体验和功耗表现,需要一起评估。
另外,调试LCD的fps帧率,也可以优化功耗。
3.2 CPU/GPU DVFS
CPU/GPU的动态调频调压可以优化手机的功耗表现。该影响是整体性的,系统性的。
CPU降频主要通过两种方式实现,都可以达到降频的目标。
1、设置CPU工作在powersave模式。设置该模式后,CPU将一直工作在最低频率(300000hz)。此时手机最省电,但是有可能会出现手机运行变卡顿。
例如:将CPU0置为powersave模式,命令为:
echo "powersave" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
例如:将CPU1置为powersave模式,命令为:
echo "powersave" > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor
ex780共有4个CPU(CPU0~CPU3),都可以这样处理
2、限制CPU最高频率,以限制CPU的运行频率上限
CPU(CPU0~CPU3)可以选择的频率值如下所列,即这些数值都可以用作CPU的频率上限。选择的频率上限可以根据实际场景需要来设置。在超级省电模式下,CPU工作的宗旨是:CPU工作频率低+运行不卡,两项都要保障。
CPU可以选择的频率:
300000 422400 652800 729600 883200 960000 1036800 1190400 1267200 1497600 1574400 1728000 1958400 2265600 2457600
例如:将CPU0的频率上限设置为960000
echo 960000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
例如:将CPU0的频率上限设置为422400
echo 422400 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
GPU相关调试与CPU类似,设备节点路径/sys/devices/fdb00000.qcom,kgsl-3d0/kgsl/kgsl-3d0
3.3 CPU占用率
应用对cpu的占有率,如果占有率过高,则该应用一般会导致功耗较大。
adb shell
top -m 6
3.4游戏功耗
可以从下面几个方面优化:
降低屏幕背光亮度等级;
采用CPU、GPU动态调频调压,并调低CPU、GPU频率下限;
采用thermal-engine.conf 。
3.5 Camera功耗偏大
降低camera帧率;
降低屏幕背光亮度等级;
采用CPU、GPU动态调频调压,并调低CPU、GPU频率下限;
采用thermal-engine.conf 。
-
BatteryAnalysisTool:Android 功耗辅助分析工具
2021-05-17 20:58:31"# BatteryAnalysisTool" 这是我大概想完成的功能 -
android 功耗分析方法和优化
2019-11-07 17:50:47可以采用功耗问题时间追踪表来精确追踪功耗异常。 可以使用如下命令来打开指定文件的kernel log(以qpnp-adc-tm.c和qpnp-adc-common.c为例): adb shell mount -t debugfs none /sys/kernel/debug ...1、底电流调试(Rock Bottom Current Optimization)
底电流在手机飞行模式下调试。每个平台的底电流数据可能不一样,具体可以参考release出来的Current Consumption Data文档或者release note。一般情况下的底电流参考数据上限是:
512M RAM < 1.5mA; 1G RAM < 2mA; 2G RAM < 2.6mA
1.1校准RF
保证RF的PA、Antenna switch、Tuner、APT、GPIO工作在正常状态
1.2飞行模式
开启飞行模式、关闭GPS、关闭自动旋转屏幕、关闭自动亮度调节、关闭其他特效效果设置
开启飞行模式,可以基本避免蓝牙、wifi、NFC、网络、FM等的一般影响;
关闭GPS,可以基本排除开启GPS对底电流的影响;
关闭自动旋转屏幕,可以基本排除sensor的影响;
关闭自动亮度调节,可以基本排除距离感应到的影响;
关闭其他特效效果设置,如指纹识别、黑屏手势、智能体感、手势隔空操作。。。。。。
1.3使用perf_defconfig
修改device/qcom//AndroidBoard.mk。如果KERNEL_DEFCONFIG := _defconfig,那么改成KERNEL_DEFCONFIG := -perf_defconfig
同时,kernel代码改用/kernel/arch/arm/configs/-perf_defconfig
是平台名称或者项目名称
1.4移除debugging APKs
/system/app/Logkit.apk
/system/app/com.qualcomm.qlogcat.apk
/system/xbin/qlogd
1.5把应用尽量删除
在设置-->应用,禁用正在运行的应用
1.6去掉CPU占用高的进程
adb shell
top
查看CPU占用,去掉在休眠模式下CPU占用大于0的进程。kill掉该进程,若kill不掉则rm掉相关应用。对于占用CPU高的kwork,需要查找驱动原因。
1.7手动移除所有可以移除的外设
手机连上安捷伦电源,手机开机,然后让手机进入待机状态。手动移除TP、LCM、前camera、后camera、sensor、SD卡、SIM卡等可以手动移除的外围器件,同时观察并记录底电流变化。
直接移除WLAN芯片可能会导致开不了机,所以在移除WLAN之前,先对软件做如下处理:
# mount -o rw,remount -t vfat /dev/block/bootdevice/by-name/modem
# cd /firmware/image
# rm wcnss.*
# reboot
或者
#lsmod
#rmmod WLAN
移除其他可以移除的芯片(sensor、NFC。。。)
1.8移除驱动模块
在/kernel/arch/arm/configs/-perf_defconfig中把sensor、TP、LCM、camera等的驱动模块移除;
或者在对应驱动的Makefile里面,移除驱动代码
然后编译bootimage,烧入手机观察底电流变化
1.9配置不用的GPIO
将不用的GPIO置为输入、拉低;配置成SPI、I2C的GPIO,若不用,置为悬空
在boot_images/core/systemdrivers/tlmm/config/platform/TLMMChipset.xml,修改GPIO配置。该处配置GPIO的初始状态,驱动有可能会修改GPIO。
对比项目原理图与平台参考原理图,项目原理图中多出的NC GPIO要处理掉。
1.10检查power相关的NV items
需要跟CE确认。一般如下:
1027 = 0
1895 = 0
1892 = 0
1962 = 0
4679 = 16
4201 = 0
3851 = 0
3852 = 6
7157 = 1
69745 rxd_enable = 0
WCDMA NV:
NV3581 = 0
NV3852 = 6
1.11排查GPIO、LDO、总线
对比项目原理图与平台参考原理图,排查硬件不一样的GPIO、LDO、总线配置。
量测各GPIO、LDO、I2C在休眠时候的电压,需用万用表准确测量。
休眠时各路I2C GPIO的电压是多少v,用万用表准确测量。
如果条件允许,测量所有LDO在休眠前和休眠后的准确电压。
对于LDO,调试方法如下:
(1)adb shell关闭LDO
如关闭L3:
cd /sys/kernel/debug/regulator/8916_l3/
echo 0 > enable
(2)LDO太多设备用到,不适合用adb shell来关。可以这样调试:
cat /sys/kernel/debug/regulator/8916_l6/consumers
shell@msm8916_32:/sys/kernel/debug/regulator/8916_l6 $ cat consumers
Device-Supply EN Min_uV Max_uV load_uA
0-000c-vio Y 1800000 1800000 0
0-0068-vi2c N 1800000 1800000 0
5-0038-vcc_i2c Y 1800000 1800000 0
1a98000.qcom,mdss_dsi-vddio N 1800000 1800000 100
1a98300.qcom,mdss_dsi_pll-vddio N 1800000 1800000 100
8916_l6 N 0 0 0
这样就可以看到是哪些设备请求了LDO6。然后 找到对应的代码,在休眠时关掉LDO,唤醒时再打开。
0-000c: 挂在I2C0上地址为0xc
5-0038: 挂在I2C0上地址为0x38
查看这两个设备的驱动代码是否有执行regulator_enable。
(3)通过寄存器地址关闭LDO
如LDO6的地址是0x14546,则关闭方法是:
# cd /sys/kernel/debug/spmi/spmi-0
# echo 0x14546 > address
# echo 1 > count
# cat data 可以读寄存器
# echo 0x00 > data 关LDO6
(4)关闭MPP
在休眠前关闭MPP1、MPP2、MPP3、MPP4
如PM8916的寄存器地址分别是0xA046、0xA146、0xA246、0xA346
在关闭前先cat data以查看原来的值。
GPIO状态读取的方法如下:
(1)GPIO dump
为了得到休眠时的GPIO状态,增加下面的打印:
rpm_proc/core/power/sleep/src/lpr_definition_uber.c
#include "tlmm_hwio.h"
void deep_sleep_enter(void)
{
uint64 sleep_duration;
...
SWEVENT(SLEEP_DEEP_SLEEP_ENTER_COMPLETE, sleep_mode.deep_sleep_mode, sleep_duration);
// For test
{
int num;
int i=11;
volatile uint32 cfg ,inout, val;
num = 122; //8916 only. Need modify for 8974/8x10/8x26 etc.
cfg = *(volatile uint32*)HWIO_TLMM_GPIO_CFGn_ADDR(i); //(0x61000000 + i * 0x1000)
inout = *(volatile uint32*)HWIO_TLMM_GPIO_IN_OUTn_ADDR(i);//(0x61000004 + i * 0x1000)
val = ((cfg << 16)&0xffff0000) | (inout&0xffff);
SWEVENT(SLEEP_GPIO_DUMP, i, val);
}
mpm_sw_done(sleep_mode.deep_sleep_mode, sleep_duration);
} while(FALSE);
}
增加for test下面这一段代码。
然后再修改:
rpm_proc\core\power\sleep\build\SConscript
if 'USES_QDSS_SWE' in env:
QDSS_IMG = ['QDSS_EN_IMG']
events = [['SLEEP_DEEP_SLEEP_ENTER=320','deep sleep enter. (sleep mode: %d) (count: %d)'],
['SLEEP_DEEP_SLEEP_EXIT','deep sleep exit (sleep mode: %d)'],
['SLEEP_NO_DEEP_SLEEP','bail early from deep sleep. (sleep mode: %d) (reason: %d)'],
['SLEEP_RPM_HALT_ENTER','rpm halt enter'],
['SLEEP_RPM_HALT_EXIT','rpm halt exit'],
['SLEEP_MPM_INTS','pending mpm interrupts at wakeup: (interrupt_status_1 %d), (interrupt_status_2 %d)'],
['SLEEP_DEEP_SLEEP_ENTER_COMPLETE','deep sleep exit complete (sleep mode: %d)'],
['SLEEP_DEEP_SLEEP_EXIT_COMPLETE','deep sleep exit (sleep mode: %d)'],
['SLEEP_MPM_WAKEUP_TIME','mpm wake up time (wakeup time: 0x%0.8x%0.8x)'],
['SLEEP_GPIO_DUMP','gpio [%d] configuration is %d'],
['SLEEP_EVENT_LAST=383','sleep last event placeholder']
增加SLEEP_GPIO_DUMP这一项。
编译烧写rpm.mbn。
让机器休眠,进入download,抓dump,然后将如下日志发给平台技术支持分析。
CODERAM.bin
MSGRAM.bin
DATARAM.bin
以及新编译出来的RPM_AAAAANAZR.elf。
(2)GPIO寄存器读取
在RPM可能不是很方便,也可以用busybox来读取寄存器,例如读GPIO11:
Physical Address for GPIO_CFG11 = 0x100B000
root@android:/data/busybox # ./busybox devmem 0x100B000 32
./busybox devmem 0x100B000 32
0x00000203
GPIO_PULL = "11" PULL_UP
FUNC_SEL = "0000" FUNCTION GPIO
DRV_STRENGTH = "000" DRV_2_MA
GPIO_OE = "1" Output Enable
1.12 rpm dump
抓rpm dump,然后把log提供给平台技术支持。
方法如下:
(1)ps_hold接地
在休眠状态下,接ps_hold到地少于200mS,机器会进入紧急下载状态,插入USB,QPST会自动得到memory dump,然后上传以下几个文件:
CODERAM.bin
MSGRAM.bin
DATARAM.bin
以及RPM_AAAAANAZR.elf(必须与机器的编译时间一致匹配的elf)
(2)改reset为download key
发这些命令改reset为download key:
# cd /sys/kernel/debug/spmi/spmi-0
# echo 0x844 > address
# echo 4 > count
# cat data
00840 -- -- -- -- 0F 07 04 00
# echo 0x00 0x00 0x01 0x00 > data
# cat data
00840 -- -- -- -- 00 00 01 00
# echo 0x00 0x00 0x01 0x80 > data
# cat data
00840 -- -- -- -- 00 00 01 80
然后长按下键,会进入download。之后抓取log方法同上。
如果进不了download,需要确认:
CONFIG_MSM_DLOAD_MODE=y
另外也有可能与nv 4399和905有关系。
1.13检查rpm_stats
检查rpm_stats是否进入vdd min或者xo/no shutdown。使用下面的命令检查rpm lower power mode count:
cat /sys/kernel/debug/rpm_stats
如果vmin的count是0,则表明设备从来没有进入vdd min;non-zero则说明设备进入过vdd_min。
RPM Mode: xosd
count:0
time in last mode(msec):0
time since last mode(sec):794
actual last sleep(msec):0
RPM Mode:vmin
count:11
time in last mode(msec):0
time since last mode(sec):359
actual last sleep(msec):110000
1.14使用Trace32
可以dump出来完整详细的gpio/clk/pmic信息,排除休眠时候的状态异常。
2、待机电流优化(Standby Current Optimization)
2.1通过adb log排查
adb logcat -v time > YearMounthDayHourMinute_logcat.txt //main log
adb logcat -v time -b events > YearMounthDayHourMinute_logcat_event.txt //event log
adb logcat -v time -b radio > YearMounthDayHourMinute_logcat_radio.txt //radio log
adb shell dmesg > YearMounthDayHourMinute_dmesg.txt //kernel log
可以采用功耗问题时间追踪表来精确追踪功耗异常。
可以使用如下命令来打开指定文件的kernel log(以qpnp-adc-tm.c和qpnp-adc-common.c为例):
adb shell mount -t debugfs none /sys/kernel/debug
adb shell "echo 8 > /proc/sys/kernel/printk"
adb shell "echo 'file qpnp-adc-tm.c +p' > /sys/kernel/debug/dynamic_debug/control"
adb shell "echo 'file qpnp-adc-common.c +p' > /sys/kernel/debug/dynamic_debug/control"
adb shell "echo 8 > /proc/sys/kernel/printk"
为指定的函数开启log,以qpnpint_handle_irq为例:
adb shell "echo 'func qpnpint_handle_irq +p' > /sys/kernel/debug/dynamic_debug/control"
*#logkit#*调出logkit apk,可以保存logcat、dmesg、crash、QXDM、GPU log等日志信息到手机里面。
2.2 top
通过top命令,可以查询到cpu占用较高的应用。如果一个应用一直在占用cpu,而此时并没有打开该应用,那么该应用很可能会导致待机异常。
adb shell
top
“该场景下CPU使用率”是User+System+IOW+IRQ
“模块相关的CPU占用率”是模块相关进程占用CPU使用率的总和
2.3正在运行
设置-->应用-->正在运行,可以看到正在运行的应用或者服务。禁止掉应用或者服务,观察待机电流变化。
2.4 wakeup debug mask
调试wakeup问题,可以使能debug功能,然后抓取log。Log中会增加一些debug信息。
mount -t debugfs none /sys/kernel/debug
echo 1 > /sys/kernel/debug/clk/debug_suspend
echo 1 > /sys/module/msm_show_resume_irq/parameters/debug_mask
echo 4 > /sys/module/wakelock/parameters/debug_mask
echo 1 > /sys/module/lpm_levels/parameters/debug_mask
echo 0x16 > /sys/module/smd/parameters/debug_mask
2.5 wakelock
1、wakeup_sources
kernel wakelock和userspace wakelock都有可能阻止系统睡眠。所有的wakeup_sources均保存在sys节点/sys/kernel/debug/wakeup_sources里面。
该文件包含了如下信息:
(1)the total amount of time a wakeup source has prevented suspend
(2)the amount of time a wakelock has been active since the last activation etc. The unit of time is milliseconds.
2、active_since
active_since值可以用来确认wakelock是否正在阻止休眠。如果该值不是零,那么这个wakelock正在工作并且阻止休眠。
3、获取wakeup_sources的命令
adb root 67754400
adb remount
adb shell
cat /sys/kernel/debug/wakeup_sources > /data/wakeup_sources.txt
adb pull /data/wakeup_sources.txt
获得wakeup_sources.txt以后,通过Excel打开,active_since不为0的项为wakeup source。以表2为例,msm_dwc3对应的active-since值481756>0,这意味着msm_dwc3驱动在阻止系统睡眠,下一步需要检查msm_dwc3驱动代码及相关log。
表格 2 Wakeup source opened in Excel
4、power:wakeup_source_activate and power:wakeup_source_deactivate events
当一个wakeup source被acquire或者release时候,power:wakeup_source_activate和power:wakeup_source_deactivate event将随即被写到trace buffer里面,这样可以记录wakeup source被driver使用的频率。
开启该功能的方法:
echo "power:wakeup_source_activate power:wakeup_source_deactivate" > /sys/kernel/debug/tracing/set_event
The power:wakeup_source_activate and power:wakeup_source_deactivate events are written to the trace buffer any time a wakeup source is acquired or released and it can provide information on how often a wakeup source is being used by a driver.
To enable these events, you can enable following:
echo "power:wakeup_source_activate power:wakeup_source_deactivate" > /sys/kernel/debug/tracing/set_event
Once the above done, the traces will be present in /sys/kernel/debug/tracing/trace.
2.6 powertop
powertop用来看CPU的运行统计以协助调试power问题。powertop的用法如下:
powertop --h
Usage: powertop [OPTION...]
n -d, --dump read wakeups once and print list of top offenders
n -t, --time=DOUBLE default time to gather data in seconds
n -r, --reset Reset PM stats data
n -h, --help Show this help message
n -v, --version Show version information and exit
获取powertop log的方法:
1. 通过USB连接手机到电脑
2. adb shell,然后执行如下命令:
sleep 10 && /data/powertop [-r] -d -t 30 > /data/powertop.log &
3. 拔掉USB线,等待10秒后开始功耗测试
4. 插上USB
5. adb pull /data/powertop.log
2.7 CPU freq log
打开CPU freq change log:
mount -t debugfs none /sys/kernel/debug
cd /sys/kernel/debug
echo -n 'file acpuclock-8x60.c +p' > dynamic_debug/control
echo -n 'file acpuclock-krait.c +p' > dynamic_debug/control
查看cpu freq stats:
cat /sys/devices/system/cpu/cpu0/cpufreq/stats
cat /sys/devices/system/cpu/cpu1/cpufreq/stats
cat /sys/devices/system/cpu/cpu2/cpufreq/stats
cat /sys/devices/system/cpu/cpu3/cpufreq/stats
To lock cpu freg:
echo the same freq to following sys mode will lock cpu freq to the setting freq.
/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
/sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
To enable/disable specific freq for ACPU
ACPU freq table is defined in acpu_freq_tbl_* structure of specific platform.
arch/arm/mach-msm/acpuclock-.c
For 8974, it is defined in arch/arm/mach-msm/acpuclock-8974.c. the first column of following table used to enable/disable freq in the row: 1:enable, 0:disable
static struct acpu_level acpu_freq_tbl_2p3g_pvs0[] __initdata = {
{ 1, { 300000, PLL_0, 0, 0 }, L2(0), 800000, 72 },
{ 0, { 345600, HFPLL, 2, 36 }, L2(1), 800000, 83 },
{ 1, { 422400, HFPLL, 2, 44 }, L2(2), 800000, 101 },
{ 0, { 499200, HFPLL, 2, 52 }, L2(2), 805000, 120 },
{ 0, { 576000, HFPLL, 1, 30 }, L2(3), 815000, 139 },
{ 1, { 652800, HFPLL, 1, 34 }, L2(3), 825000, 159 },
{ 1, { 729600, HFPLL, 1, 38 }, L2(4), 835000, 180 },
{ 0, { 806400, HFPLL, 1, 42 }, L2(4), 845000, 200 },
{ 1, { 883200, HFPLL, 1, 46 }, L2(4), 855000, 221 },
{ 1, { 960000, HFPLL, 1, 50 }, L2(9), 865000, 242 },
{ 1, { 1036800, HFPLL, 1, 54 }, L2(10), 875000, 264 },
{ 0, { 1113600, HFPLL, 1, 58 }, L2(10), 890000, 287 },
{ 1, { 1190400, HFPLL, 1, 62 }, L2(10), 900000, 308 },
…
{ 1, { 1958400, HFPLL, 1, 102 }, L2(19), 1040000, 565 },
{ 0, { 2035200, HFPLL, 1, 106 }, L2(19), 1055000, 596 },
{ 0, { 2112000, HFPLL, 1, 110 }, L2(19), 1070000, 627 },
{ 0, { 2188800, HFPLL, 1, 114 }, L2(19), 1085000, 659 },
{ 1, { 2265600, HFPLL, 1, 118 }, L2(19), 1100000, 691 },
{ 0, { 0 } }
};
2.8 Hoplug cores
Core 0 can’t be hotplugged, Core 1/2/3 can be hotplugged,
To remove core :
echo 0 > /sys/devices/system/cpu/cpu1/online
echo 0 > /sys/devices/system/cpu/cpu2/online
echo 0 > /sys/devices/system/cpu/cpu3/online
To add back core:
echo 1 > /sys/devices/system/cpu/cpu1/online
echo 1 > /sys/devices/system/cpu/cpu2/online
echo 1 > /sys/devices/system/cpu/cpu3/online
2.9 Scaling governor
To check scaling governor:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
To set new governor:
echo > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
比如:
echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
2.10 Mpdecision
Use Mpdecison daemon to start/stop/enable debug with commands below:
Start mpdecison:
start mpdecision
n
Stop mpdecison:
stop mpdecision
Enable mpdecision debug :
start mpdecision --debug
2.11 Power feature enable/disable
Following sys node can be used to enable the lower resource,
echo 2 > /sys/module/lpm_resources/enable_low_power/l2
echo 1 > /sys/module/lpm_resources/enable_low_power/pxo
echo 1 > /sys/module/lpm_resources/enable_low_power/vdd_dig
echo 1 > /sys/module/lpm_resources/enable_low_power/vdd_mem
echo 1 > /sys/module/pm_8x60/modes/cpu0/power_collapse/suspend_enabled
echo 1 > /sys/module/pm_8x60/modes/cpu1/power_collapse/suspend_enabled
echo 1 > /sys/module/pm_8x60/modes/cpu2/power_collapse/suspend_enabled
echo 1 > /sys/module/pm_8x60/modes/cpu3/power_collapse/suspend_enabled
echo 1 > /sys/module/pm_8x60/modes/cpu0/power_collapse/idle_enabled
echo 1 > /sys/module/pm_8x60/modes/cpu0/standalone_power_collapse/suspend_enabled
echo 1 > /sys/module/pm_8x60/modes/cpu1/standalone_power_collapse/suspend_enabled
echo 1 > /sys/module/pm_8x60/modes/cpu2/standalone_power_collapse/suspend_enabled
echo 1 > /sys/module/pm_8x60/modes/cpu3/standalone_power_collapse/suspend_enabled
echo 1 > /sys/module/pm_8x60/modes/cpu0/standalone_power_collapse/idle_enabled
echo 1 > /sys/module/pm_8x60/modes/cpu1/standalone_power_collapse/idle_enabled
echo 1 > /sys/module/pm_8x60/modes/cpu2/standalone_power_collapse/idle_enabled
echo 1 > /sys/module/pm_8x60/modes/cpu3/standalone_power_collapse/idle_enabled
echo 0 to above sys node will disable related low power mode.
2.12 Check system alarm
get android alarms and statistics:
adb dumpsys alarm > alarms.txt
enable android debug message in logcat:
setprop persist.alarm.debug 1
2.13 Kernel timer check
Sys node /proc/timer_stats can be used to check kernel timer stastics, customer can use following command to get timer statics in specific scenario:
echo 0 > /proc/timer_stats && sleep 10 && echo 1 > /proc/timer_stats && sleep 30 && cat /proc/timer_stats > /data/timer_stats &
OEMs need to provide file /data/timer_stats to salesforce case for check.
3、其他功耗项的优化
3.1屏幕对功耗的影响
屏幕亮度等级不同,功耗不同。亮度越低,功耗越低。调低屏幕默认背光亮度等级和屏幕最高亮度设置时候的背光亮度等级,可以优化手机整体功耗表现。
LCD背光等级的设备节点:
/sys/class/leds/lcd-backlight/brightness
默认背光等级和最高亮度背光等级需要同时考虑到用户体验和功耗表现,需要一起评估。
另外,调试LCD的fps帧率,也可以优化功耗。
3.2 CPU/GPU DVFS
CPU/GPU的动态调频调压可以优化手机的功耗表现。该影响是整体性的,系统性的。
CPU降频主要通过两种方式实现,都可以达到降频的目标。
1、设置CPU工作在powersave模式。设置该模式后,CPU将一直工作在最低频率(300000hz)。此时手机最省电,但是有可能会出现手机运行变卡顿。
例如:将CPU0置为powersave模式,命令为:
echo "powersave" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
例如:将CPU1置为powersave模式,命令为:
echo "powersave" > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor
ex780共有4个CPU(CPU0~CPU3),都可以这样处理
2、限制CPU最高频率,以限制CPU的运行频率上限
CPU(CPU0~CPU3)可以选择的频率值如下所列,即这些数值都可以用作CPU的频率上限。选择的频率上限可以根据实际场景需要来设置。在超级省电模式下,CPU工作的宗旨是:CPU工作频率低+运行不卡,两项都要保障。
CPU可以选择的频率:
300000 422400 652800 729600 883200 960000 1036800 1190400 1267200 1497600 1574400 1728000 1958400 2265600 2457600
例如:将CPU0的频率上限设置为960000
echo 960000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
例如:将CPU0的频率上限设置为422400
echo 422400 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
GPU相关调试与CPU类似,设备节点路径/sys/devices/fdb00000.qcom,kgsl-3d0/kgsl/kgsl-3d0
3.3 CPU占用率
应用对cpu的占有率,如果占有率过高,则该应用一般会导致功耗较大。
adb shell
top -m 6
3.4游戏功耗
可以从下面几个方面优化:
降低屏幕背光亮度等级;
采用CPU、GPU动态调频调压,并调低CPU、GPU频率下限;
采用thermal-engine.conf 。
3.5 Camera功耗偏大
降低camera帧率;
降低屏幕背光亮度等级;
采用CPU、GPU动态调频调压,并调低CPU、GPU频率下限;
采用thermal-engine.conf 。
-
Android 手机功耗分析指南
2021-05-26 14:24:21和您一起终身学习,这里是程序员Android本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:一、飞行模式底电流问题二、正常待机功耗简介三、最干净的待机电流波形四、通过唤醒源...和您一起终身学习,这里是程序员Android
本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:一、飞行模式底电流问题
二、正常待机功耗简介
三、最干净的待机电流波形
四、通过唤醒源理清正常待机问题
五、Audio Playback 功耗问题
六、Display 及多媒体功耗问题
七、通话功耗问题
一、飞行模式底电流问题
飞行模式底电流正常是所有功耗问题的前置条件,此时wifi 、Bluetooth、Location、Radio 都处于关闭状态。
1.系统睡眠的条件
查看CPU是否进入suspend状态, suspend确切的说是 MCU (ARM)的suspend, 也是CPU 进入WFI(Wait For Interrupt)状态,CPU 进入WFI后,整个系统就依靠一颗 SCP:SPM(System Power Manager) 来控制 睡眠/唤醒 的流程
2.灭屏到CPU 进入suspend的流程
3.判断系统是否进入suspend的方法
在kernel log中搜索关键字 Chip_pm_begin 或者 suspend entry
4.查看SPM(System Power Manager)状态
1.在 kernel log 中搜索关键字 wake up by, 可以查看唤醒源的情况,
2.在kernel log中查看R13寄存器跟debug_flag的值,如果后面值不是ff结尾,此时系统功耗可能会存在异常,需要查看分析。
二、 正常待机功耗简介
待机功耗很容易出现问题,并且很难理清,因为其涉及到APK 、Modem、Wifi、Other这些不确定因素。
功耗问题处理原则:
1.先花时间把现象理清,到底在什么样的环境下复现。
2.多做几个实验,给出清晰的问题描述、问题复现条件、电流波形图。
3.提供关闭 modem 的log。
3. 最干净的待机电流波形
4. 通过唤醒源理清正常待机问题
1. 其他唤醒源分析
kernel Log收缩关键字 wakeup by, wakeup by xxxx ,其中 xxxx 就是唤醒源。
2. APK 唤醒源分析
APK 唤醒系统是通过设置 type 0 和type 2的alarm 来唤醒系统,这两种alarm 会设置到RTC寄存器中,而RTC Module 其实是在PMIC 里面,因此APK唤醒实际上是PMIC的EINT唤醒。
RTC 唤醒sys_log中搜索关键字 AlarmManager: sending alarm Alarm,查看 type 0 和 type 2 的应用有哪些。
如果log没有开启,请使用adb shell dumpsys alarm log on
5. Audio Playback 功耗问题
Audio playback 时候MTK低端平台没有专门的audio DSP(Heilo X20除外),故无法在suspend状态下完成audio playback,故需要CPU 做这件事情。
通话的时候之所以可以睡眠,是疑问modem 充当了dsp的角色。
deep idle 状态
Deep idle 实际上系统还是Active状态,因此CPU需要快速响应系统请求调度,因此 GPT唤醒源 是Deep idle的主要唤醒源。
在 Kernel Log中搜索关键字 wake up by , 这个log是在 swapper进程 中打印出来的(代表当前CPU在运行idle task) ,并且后面可以看到 DP:的字样。
MP3播放时进入deep idle状态(20mA)举例
区分suspend 与deep Idlesuspend 是跑在 suspend workqueue 中,因此log的进程主体是kwork
deep idle 是跑在idle task 中,因此log的进程主体是swapper
suspend 默认不会被 GPT 唤醒。
6.Display 及多媒体功耗问题
手机所有亮屏的场景都是模块自身的耗电跟Display 部分耗电的叠加,所以Display 的功耗在整个系统中占比非常高。
Display 功耗 = 硬件+平台+内容
在 Kernel Log中搜索关键字 wake up by , 这个log是在 swapper进程 中打印出来的(代表当前CPU在运行idle task) ,并且后面可以看到 SO:的字样(通)
7. 通话电流功耗问题
通话模式的功耗跟正常模式的功耗区别
一般情况下
GSM 功耗< 3G-TD < 3G-W 功耗
至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!
-
android功耗分析文章集合
2019-11-11 15:14:03https://blog.csdn.net/StevenDuan17/article/details/100538332 -
Android 系统功耗分析工具
2022-06-15 21:34:08Android电池功耗BatteryHistorian数据分析 bugreport.txt bugreport.txt中记录了从系统中拉出来zip文件名称 接下来就是要使用BatteryHistorian,这个网上有很多教程如何搭建,这边找到了一个公开的网站能更省事一点... -
android 功耗分析琐碎笔记
2016-08-10 11:32:05Android性能专项测试之Batterystats Batterystats & Battery Historian Walkthrough Battery Historian Charts Android应用的耗电量统计 SupplicantState batterystats使用条件 5.0以上系统 battery-... -
Android APP功耗、耗电分析 从零开始.
2020-09-20 10:57:33算是研究一下相关的内容吧. 从以下几个部分开始,持续更新… ...2.使用Android相关工具(Battery-Historian). 参考文档 Battery-Historian GitHub 官方文档 其他先行者的博客 使用Google的分析工具 Battery-Hi. -
Android 功耗(4)---MTK平台待机功耗分析流程
2021-05-26 14:21:43MTK平台待机功耗分析流程1.目的2.MTK平台各个场景功耗数据测试方法很多功耗问题都是因为测试手法不对,列出一些常用场景功耗测试手法。测试功耗数据之前,请先确认以下配置:1、关闭 WIFI/BT/GPS,关闭数据连接,... -
Android 功耗分析之wakelock
2018-12-25 15:44:43WakeLock是Android框架层提供的一套机制,应用使用该机制可以达到控制Android设备状态的目的。这里的设备状态主要指屏幕的打开关闭,cpu的保持运行。简单的理解WakeLock是让系统保持"清醒"的一种手段. ... -
Android 功耗(11)---Android 功耗分析之wakelock
2018-05-02 12:06:56Android 功耗分析之wakelock生活总是让我们遍体鳞伤,但到后来,那些受伤的地方一定会变成我们最强壮的地方。—海明威WakeLock是什么WakeLock作用WakeLock有那些分类WakeLock的设置过程WakeLock用法WakeLock相关问题... -
详解Android功耗分析工具Power Tutor的使用
2018-11-09 15:21:10博主很懒,只留下一个网址就走了:https://blog.csdn.net/huangyabin001/article/details/39989037 -
android 功耗分析方法和优化——高通平台
2019-06-21 13:45:11android 功耗 高通平台 底电流在手机飞行模式下调试。每个平台的底电流数据可能不一样,具体可以参考release出来的CurrentConsumptionData文档或者releasenote。一般情况下的底电流参考数据上限是:1、底电流调试... -
android 功耗分析主要步骤
2016-08-05 19:05:15android 功耗分析主要步骤 -
Android手机终端功耗优化技术研究
2021-06-07 04:08:47摘要:在手机终端领域,由于...本文研究基于android系统手机终端的功耗优化技术,通过分析研究组件功耗模型、组件状态模型、系统功耗优化、组件功耗优化等技术,提升手机终端的续航表现。首先,分析国内外的研究现状... -
Android 蓝牙低功耗ble hogp 广播、扫描、连接、数据读写源码流程分析大全,详细的从btif-bta-btm-hci
2022-04-14 14:16:13Android 蓝牙低功耗ble hopg 广播、扫描、连接、数据读写源码流程分析大全,非常详细的从btif-bta-btm-hci 数据流程走向,以及从controller收到数据到btm层,将Android 源码每个函数都摘录出来,进行分析,使Android...