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

时间:2019-04-11 16:19:57

标签: android android-service root background-process android-8.0-oreo

根据 Android Oreo 之后的this thread Google 引入了一些背景限制,因此无法始终在 Service 中运行背景,而不显示用户通知。

是否可以通过root特权来实现?

编辑:我看到人们投票结束我的问题,因为它看起来似乎太笼统了,但是我正在运行 LineageOS ,并且我想将我的应用作为系统服务运行如果可能的话,我认为这无需修改源代码就可以实现。例如,在安装操作系统时,我可以刷新GApp,但是它是可选的,并且它们似乎具有我在说的功能。我也不希望您为我做所有的研究,我愿意接受为我指明正确方向的答案。

2 个答案:

答案 0 :(得分:3)

确实存在一个未记录的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很清楚,某些服务已添加到临时白名单中。为了找出实际上将这些服务列入白名单的内容,必须进一步挖掘。这些后台服务限制实际上是在Context.java中描述的,而用@UnsupportedAppUsage注释的方法是仅系统使用的方法。


Firebase WorkManager仍然是最佳的选择-底层的JobIntentService仍将作为常规后台服务运行O。刷新Android N或Lineage OS 14.1是一种解决方法,几乎​​没有考虑过。

关于root权限将提供超级权限的假设可能是一个误解。允许不受限制的位置访问仍然非常有限,甚至Google自己的服务也只是临时地列入白名单。排除在这些后台执行限制之外的唯一服务是使用C++编写的Linux system services(在JVM之外运行)–而与使用{{ 1}}(它们在JVM中运行,并且都扩展了相同的受限制的Java类)。

答案 1 :(得分:1)

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