【问题标题】:Always run service in background as root on android始终在后台以root身份在android上运行服务
【发布时间】:2019-04-11 16:19:57
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    确实有一个未记录的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 自己的服务也只是暂时列入白名单。唯一不受这些后台执行限制的服务是 Linux system services,用 C++ 编写(在 JVM 之外运行)——而这与 Android 后台服务完全不同,用 Java 编写(它们是在 JVM 中运行并且都扩展了相同的受限 Service 类)。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这仍然不满足 not 必须运行应用程序的需求...问题是 JobScheduler 不会立即运行任务而 ForegroundService 会不在后台运行。 root 也没有真正的帮助,因为 root 不是 system
      • 启动接收器可用于启动应用程序进程,然后启动(绑定)服务。这一切都可以在用户不必“运行”应用程序的情况下发生。
      • 这仍然会在前台运行应用程序。 WorkManager(或底层的JobIntentService)在后台运行——我仍在等待不使用它们的正当理由;特别是因为没有真正的选择,即使执行可能会延迟。想象一下 20 个应用程序会使用您的建议……然后您可以滚动浏览通知面板;它不能很好地扩展。
      • 只有在服务中调用 startForeground() 时,应用才会在前台运行。在那之前,绑定服务将在后台运行,并且不会显示任何通知。我想这一切都取决于服务的目的。我也使用过 JobIntentService,但它用于执行某种限时任务。我还没有发现它对于始终在后台运行服务很有用,就像问题所问的那样。我假设 WorkManager 是类似的,尽管我从未使用过它。
      猜你喜欢
      • 1970-01-01
      • 2011-02-03
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-17
      相关资源
      最近更新 更多