使用此代码,我可以找到手机的电池电量:
int level = battery.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = battery.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
float percent = (level / (float)scale) * 100;
但是如何获取手机上安装的应用程序的电池使用详细信息,包括屏幕的详细信息,如下图所示?
使用此代码,我可以找到手机的电池电量:
int level = battery.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = battery.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
float percent = (level / (float)scale) * 100;
但是如何获取手机上安装的应用程序的电池使用详细信息,包括屏幕的详细信息,如下图所示?
测量特定应用程序或手机硬件特定部分的功耗并不容易。在公开的 Google Developer API 中,不可能以简单的方式做到这一点。还有其他一些非常复杂的方法。对于每部 Android 智能手机,Google 都要求制造商向设备添加所谓的电源配置文件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 链接,你会找到源代码。它完全按照我刚才的解释。他们还发表了一篇关于他们的准确度的科学论文方法是(它做得很好)。
现在问题来了。几年前,我遇到了测量某些应用程序的功耗的问题。一位客户希望我们评估他们的确切功耗。最后,我们发现分析所依据的功率曲线不够准确。似乎制造商只是在 XML 中添加了一些甚至与设备无关的值。我们有来自 20 个不同品牌的 100 多种不同设备,其中只有少数似乎在其 XML 中具有与设备相关的值。
最后我可以说,不要花太多时间在软件端测量实际功耗,这不值得。使用真正的万用表并直接测量硬件。
对于 API >= 19,可以像这样从设备中转储电池统计信息:
adb shell dumpsys batterystats
对于 API < 19,请使用:
adb shell dumpsys batteryinfo
我建议您在源代码环境中编程,而不是使用反射来访问一些私有成员和方法,这允许您使用任何私有 API。
如果您还想包含内部类或方法,请执行以下操作: