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

3
根据这个讨论串,在Android Oreo之后,Google引入了一些后台限制,因此不可能在没有显示用户通知的情况下始终在后台运行Service

通过获取root权限是否可以实现这一点?

编辑:我发现人们正在投票关闭我的问题,因为显然它看起来太广泛了,但我正在运行LineageOS,如果可能的话,我想将我的应用程序作为系统服务运行,而且我认为这是可行的,而不需要修改源代码。例如,在安装操作系统时,我可以刷GApps,但这是可选的,它们似乎具有我所说的功能。我也不希望你为我做所有研究,我愿意接受指导我正确方向的答案。

2个回答

4

实际上有一个未记录的shell命令,可以用于白名单包,将它们添加到全局location_background_throttle_package_whitelist中(我没有测试过):

settings put global location_background_throttle_package_whitelist "package1,package2,package3"

^ 这是关于位置服务的,但可能还有其他可用的background_throttle设置:

settings list global | grep background_throttle

来源:XDA Developers


同时,在源代码中,我只发现了这些设置:

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

文档清楚地说明了某些服务正在被添加到临时白名单中。要了解实际上是什么在为这些服务提供白名单,需要进一步挖掘。这些后台服务限制实际上是在Context.java中描述的...而带有@UnsupportedAppUsage注释的方法只有系统使用。


Firebase WorkManager仍然是最佳选择,或者底层JobIntentService,它仍将作为常规后台服务运行< Android O。刷Android N或Lineage OS 14.1可能是一种可行的解决方法,但几乎没有被考虑过。
认为root权限会提供超级权限可能是一种误解。允许不受限制的位置访问仍然非常有限,即使是谷歌自己的服务也只是暂时被列入白名单。唯一从这些后台执行限制中排除的服务将是使用C ++编写的Linux 系统服务(这些服务在JVM之外运行),而这与使用Java编写的Android后台服务完全不同(这些服务在JVM内部运行,并且都扩展了相同的受限制的Service类)。

1

我发现一种非常有效的技术是使用绑定服务。不需要用户通知,而且由于您从未调用startService(),因此它可以在Oreo及更高版本上运行。也不需要root权限。一个很好的绑定服务的位置是从您的应用程序对象的onCreate()方法中绑定到一个始终运行的服务。每当您的应用程序正在运行时,服务将会运行。


这仍然不能满足不需要运行应用程序的需求...问题在于,JobScheduler不会立即运行任务,而ForegroundService不会在后台运行。root也没有真正帮助,因为root并不是system - Martin Zeitler
一个启动接收器可以用来启动应用程序进程,然后启动(绑定)服务。这一切都可以在用户无需“运行”应用程序的情况下发生。 - Greg Moens
这仍将在前台运行应用程序。WorkManager(或底层的JobIntentService)在后台运行 - 我仍在等待一个有效的理由不使用它们; 特别是因为没有真正的替代方案,即使执行可能会被延迟。想象一下有20个应用程序将使用你的建议...然后你可以滚动通知面板; 它不能很好地扩展。 - Martin Zeitler
如果从服务内部调用startForeground(),则应用程序只能在前台运行。在此之前,绑定服务将在后台运行,并且不会显示任何通知。我想这完全取决于服务的目的。我也使用过JobIntentService,但它用于执行某种有时间限制的任务。我没有发现它对于像问题所问的一样始终在后台运行服务很有用。我假设WorkManager是类似的,尽管我从未使用过。 - Greg Moens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接