即使在没有任何其他事情发生的情况下,这个系统进程似乎也会稳定地占用 1-2% 的 CPU。 在一天的时间里,即使设备没有被用来做任何事情,这也会消耗大量的电池。我无法将其与任何其他应用程序联系起来,因为即使在几个小时的时间里,每个应用程序只占用了几秒钟的 CPU 时间,这个进程也会占用几分钟。
它似乎仍然在运行,即使我
关闭 WiFi
关闭蓝牙
关闭定位服务
关闭除最基本的同步(如 GMail)之外的所有功能
我编写了一个小测试程序,每隔 10ms 监控一次 /proc/
InputReader: Reconfiguring input devices. changes=0x00000010
WifiService: acquireWifiLockLocked: WifiLock{NlpWifiLock type=2 binder=android.os.BinderProxy@f73f0b8}
LocationFilter: Forcing stable location. Original location:Location[...
ConnectivityService: notifyType CAP_CHANGED for NetworkAgentInfo [WIFI () - 246]
上述每一行都出现在不同的时间,紧接着(10 毫秒内)一条日志信息,检测到 com.google.android.gms.persistent 的 CPU 占用情况,但没有明确说明是否与此有关。 不幸的是,上述日志信息中没有一条报告的 CPU 占用时间超过 10 毫秒,因此,即使能准确指出使用"persistent"的原因,也只占实际 CPU 占用时间的一小部分。
其他试图研究使用此进程的方法提出了各种建议(如可穿戴设备),而我没有也从未将这些设备连接到我的设备上。
是什么在使用这个进程? 我既想直接获得这些信息,也想寻找其他方法来推断这些信息,就像我通过 logcat 所做的尝试一样。
更新:我一直在 https://android.googlesource.com 上寻找源代码(例如 com.google.android.gms.persistent.java 或类似的东西),但一无所获。难道这不是公开源代码的一部分? 真正奇怪的是,这里甚至没有任何文档,例如: https://android.googlesource.com/platform/frameworks/base/+/33fca8e/docs/html/reference/com/google/android/gms
更新 2:我在 "设置"-> "账户 "下禁用了所有同步功能。 这似乎又减少了一些 CPU 占用率,电池电量似乎也下降到了最低水平--只是 com.google.android.gms.persistent 仍会定期占用大量 CPU。
我现在的理论是,无论是否需要,它都会以大约 60 秒的间隔发出警报,而该代码正在检查同步工作,如果不需要同步,它就会立即放弃时间片,让 CPU 直接进入睡眠状态。 然而,我半路上无法相信会使用如此可怕的设计,因为任何每分钟唤醒 CPU 的东西都会加快电池的耗电速度,即使它只是回到睡眠状态,而且为什么要使用轮询而不是中断驱动的同步呢?
据我所知(因为找不到),com.google.android.gms.persistent 的源代码没有开源,也无法在网上找到。 如果我错了,我愿意接受任何可以指向源代码的答案,因为我可以浏览源代码并自己确定 CPU 占用的原因。