开发中有个需求需要强制停止某个其他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的情况下,基本上不可能.