深入浅出Android App耗电量统计

简介:

前言

    在Android统计App耗电量比较麻烦,直至Android 4.4,它仍没公开“电量统计”API或文档……额,是的,仅没有公开,并不是没有。平时在手机“设置- 电量”看到的数据

    Image

    就是系统调用内部API的统计结果。

 

基础概念

    1. 手机由众多“部件”组成,所谓“部件”是指:CPU,WIFI,GPS....所以,Android App消耗总电量为 App运行过程中,涉及各部件的消耗电量的总和。
    2. 假设运行App导致CPU运行,时间:t,CPU单位时间消耗电量:w,则App的CPU耗电量为:W = w*t,而有物理公式 W = U*I*t(U:电压值,I:电流值),在手机中,一般U恒定不变,所以,可以单独通过 Q(电容量,单位: mAh)= I * t 表示电量
 
系统源码分析

    核心源码/packages/apps/Settings/src/com/android/settings/fuelgauge/PowerUsageSummary.java

    核心类

        - BatteryStatsImpl:提供App各部件运行时间。

        - PowerProfile:提供部件电流数值。

    问题

        - Android怎样存储与读取App耗电量信息(即:BatteryStatsImpl数据怎么来的?)

        - Android怎么存储部件电流数值(即:PowerProfile数据怎么来的?)

        - Android具体耗电量计算方法

 

    1. Android怎样存储与读取App耗电量信息

        (1)先看下PowerUsageSummary.java如何获取BatteryStatsImpl?

         Image(1)

        Image(2)

        Image(3)

        可见 BatteryStatsImpl 通过 系统服务“batteryinfo”获得。

     

        (2)系统服务“batteryinfo”是什么玩意呢?(见:BatteryStatsService.java

        Image(4)

        系统服务“batteryinfo”其实就是BatteryStatsService,而BatteryStatsService“唯一的”构造函数提供了一个很重要的信息:filename!

      

        (3)BatteryStatsService在哪里创建?filename是什么?(见:ActivityManagerService.java

        Image(5)

        filename文件是:/data/system/batterystats.bin,关于batterystats.bin,之前民间很多文章说它用作电池校正,但Android工程师Dianne Hackborn在google+上明确:

        Image(6)

        betterystats.bin文件仅仅是一个记录不同app使用电量的一个文件。

 

        (4)再看看 BatteryStatsImpl(String filename) 构造函数(见:BatteryStatsImpl.java

        Image(7)

        这里只做了些基本的初始化。真正载入betterystats.bin数据是在(ActivityManagerService.java)mBatteryStatsService.getActiveStatistics().readLocked();

        Image(8)

        Image(9)

 

        至此,Android怎样存储与读取App耗电量信息分析结束。

        总结:

        (1)ActivityManagerService 创建并初始化 BatteryStatsService,并传入耗电量记录文件batterystats.bin;

        (2)BatteryStatsService 在内部创建 BatteryStatsImpl 实例,并传入耗电记录文件batterystats.bin;

        (3)ActivityManagerService 执行 mBatteryStatsService.getActiveStatistics().readLocked();导致 BatteryStatsService 的 BatteryStatsImpl 加载batterystats.bin数据;

        (4)在PowerUsageSummary计算App耗电量时,PowerUsageSummary从BatteryStatsService 中获取BatteryStatsImpl 实例,从而获得App的相关数据。

 

    2. Android怎么存储部件电流数值

        (1)比较简单,见 PowerProfile.java

        Image(10)

        PowerProfile读取资源 com.android.internal.R.xml.power_profile,并把数据加载到sPowerMap。

 

        (2)com.android.internal.R.xml.power_profile在哪里?

        在官方文档《Power Profiles for Android》明确了power_profile.xml位置:device///frameworks/base/core/res/res/xml/power_profile.xml。

        下面是一个samsung的power_profile.xml

        Image(11)

        字段含义见《Power Profiles for Android》。

 

        (3)每个OEM厂商有自己独立的power_profile.xml配置

        官方文档表明:OEM厂商应该有自己的power_profile.xml,因为部件(如:cpu, wifi…)耗电量应与具体硬件相关,这个只有OEM厂商清楚……

        Image(12)

  

        (4)PowerProfile关键API:

        - public double getAveragePower(String type):返回type的电流值(mA),type表示power_profile.xml中的某关键字(如:gps.on)。

        - public double getAveragePower(String type, int level) :返回type的电流值(mA),level表示xml中array的第几个value。

 

        至此,Android怎么存储部件电流数值分析结束。

        总结:

        (1)Android部件电流信息存于:power_profile.xml

        (2)每个OEM厂商有私有power_profile.xml

        (2)PowerProfile读取power_profile.xml,并提供API访问部件电流数值。

 

    3. Android具体耗电量计算方法

        App耗电量统计:processAppUsage()  

        硬件耗电量统计:processMiscUsage()

 

        processAppUsage()分析

            【1】processAppUsage耗电量统计的 时间段 是?

            Image(13)

            Image(14)

            关于统计的 时间段,BatteryStats有4个选项:

            Image(15)

            可见,processAppUsage 是 上一次拔掉设备后 ~ 至今 的App耗电量统计。

          

            【2】processAppUsage 的统计对象真的是App?

            Image(16)

            具体的 统计流程 都在for循环里,额……所以processAppUsage真实统计粒度是Uid。

            Uid与App关系:2个App签名和sharedUserId相同,则在运行时,他们拥有相同Uid。就是说processAppUsage统计的可能是多个App的耗电量数据,对于普通App,出现这种情况的几率较少,而对于Android系统应用则较为常见。

 

            【3】耗电量计算公式 - 部分1:计算Uid属下每个Process的耗电量数据,并求和。

            Uid_Power1 = (Process1_Power + … + ProcessN_Power);

            Process_Power = (CPUSpeed_Time * POWER_CPU_ACTIVE);

            Image(17)

 

            【4】耗电量计算公式 - 部分2:计算Uid的wake lock耗电量

            这里,Android只计算了partial wake lock的耗电量。

            Uid_Power2 = PartialWakeLock_Time * POWER_CPU_WAKE

            Image(18)

 

            【5】耗电量计算公式 - 部分3:计算Uid的数据流量(data traffic)耗电量

            Uid_Power3 = ( tcpBytesReceived + tcpBytesSent ) * averageCostPerByte

            Image(19)

            Image(20)

 

            【6】耗电量计算公式 - 部分4:计算Uid WIFI耗电量。

            Uid_Power4 = wifiRunningTimeMs * POWER_WIFI_ON

            Image(21)

 

            【7】耗电量计算公式 - 部分5:计算Uid其他传感器耗电量。

            Uid_Power5 = (Sensor1_Power + … + SensorN_Power)

            Sensor_Power = Sensor_Time * Power_Sensor

 

            至此,App耗电量计算方法分析结束。硬件耗电量统计(processMiscUsage())亦类似。

            总结App耗电量计算公式:

                Uid_Power(App耗电量,单位:mAh) = Uid_Power1 + Uid_Power2 + Uid_Power3 + Uid_Power4 + Uid_Power5

                    Uid_Power1 = (Process1_Power + … + ProcessN_Power);

                        - Process_Power = (CPUSpeed_Time * POWER_CPU_ACTIVE);

                    Uid_Power2 = PartialWakeLock_Time * POWER_CPU_WAKE              

                    Uid_Power3 = ( tcpBytesReceived + tcpBytesSent ) * averageCostPerByte

                    Uid_Power4 = wifiRunningTimeMs * POWER_WIFI_ON

                    Uid_Power5 = (Sensor1_Power + … + SensorN_Power)

                        - Sensor_Power = Sensor_Time * Power_Sensor

 
            说这么多,来一发……不,来一个统计耗电量的App吧,其实,之前已有人把这段Android系统代码抠出来,做了一个App,可以到 这里下载
 
--------------我是一个分割线--------------
 
            有一个好消息是:android5.0后,获取电量数据不用这么痛苦了,dumpsys  batterystats数据中。包含: Estimated power use (mAh):,下面就是每个uid的耗电量,只要把app下所有uid耗电量加起来即可!


本文转自hyddd博客园博客,原文链接:http://www.cnblogs.com/hyddd/p/4402621.html,如需转载请自行联系原作者。

目录
相关文章
|
2月前
|
XML Java 数据库
安卓项目:app注册/登录界面设计
本文介绍了如何设计一个Android应用的注册/登录界面,包括布局文件的创建、登录和注册逻辑的实现,以及运行效果的展示。
152 0
安卓项目:app注册/登录界面设计
|
3月前
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android多线程编程的重要性及其实现方法,涵盖了基本概念、常见线程类型(如主线程、工作线程)以及多种多线程实现方式(如`Thread`、`HandlerThread`、`Executors`、Kotlin协程等)。通过合理的多线程管理,可大幅提升应用性能和用户体验。
131 15
一个Android App最少有几个线程?实现多线程的方式有哪些?
|
3月前
|
存储 开发工具 Android开发
使用.NET MAUI开发第一个安卓APP
【9月更文挑战第24天】使用.NET MAUI开发首个安卓APP需完成以下步骤:首先,安装Visual Studio 2022并勾选“.NET Multi-platform App UI development”工作负载;接着,安装Android SDK。然后,创建新项目时选择“.NET Multi-platform App (MAUI)”模板,并仅针对Android平台进行配置。了解项目结构,包括`.csproj`配置文件、`Properties`配置文件夹、平台特定代码及共享代码等。
188 2
|
3月前
|
XML Android开发 数据格式
🌐Android国际化与本地化全攻略!让你的App走遍全球无障碍!🌍
在全球化背景下,实现Android应用的国际化与本地化至关重要。本文以一款旅游指南App为例,详细介绍如何通过资源文件拆分与命名、适配布局与方向、处理日期时间及货币格式、考虑文化习俗等步骤,完成多语言支持和本地化调整。通过邀请用户测试并收集反馈,确保应用能无缝融入不同市场,提升用户体验与满意度。
111 3
|
3月前
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android应用开发中的多线程编程,涵盖基本概念、常见实现方式及最佳实践。主要内容包括主线程与工作线程的作用、多线程的多种实现方法(如 `Thread`、`HandlerThread`、`Executors` 和 Kotlin 协程),以及如何避免内存泄漏和合理使用线程池。通过有效的多线程管理,可以显著提升应用性能和用户体验。
74 10
|
2月前
|
安全 网络安全 Android开发
深度解析:利用Universal Links与Android App Links实现无缝网页至应用跳转的安全考量
【10月更文挑战第2天】在移动互联网时代,用户经常需要从网页无缝跳转到移动应用中。这种跳转不仅需要提供流畅的用户体验,还要确保安全性。本文将深入探讨如何利用Universal Links(仅限于iOS)和Android App Links技术实现这一目标,并分析其安全性。
248 0
|
3月前
|
XML 数据库 Android开发
10分钟手把手教你用Android手撸一个简易的个人记账App
该文章提供了使用Android Studio从零开始创建一个简单的个人记账应用的详细步骤,包括项目搭建、界面设计、数据库处理及各功能模块的实现方法。
|
4月前
|
API Android开发
Android P 性能优化:创建APP进程白名单,杀死白名单之外的进程
本文介绍了在Android P系统中通过创建应用进程白名单并杀死白名单之外的进程来优化性能的方法,包括设置权限、获取运行中的APP列表、配置白名单以及在应用启动时杀死非白名单进程的代码实现。
64 1
|
4月前
|
Android开发 iOS开发 C#
Xamarin:用C#打造跨平台移动应用的终极利器——从零开始构建你的第一个iOS与Android通用App,体验前所未有的高效与便捷开发之旅
【8月更文挑战第31天】Xamarin 是一个强大的框架,允许开发者使用单一的 C# 代码库构建高性能的原生移动应用,支持 iOS、Android 和 Windows 平台。作为微软的一部分,Xamarin 充分利用了 .NET 框架的强大功能,提供了丰富的 API 和工具集,简化了跨平台移动应用开发。本文通过一个简单的示例应用介绍了如何使用 Xamarin.Forms 快速创建跨平台应用,包括设置开发环境、定义用户界面和实现按钮点击事件处理逻辑。这个示例展示了 Xamarin.Forms 的基本功能,帮助开发者提高开发效率并实现一致的用户体验。
155 0
|
4月前
|
存储 XML Linux
深入理解操作系统:进程管理与调度策略探索安卓应用开发:从零开始构建你的第一个App
【8月更文挑战第28天】在数字世界里航行,操作系统是掌控一切的舵手。本文将带你领略操作系统的精妙设计,特别是进程管理和调度策略这两大核心领域。我们将从基础概念出发,逐步深入到复杂的实现机制,最后通过实际代码示例,揭示操作系统如何高效协调资源,确保多任务顺畅运行的秘密。准备好了吗?让我们启航,探索那些隐藏在日常电脑使用背后的奥秘。 【8月更文挑战第28天】在这个数字时代,拥有一款自己的移动应用程序不仅是技术的展示,也是实现创意和解决问题的一种方式。本文将引导初学者了解安卓开发的基础知识,通过一个简单的待办事项列表App项目,逐步介绍如何利用安卓开发工具和语言来创建、测试并发布一个基本的安卓应用
下一篇
无影云桌面