我的 Android 应用程序正在耗尽电池电量吗?

Posted

技术标签:

【中文标题】我的 Android 应用程序正在耗尽电池电量吗?【英文标题】:Is my Android App Draining Battery? 【发布时间】:2011-07-04 16:27:54 【问题描述】:

我正在开发一款适用于 android 的游戏。它使用表面视图并使用提供的那种标准 2D 绘图 API。当我第一次发布游戏时,我正在做各种愚蠢的事情,比如在每一帧上重新绘制 9 个补丁,同样还有文字。此后,我通过绘制位图对象并在每一帧中绘制它们来优化其中的大部分内容,仅在需要时才重新绘制到位图对象上。

我之前收到过关于电池耗电的投诉,在我进行修改后,我想(科学地)了解我是否进行了任何改进。不幸的是,我没有任何先前的数据可供参考,因此将性能与其他游戏进行比较将是最有用的。

我一直在运行 Traceview,并将其结果主要用于识别 CPU 耗时的方法。

那么 -- 确定我的应用电池性能的最佳方法是什么?什么是好的基准?

我知道我可以通过设置查看不同应用程序的 %s,但这又是不科学的,因为我从中得到的数字也取决于所有其他应用程序中发生的情况。我已经浏览了(大部分)Google 的文档,虽然信息很明确,您应该节省电池(并且它偶尔会提供有关如何节省电池的提示),但几乎没有迹象表明我如何可以衡量我的应用程序的执行情况。我最不想看到的就是 Android Market 中出现更多关于电池耗电的投诉!

提前致谢。


编辑

感谢您提供的所有有用意见/建议。我真正想知道的是我如何使用来自 Traceview 的数据(即:游戏每帧花费的 CPU 时间(以毫秒为单位))来确定电池使用情况(如果可能的话) .回顾我原来的问题,我可以看到我有点含糊。再次感谢。

【问题讨论】:

不幸的是,我担心 CPU 指标还不够。例如。在网络上每 5 秒发送一个小数据包会比一次发送多个数据包然后静默一分钟消耗更多。可能同样适用于传感器和 GPS 【参考方案1】:

“我知道我可以查看 通过设置不同的应用程序, 但这又是不科学的,因为 我从中得到的数字也取决于 其他所有发生的事情 应用程序。”

我要做的第一件事是寻找一个已经存在的应用,该应用具有已知的、一致的电池使用情况,然后您可以将其作为参考来确定应用的使用情况。

如果没有这样的应用程序,您将不得不希望其他人的回答......如果您成功制作了这样的应用程序,我建议您出售您的新“电池使用参考”应用程序,以便其他程序员可以使用它。 :)

【讨论】:

问题是因为一切都在 %s 中,所以这仍然不可靠。举个例子:当我从充电器上拔下我的 Nexus 并开始播放应用程序几分钟时,当我查看电池消耗时,它超过了 50%。但这(希望)并不意味着电池使用量非常高。 (对不起,措辞不是很好) 对,但是如果有一个应用程序一直使用一定量的 mA,那么您可以计算出您的应用程序使用了多少与它相关的...例如参考应用程序为 10%,而您为 5%,那么您使用的是静态 mA 量的一半……同样,如果您为 50%,但它为 10%,那么您就是使用 5 倍的 mA。就像我说的那样,可能没有这样的应用程序,但如果你无论如何都要去麻烦,它可能是值得的。 测量电池使用的最准确方法(除非有硬件来测量实际功耗)可能是为您的设备充满电,然后查看您的应用程序可以运行多长时间直到电池耗尽。其他一切都是不同精度的近似值。例如 -- 电池使用目前没有考虑 OpenGL 功耗。 是的,我也打算建议这样做。看看它在什么都不做的情况下持续多久。如果它持续 48 小时,那么它在空闲时使用 2%。如果您知道电池的 mAh,那么也可以将其放入 mAh 中,而不仅仅是百分比。然后,看看你的游戏持续了多长时间。八小时(从一两个孩子那里得到一些帮助)将是每小时 12.5% 的电池使用量,除非您可能想要移除 2% 的基本负载。【参考方案2】:

如果您要衡量“比以前版本的改进”,我认为与其他游戏进行比较是没有意义的!除非这两个游戏完全一样,否则这是不科学的。

相反,我会从源代码管理中获取您的应用程序的先前版本,运行它,测量它,然后使用最新代码运行它并再次进行比较。

为了进行比较,您可以使用命令行工具“top”(如果您的手机已植根,则肯定在busybox中可用,不确定它是否带有库存手机。可能没有)。这会以百分比显示您的进程的 CPU 使用率。

【讨论】:

这是个好主意,值得一试,但我认为我的用户并不关心我的应用程序的性能是否有所提高——我认为他们只是不想看到大容量电池他们可以与我的应用程序关联的流失。我知道这与我说的“科学”有点矛盾,但我真正想知道的不是“什么是更好的电池使用”,而是“什么是合适的”。然后从那里拿走…… “适当”都是相对的。没有人可以给你答案。 一款具有华丽图形的好游戏大量使用 CPU。但这就是所有 CPU 马力的用途。如果您真的很担心,您可以添加一个“轻”模式,使视觉效果更加静态,但占用 CPU 开销的一小部分。【参考方案3】:

您的游戏可能正在耗尽电池电量。我认为这取决于几个原因,其内容如下:

您的应用程序是一个游戏。游戏会很快耗尽电池电量。 在Thread 的帮助下,您正在迭代。您是否限制了 FPS 以使 CPU 跳过不必要的迭代?由于您使用的是 2D,我假设您使用的是 SurfaceView。对于实时游戏来说,60 FPS 就足够了。 当您的应用程序终止时,您不会停止Thread。因此,当您的应用程序停止运行时,您需要重复代码。 你有一个迭代锁onPause期间执行wait();吗?

评论您的游戏漏电的人可能是在您的应用程序未使用时。否则,这会很奇怪,因为 Android Market 上的每个游戏都会消耗电池电量 - 更多更少。

【讨论】:

实际上,您提出的问题是我(以为)我不久前已通过您最后一个要点中的方法修复的问题:游戏暂停时的 CPU 使用率飙升,但在暂停循环中添加 wait() 解决了问题。我最近一直在使用 Watchdog 监控我的所有应用,并且从未检测到我的应用超过阈值。 如果上述几点已得到修复,我很难看到电池正在耗尽。这几点是解决功耗最现实的方法。像这样看 - 如果检查了以上几点,您的游戏怎么可能消耗电池电量?【参考方案4】:

这是我的建议:

我在使用PowerTutor 开发我的应用程序(有时以

祝你好运, -史蒂夫

【讨论】:

感谢您成为唯一直接回答我问题的人!将尝试您的建议,然后接受您的回答。 Np,根据其他人的回答,我担心我会偏离目标。但是,我认为其他答案对我们双方都有帮助,有很多很好的技巧可以防止应用程序成为耗电者,导致用户卸载应用程序的原因! PowerTutor 是一款很棒的应用程序,对我帮助很大,但它不包括应用程序详细信息中的 GPS 使用情况。 Dr Power 是一个很好的补充应用程序来做到这一点。它不显示图表,但在应用详细信息中包含更多模块。【参考方案5】:

我如何使用来自 Traceview 的数据(即:游戏每帧花费的 CPU 时间(以毫秒为单位))来确定电池使用情况(如果可能的话)

理论上,可以通过逐帧查看功耗来推断您的应用的电池使用情况。完成此任务的最佳方法是在您的应用程序运行 CPU 密集度最高的操作时(仅)评估给定时间段(例如两秒)内 CPU 的功耗,(此外,可以通过这种方式收集 GPU 功耗也)同时记录 TraceView 数据(例如每秒帧数或每秒翻转数),为您提供给定毫秒内跨 CPU/GPU 的流量。使用此数据,您可以通过运行上述测试几次来准确计算应用的平均峰值功耗。

这就是为什么我说这只是理论:有很多变量需要考虑:

    上述测试时运行的其他进程的数量和性质(处理器密集型) 评估 CPU/GPU 功耗的方法(虽然 PowerTutor 等工具可有效评估功耗,但在这种情况下,评估不会那么有效,因为需要收集带时间戳的功耗数据。另外,几乎任何收集功率数据的方法都会引入额外的开销 (Schrödinger's cat),但这完全取决于您需要/希望的准确度。) 功耗信息的原因 - 如果您希望为测试或 BETA 测试/评估目的定义应用程序的功耗,那么它是一项可行的任务,需要一定的决心和适当的工具。如果您希望在用户的设备上“在野外”获得有关功耗的有用信息,那么我会说这是合理的但不现实的。所涉及的变量甚至会使最坚定和最专注的研究人员晕倒。您必须在野外测试设备/Android 版本的所有可能组合。此外,正在运行的进程/线程和已安装的应用程序的组合可能无法计算。

我希望这能为您的问题提供一些见解,尽管我可能比需要的更深入。

-史蒂夫

【讨论】:

【参考方案6】:

对于任何寻找的人来说,我们一直在使用的一个非常有用的资源是 AT&T 的一款名为 ARO 的免费应用程序。

看看:ARO

它以前对我有帮助,但我不经常看到它被提及,所以我想我会把它放在这里给任何想看的人。

【讨论】:

【参考方案7】:

有一个由高通开发的电池分析器,叫做 Trepn Profiler:https://developer.qualcomm.com/mobile-development/increase-app-performance/trepn-profiler

【讨论】:

【参考方案8】:

我知道这个问题已经过时并且已经很晚了,但是对于任何来这里寻找解决方案的人,我建议您看一下 JouleUnit 测试: http://dnlkntt.wordpress.com/2013/09/28/how-to-test-energy-consumption-on-android-devices/

它集成到 eclipse 中,并为您提供有关您的应用消耗多少电池的大量详细信息。

【讨论】:

【参考方案9】:

我知道三个选项可以帮助您进行科学测量:

    使用专门为此构建的硬件。季风高压电源监控器。 https://msoon.github.io/powermonitor/PowerTool/doc/Power%20Monitor%20Manual.pdf 在您的手机上下载并安装 Trepn Profiler(来自 Qualcomm 的工具)。您不需要计算机进行报告。报告在电话上是实时的。您可以从以下链接下载 Trepn Profiler:https://play.google.com/store/apps/details?id=com.quicinc.trepn&hl=en_US

请注意,对于最近的手机(Android 6+),它在估计模式下工作。如果您需要准确的数字,则需要选择设备列表。检查以下链接以获取列表: https://developer.qualcomm.com/software/trepn-power-profiler/faq 您可以单独分析应用程序,也可以分析整个系统。

    使用来自谷歌的 Batterystats 和 Battery Historian。 https://developer.android.com/studio/profile/battery-historian

【讨论】:

以上是关于我的 Android 应用程序正在耗尽电池电量吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 Android 应用程序偶尔会非常快地耗尽电池电量?

Android 定位服务耗尽电池 - 融合定位 API

如何了解我的 Android 应用在用户设备上消耗了多少电量?

使用 gps 捕获经纬度而不会耗尽电池电量

Android 调试 -> 电池耗尽

Google Fit 应用程序如何在不耗尽电池电量的情况下一直测量步数?