开发中有个需求需要强制停止某个其他App进程,也就是传说中的强杀,查了下API,发现ActivityManager里面有一个killBackgroundProcesses (String packageName)方法.

果断写个demo试了试,发现不怎么好使,根本杀不死packageName指定的进程,仔细看了一下文档,发现这个方法结束了进程之后,进程还会自动重启,所以要强制结束某个进程的话,这个API方法根本行不通.

突然想到在系统设置的APP管理里面,安装的APP有个强制停止功能.打开Settings的源代码按图索骥,最终在InstalledAppDetails类里面找到了这样一个方法:

private void forceStopPackage(String pkgName) {
        ActivityManager am = (ActivityManager)getActivity().getSystemService(Context.ACTIVITY_SERVICE);
        am.forceStopPackage(pkgName);
        mState.invalidatePackage(pkgName);
        ApplicationsState.AppEntry newEnt = mState.getEntry(pkgName);
        if (newEnt != null) {
            mAppEntry = newEnt;
        }
        checkForceStop();
}

还是调用ActivityManager的forceStopPackage方法,但是这个方法是隐藏,只能通过反射来调用.于是又果断写demo.

ctivityManager mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);  
Method method = Class.forName("android.app.ActivityManager").getMethod("forceStopPackage", String.class);  
method.invoke(mActivityManager, packageName);

运行程序测试,还是不能杀死第三方App进程.仔细看文档这个方法需要如下权限:android.permission.FORCE_STOP_PACKAGES

这个权限的定义如下:

<permission android:name="android.permission.FORCE_STOP_PACKAGES"  
     android:permissionGroup="android.permission-group.SYSTEM_TOOLS"  
     android:protectionLevel="signature"  
     android:label="@string/permlab_forceStopPackages"  
     android:description="@string/permdesc_forceStopPackages"/>

从android:protectionLevel="signature" 这个定义可以看到,这个权限要和App的签名保持一至,而android.permission.FORCE_STOP_PACKAGES定义在AndroidFramework里面,可以在frameworks/base/core/res/Android.mk中看到它的签名信息:

LOCAL_NO_STANDARD_LIBRARIES := true  
LOCAL_PACKAGE_NAME := framework-res  
LOCAL_CERTIFICATE := platform

所以即便用反射的方式调用这个方法,还是不能结束第三方App的进程.所以想强制杀死第三方App进程,在没有Root的情况下,基本上不可能.