【问题标题】:Is it possible to kill a "android:persistent=true" system-level app?是否可以杀死“android:persistent = true”系统级应用程序?
【发布时间】:2016-06-29 20:52:58
【问题描述】:

我有一个应用程序,它只是一个在启动时启动的服务。我正在系统级别开发,所以我使用android:persistent=true 以确保我的服务不会在内存压力下被杀死。

但是,我发现这会阻止我在任何条件下终止我的服务。我仍然希望能够自己杀死它 - 有没有办法做到这一点,还是因为清单中定义了“persistent=true”而不可能?

如果这是不可能的,我还能如何保护我的进程在内存压力下不死?我可以手动定义优先级吗?可能是oom_score 什么的?

【问题讨论】:

  • killBackgroundProcesses(packageName) 有效吗?
  • 调用 stopSelf() 会停止服务。还是你真的需要杀死它?
  • @Ozbek - 我需要终止进程以节省宝贵的 1mb 内存。
  • @Memme killBackgroundProcess 不起作用,但您的评论将我引向 forceStopPackage,这是系统应用程序的隐藏 ActivityManager 功能。我认为这可能有效,但我正在测试
  • @EricS。我的问题是为什么你需要终止服务?为什么不干脆阻止它?

标签: android


【解决方案1】:

想通了。大多数停止服务的方法都不会阻止持久标志重新启动它。这包括stopService、killBackgroundService,甚至System.exit(0);

ActivityManagerService中有一个隐藏函数forceStopPackage,可以通过ActivityManager接口反射调用。需要系统权限,但如果您使用持久性,这应该不是问题。

在清单中:

<uses-permission android:name="android.permission.FORCE_STOP_PACKAGES" tools:ignore="ProtectedPermissions"></uses-permission>

这将终止进程。给它进程/包的名称。

try {
        Class c;
        c = Class.forName("android.app.ActivityManager");
        Method m = c.getMethod("forceStopPackage", new Class[]{String.class});
        Object o = m.invoke(null, new Object[]{"com.your.process"});
    }catch (Exception e){
            Log.e(TAG, "Failed to kill service", e);
}

【讨论】:

    【解决方案2】:
    android:persistent=true
    

    适用于预加载的应用程序,不适用于下载的应用程序(例如来自 Play 商店的应用程序、从 apk 或 AS 安装的应用程序) 建议使用前台服务方式——最高优先级的进程。 Official example here, Another full-code example here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 2012-11-11
      • 2014-05-27
      • 2017-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多