软件评测方案也有很多种,但核心原理都是同一个。 
      软件评测方案中,所有Android功耗的统计都是通过代码进行估算,没有任何实体电路和硬件设备参与统计汇报。

这个配置文件存储在Android设备的以下路径中:

/frameworks/base/core/res/res/xml/power_profile.xml

(不同的厂商定制ROM中,此文件的路径可能会稍有不同)

配置文件内容节选示例如下:

文件中会详细设定手机中的每个部件在不同工况中的功耗单位值。所以,软件评测准确与否,与该文件息息相关。某些品牌的手机由于造假吹牛成风,故不可用于功耗评测。嗯,你知道我说的是谁。

在电源配置文件中,功耗表示额定电压下的电流消耗量,单位为毫安 (mA),也可用微安(uA) 表示(分数值)。该值应代表电池上消耗的电流,而非与电池消耗的电流不对应的相应电源轨的值。

例如,显示屏电源配置文件列出了当显示屏开启状态下保持最低亮度和最高亮度时需消耗的电流量 (mA)。为了确定显示屏常亮时所需的电源成本(即由显示屏组件所消耗的电池量),框架会跟踪在各个亮度级别下维持的时间,然后将这些时间间隔乘以通过插值算法计算的显示亮度成本。

软件评测的计算方法和原理

Android系统为了进行电源管理,设计了PowerManagement框架,其中包含BatteryState服务。BatteryStats 会不断地收集信息,并存储这些信息以便在重新启动后继续使用。该服务不会直接跟踪电池中消耗的电流,而是通过收集计时信息来估算不同组件所消耗的电量。

该框架使用以下方法收集统计信息:

· 推送:服务察觉到组件状态发生变化后,会将状态变化推送到 BatteryStats 服务中。

· 拉取:对于应用使用的 CPU 等组件,框架会在转换点(例如启动活动或停止活动)自动拉取数据以截取快照。

资源消耗与使用资源的应用相关。当多个应用同时使用某项资源(例如防止系统挂起的唤醒锁)时,框架会将资源消耗量分摊到这些应用上,但不一定会均分。

为了避免由于系统关闭事件而丢失电池使用统计信息(这些统计信息可能表明存在电池功耗问题,比如由于电池电量耗尽而关闭),框架会大约每 30 分钟发送一次统计信息。

要确定电源配置文件的有关数值,请使用测量设备耗电量的硬件,并执行需要信息的各种操作。测量执行这些操作时的电量使用情况并计算各项值(在适当情况下与其他基准操作的电量消耗做对比所得的差异值)。

电源配置文件的目的在于适当地估算电量消耗情况,电源配置文件的有关数值以电流(安培)表示。Android 框架用电流乘以子系统处于激活状态的时间,并计算毫安时值,然后将此值用于评估应用/子系统消耗的电池电量。

原理似乎不太复杂,那实际中到底是咋算的呢?

(以下内容摘自网络,侵删。)

在BatteryStatsHelper.java 中,有这么一个方法:

processAppUsage()方法中,一个应用的总功耗在这里体现出来了:

·        cpu

·        Wakelock(保持唤醒锁)

·        数据天线(2G/3G/4G)

·        WIFI

·        蓝牙

·        传感器

·        相机

·        闪光灯

这些数据,将决定着你的应用在耗电排行榜中的位置,以及是否给予用户警告高耗电。这些警告对于应用来说可能是致命的,用户可能因此而卸载应用。

应用总功耗是上述八个统计值的和。这八个统计器同继承自 PowerCalculator.java

具体来说,这八个耗电计算器的算法分别如下:

Android功耗评测系列之——软件评测方案原理的更多相关文章

  1. android黑科技系列——微信抢红包插件原理解析和开发实现

    一.前言 自从几年前微信添加抢红包的功能,微信的电商之旅算是正式开始正式火爆起来.但是作为Android开发者来说,我们在抢红包的同时意识到了很多问题,就是手动去抢红包的速度慢了,当然这些有很多原因导 ...

  2. Android网络编程系列之HTTP协议原理总结

    前言 作为搞移动开发的我们,免不了与网络交互打交道.虽然市面上很多开源库都封装的比较到位,我们实现网络访问也轻车熟路.但还是十分有必要简要了解一下其中的原理,以便做到得心应手,也是通往高级开发工程师甚 ...

  3. 【转】Android LCD(二):LCD常用接口原理篇

    关键词:android LCD TFT TTL(RGB)  LVDS  EDP MIPI  TTL-LVDS  TTL-EDP 平台信息:内核:linux2.6/linux3.0系统:android/ ...

  4. Kylin系列之二:原理介绍

    Kylin系列之二:原理介绍 2018年4月15日 15:52 因何而生 Kylin和hive的区别 1. hive主要是离线分析平台,适用于已经有成熟的报表体系,每天只要定时运行即可. 2. Kyl ...

  5. 【转】Android总结篇系列:Activity启动模式(lauchMode)

    [转]Android总结篇系列:Activity启动模式(lauchMode) 本来想针对Activity中的启动模式写篇文章的,后来网上发现有人已经总结的相当好了,在此直接引用过来,并加上自己的一些 ...

  6. 【转】Android总结篇系列:Activity生命周期

    [转]Android总结篇系列:Activity生命周期 Android官方文档和其他不少资料都对Activity生命周期进行了详细介绍,在结合资料和项目开发过程中遇到的问题,本文将对Activity ...

  7. Android按键添加和处理的方案

    Android按键添加和处理的方案  版本号 说明 作者 日期  1.0  Android按键添加和处理的方案 Sky Wang  2013/06/18        需求:Android机器上有个W ...

  8. Android性能优化系列之App启动优化

    Android性能优化系列之布局优化 Android性能优化系列之内存优化 Android性能优化系列之apk瘦身 应用的启动速度缓慢是我们在开发过程中常常会遇到的问题,比方启动缓慢导致的黑屏.白屏问 ...

  9. Android之Activity系列总结(三)--Activity的四种启动模式

    一.返回栈简介 任务是指在执行特定作业时与用户交互的一系列 Activity. 这些 Activity 按照各自的打开顺序排列在堆栈(即返回栈,也叫任务栈)中. 首先介绍一下任务栈: (1)程序打开时 ...

随机推荐

  1. Go的学习 append的使用

    1. package main; import "fmt" func test () { ],,,,}; s:=a[:] fmt.Printf(]) s=append(s,); s ...

  2. vue 防止xss攻击

    1.在终端引入xss,命令: npm install xss --save 2.在vue的页面进行引入 import xss from 'xss' 测试 <p v-html="test ...

  3. Java基本数据类型及所占字节大小

    一.Java基本数据类型 基本数据类型有8种:byte.short.int.long.float.double.boolean.char 分为4类:整数型.浮点型.布尔型.字符型. 整数型:byte. ...

  4. Yii2 kineditor

    用 kineditor实现异步 <table cellspadding=5 width=400> <tr height='150'> <td valign="t ...

  5. STM32 TIM3 PWM输出 4路

    一.设置TIM3的GPIO为推挽输出 void TIM3_IOConfig(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClo ...

  6. 第一次用angularJS做后台管理点滴

    很早以前就大概看过一点angualrjs,但是没有项目,一直没有进行下去,就是干巴巴的看着,过了一段时间发现什么也不记得了. 来yulebaby我的第一个后台管理是用easyui做的,做完那个以后发现 ...

  7. 【LeetCode 75】颜色分类

    题目链接 [题解] 维护一个左边界l和一个右边界r 其中0..l-1都是'0' 而 r+1..n-1都是'2' 我们令i=l;i<=r; 枚举每一个a[i]; ①如果a[i]=2.那么把a[i] ...

  8. oracle函数自治事务解决不能增改删的语句操作

    CREATE OR REPLACE FUNCTION SEQ3 (v_bname in VARCHAR2) return NUMBER is pragma autonomous_transaction ...

  9. 使用 Gradle 快速创建 Java 项目

    上一篇介绍了如何安装 Gradle,现在就可以直接通过已经安装好的 Gradle 创建一个普通 Java 项目 Gradle 默认内建了一个 init 插件,可以生成 Java 项目基础结构 $ gr ...

  10. Java学习之多线程(线程安全问题及线程同步)

    一.线程安全问题产生前提:1.多线程操作共享数据2.线程任务中有多条代码 class Ticket implements Runnable { //2.共享数据 private int num = 1 ...