一些应用程序如何仍然可以获取当前的应用程

and*_*per 5 android process

背景

在过去,我发现了下一个杀死应用程序后台进程的方法,给出了它的包名:

public static boolean killApp(final Context context, final String packageName) {
    final ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    final List<ActivityManager.RunningAppProcessInfo> pids = am.getRunningAppProcesses();
    for (int i = 0; i < pids.size(); i++) {
        final ActivityManager.RunningAppProcessInfo info = pids.get(i);
        if (info.processName.equals(packageName)) {
            android.os.Process.killProcess(info.pid);
            if (new File("/system/bin/kill").exists()) {
                InputStream inputStream = null;
                try {
                    inputStream = Runtime.getRuntime().exec("kill -9 " + info.pid).getInputStream();
                    final byte[] buffer = new byte[100];
                    inputStream.read(buffer);
                } catch (final IOException e) {
                }
                StreamsUtil.closeStream(inputStream);
            }
            am.killBackgroundProcesses(packageName);
            return true;
        }
    }
    am.killBackgroundProcesses(packageName);
    return false;
}
Run Code Online (Sandbox Code Playgroud)

问题

从特定的Android版本(5.1)开始,获取正在运行的进程列表的函数只返回当前应用程序的进程,因此使用它是没有用的.

我发现了什么

  • Play商店中的大多数应用程序确实无法显示进程列表,而是仅显示当前应用程序的进程或最多服务列表.

  • 似乎有些应用程序仍设法显示后台应用程序进程,甚至可以杀死它们.作为一个例子,我发现AVG的应用程序能够这样做,在这里.

    在他们可以做之前,他们告诉用户启用应用程序的使用情况统计设置,我记得用它来检查应用程序启动时间的一般信息.

  • 另一个成功杀死后台进程但没有任何用户确认的应用程序是" 快速任务杀手 ".它还显示了被杀死的所有进程的祝酒词.我可能错了,但似乎它总是相同数量的任务.

  • 我还认为有一种相对简单的方法可以使用"ps"函数获取进程列表,但前提是设备是root用户(否则它只返回当前应用程序的进程).

  • 有一个带库的临时解决方案,可以在这里找到(这里发布),但这似乎不适用于Android 7.1.2,而且很可能在以前的版本上.

这个问题

应用程序如何获取具有后台进程的应用程序列表,以及它们如何杀死它们?

是否可以在不使用UsageStatsManager类的情况下这样做?