问题描述
android.cts.statsd.validation.BatteryStatsValidationTests#testPowerBlameUid
解决方案
用测试的版本 执行以下命令,看看frameworkresoverlay是否有编译到系统中:
adb shell cmd overlay dump > tmp.txt
从tmp.txt找到frameworkresoverlay 或者 framework-res__auto_generated_rro_product apk,pull出来
然后再反编译apk,看看Power profile 是否存在
如果配置文件都在,请看看以下方法中到底是cpuactive时间为0,还是从配置中拿到的配置的Power为0
/frameworks/base/core/java/com/android/internal/os/CpuPowerCalculator.java
public void calculateApp(BatterySipper app, BatteryStats.Uid u, long rawRealtimeUs,
53 cpuPowerMaUs += u.getCpuActiveTime() * 1000 * mProfile.getAveragePower(
54 PowerProfile.POWER_CPU_ACTIVE);
在测试机的dump overlay的执行结果中,以下文件是否有编译到rro apk中呢?
EX: mt6762q/platform/vendor/tinno/u520/trunk/overlay/frameworks/base/core/res/res/xml/power_profile.xml
/vendor/mediatek/proprietary/packages/overlay/vendor/FrameworkResOverlay
那么dump overlay出来的结果就可以看到有FrameworkResOverlay apk,
且在mk文件中加进去了power profile的路径
/vendor/mediatek/proprietary/packages/overlay/vendor/FrameworkResOverlay/Android.mk
LOCAL_RESOURCE_DIR += $(LOCAL_PATH)/power/res ,
aapt dump resources 这个apk的结果中,就可以看到power profile有编译进去。
请客户找到calculateApp的function,在其中加log,看看到底是cpuactive时间为0,还是从配置文件power profile 中拿到的Power为0:
/frameworks/base/core/java/com/android/internal/os/CpuPowerCalculator.java
public void calculateApp(BatterySipper app, BatteryStats.Uid u, long rawRealtimeUs,
53 cpuPowerMaUs += u.getCpuActiveTime() * 1000 * mProfile.getAveragePower(
54 PowerProfile.POWER_CPU_ACTIVE);
只有cpuPowerMaUs 这个值为0 case才会失败,从代码中的公式也可以看出active时间 和 power配置任一为0都可能导致失败
请问 u.getCpuActiveTime()这个值为0,该如何处理?