始终 运行 在 android 上以 root 身份在后台服务

Always run service in background as root on android

根据 Android Oreo 之后,Google 引入了一些背景限制所以运行 服务 总是在后台而不显示用户通知是不可能的。

是否可以使用 root 权限实现此目的?

编辑:我看到人们投票结束我的问题,因为它看起来太宽泛了,但我 运行ning LineageOS,如果可能的话,我想把我的应用程序作为系统服务放到运行,我认为这在不修改源代码的情况下是可行的。例如,在安装 OS 时,我可以刷入 GApps,但它是可选的,而且它们似乎具有我正在谈论的功能。我也不指望你为我做所有的研究,我愿意接受为我指明正确方向的答案。

确实有一个未记录的 shell 命令,可用于将包列入白名单,方法是将它们添加到全局 location_background_throttle_package_whitelist(我还没有测试过):

settings put global location_background_throttle_package_whitelist "package1,package2,package3"

^ 这是针对 location 服务的,但可能还有更多 background_throttle 设置可用:

settings list global | grep background_throttle

来源:XDA Developers.


同样在 source code 中,我只找到了这些设置:

Settings.Global.LOCATION_BACKGROUND_THROTTLE_PACKAGE_WHITELIST
Settings.Global.LOCATION_BACKGROUND_THROTTLE_PROXIMITY_ALERT_INTERVAL_MS
Settings.Global.LOCATION_BACKGROUND_THROTTLE_INTERVAL_MS

documentation is clear about the fact that certain services are being added into a temporary white-list. To find out what actually white-lists these services, one would have to dig further. These background service restriction is actually being described in Context.java ...而用 @UnsupportedAppUsage 注释的方法是只有系统使用的方法。


Firebase WorkManager is still the best option available - or the underlying JobIntentService,它仍将 运行 作为常规后台服务 < Android O。闪烁 Android N 或 Lineage OS 14.1 将是某种解决方法,几乎​​没有被考虑。

root 权限会提供超能力的假设可能是一种误解。允许不受限制的位置访问仍然非常有限,甚至 Google 自己的服务也只是 暂时 列入白名单。唯一排除在这些后台执行限制之外的服务是 Linux system services,用 C++ 编写(在 JVM 之外 运行ning)——虽然这是非常不同的比 Android 后台服务,用 Java 编写(在 JVM 中 运行ning 并且都扩展了相同的限制 Service class)。

我发现一种非常有效的技术是使用绑定服务。不需要用户通知,因为您从不调用 startService(),它适用于 Oreo 及更高版本。也不需要根。绑定到始终 运行 的服务的好地方是应用程序对象的 onCreate() 方法。只要您的应用 运行ning,服务就会 运行ning。