如何获取已安装应用的电池使用情况?

时间:2016-02-17 06:05:02

标签: android battery usage-statistics installed-applications

使用此代码,我可以找到手机的电池电量:

int level = battery.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = battery.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
float percent = (level / (float)scale) * 100;

但是如何获取手机上安装的应用的电池使用情况,包括屏幕上的应用,如下图所示?

Screenshot of battery usage details screen

4 个答案:

答案 0 :(得分:6)

很抱歉让您失望,但 Android的电源使用API​​不公开。所以没有正式的方式来获得你想要的东西。

但您可以使用反射来访问某些私有成员和方法并使用它们。您还可以查看this。从这里,您可以获得个人应用程序功耗的一些定量值。

您可以使用该值来计算所有应用的百分比。

答案 1 :(得分:2)

可以从设备中转储电池状态,如下所示:

adb shell dumpsys batteryinfo

答案 2 :(得分:2)

测量特定应用或手机硬件特定部分的功耗并非易事。从公共Google Developer API开始,无法轻松完成此操作。还有其他方法安静复杂。对于每个Android智能手机,Google都要求制造商向设备添加所谓的power profile XML。他们看起来像这样

  <item name="screen.on">0.1</item>  <!-- ~200mA -->
  <item name="screen.full">0.1</item>  <!-- ~300mA -->
  <item name="bluetooth.active">0.1</item> <!-- Bluetooth data transfer, ~10mA -->
  <item name="bluetooth.on">0.1</item>  <!-- Bluetooth on & connectable, but not connected, ~0.1mA -->
  <item name="wifi.on">0.1</item>  <!-- ~3mA -->
  <item name="wifi.active">0.1</item>  <!-- WIFI data transfer, ~200mA -->
  <item name="wifi.scan">0.1</item> 

它们告诉您组件的每个硬件状态消耗多少电流(例如,Wifi有三种状态,CPU有10种状态等)。现在Android基于Linux,这允许您检查每个硬件组件的当前状态。例如文件

/sys/devices/virtual/leds/lcd-backlight/brightness

为您提供LCD的当前状态(请注意,此 root访问权限是必需的)。对于每个硬件组件,存在这样的路径。如果您现在想要精确测量应用程序消耗的能量,您需要编写一个服务,该服务会在应用程序处于活动状态时监视,以及当前的硬件状态。有了这些信息,您就可以计算能耗。

还有一个应用程序是开源的,它被称为PowerTutor(这里是Play-Store link而她,你将找到source code。它正是我所做的他们还发表了一篇关于他们的方法准确程度的科学paper(它做得很好)。

现在出现了问题。几年前,我遇到了测量某些应用程序功耗的问题。客户希望我们评估他们的确切功耗。最后,我们发现分析所依据的功率曲线不够准确。似乎制造商只是在XML中放入一些甚至与设备无关的值。我们拥有来自20个不同品牌的100多种不同设备,其中只有少数设备的XML值与设备相关。

最后我可以说,不要花太多时间来测量软件方面的实际功耗,但这不值得付出努力。使用真正的万用表并直接测量硬件。

答案 3 :(得分:0)

我建议您在源代码环境中编程,而不是使用反射来访问某些私有成员和方法,这样您就可以使用任何私有API。

如果您还想包含内部类或方法,请执行以下操作:

  1. 转到/ platforms /.
  2. 将下载的隐藏API文件复制,粘贴并替换到此目录中,例如机器人-23 /的android.jar。
  3. 将compileSdkVersion和targetSdkVersion更改为23(例如)。
  4. 最后,重建您的项目。
  5. https://github.com/anggrayudi/android-hidden-api