【问题标题】:Heavy CPU analysis while running foreground service运行前台服务时进行大量 CPU 分析
【发布时间】:2020-02-18 14:15:00
【问题描述】:

所以,我有一个Service,它对应用程序逻辑很重要,因此需要一直处于活动状态。 首先,我将其创建为foreground service

每当用户开始运行时,Service 就会开始做很多繁重的事情。它使用FusedLocationAPI 不同类型的传感器并进行许多不同的计算。此时手机开始发热(CPU 使用率很高)。运行停止时,加热停止,CPU 下降。

这让我觉得主要问题是无论何时使用这些传感器并进行计算,但有很多可能导致这种情况,我想了解,在这种情况下如何深入分析击球手的使用情况?我读到Battery Historian 应该是要走的路,但那里的信息很复杂,没有给我太多信息。我如何使用这些数据来了解哪个类/可运行/代码部分对 CPU 使用负责?也许有更好的方法来解决这个问题?提前致谢。

使用 CPU 分析器详细分析正在发生的事情(根据建议)。


  1. 图像。应用程序打开,几个不同的屏幕来回切换。没什么特别的。手机不会发热,从 CPU 分析来看,一切看起来都还不错。

2.用户开始运行并进入沉重状态。黄色(浅绿色)矩形表示前面提到的为应用程序带来重要作用的“重要服务”。考虑到整个运行行程的百分比,被调用的函数不会占用过多的 CPU 时间 - 这让我想,我必须看看其他地方..


  1. 我看到的是,每当我锁定手机时(在服务运行时)CPU 都会大幅增加。从 CPU Bottom Up 分析我无法理解导致问题的原因(橙色矩形) - 看起来像一堆 Android 的东西正在发生,但它没有给我任何线索。

从 CPU 分析器中,我知道我在考虑 CPU 使用率时遇到了一个严重的问题,但现在我不明白是什么导致了它(哪一段代码/类/函数)。我知道无论何时创建我的重要服务(在应用程序启动时),我都会使用PARTIAL_WAKE_LOCK 来不允许 CPU 进入睡眠状态并使服务始终处于活动状态。据我了解,我需要为此找到不同的解决方案,因为 CPU 会消耗太多电池。

我怎么能只使用分析器找到这个?我现在这个事实仅适用于代码和探查器堆栈并没有告诉我太多关于这一点的信息(也许我看的地方不对?)

【问题讨论】:

  • AS CPU Profiler 会准确地告诉您每个线程在每个函数中花费了多少时间。
  • @greeble31 感谢您的建议。我用图片和一些想法编辑了原始帖子,也许你可以看看这个。

标签: android battery foreground-service


【解决方案1】:

我找到了 CPU 使用率高的根本原因。 我对线程进行了详细调查,发现DefaultDispatcher 线程正在使用 A LOT of CPU。

原来这是 Kotlin-Coroutines 库中的一个错误,最新版本提供了修复。当我进行测试时,我使用版本 1.3.1,但将版本号更改为 1.3.3 为我带来了很大的改进:从 40% 的使用率到 10% 的 CPU 使用率。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    相关资源
    最近更新 更多