方法一
直接使用Intent卸载
Uri uri = Uri.fromParts("package", "com.example.demo", null); Intent intent = new Intent(Intent.ACTION_DELETE, uri); startActivity(intent);
- 1
- 2
- 3
这是最简单的方式,调用卸载方法系统会弹出卸载APP对话框,点击确定就会立即卸载,不需要额外权限
方法二
使用PackageManager静默卸载
谷歌认为该方法是不安全的行为,因此该接口是@hide的,不是公开的接口,调用此接口需要有系统签名和相应的系统级权限
具体来说就是需要 <uses-permission android:name="android.permission.DELETE_PACKAGES"/>
权限,但<uses-permission android:name="android.permission.DELETE_PACKAGES"/>
是系统级权限,普通APP根本无法获取到,如果在AndroidManifest.xml强行加入该权限编译也不会通过
唯一的办法就是使用APK反编译工具在Android Studio之外修改权限,比如用apktool反编译工具先把apk文件解压出来,用编辑器在AndroidManifest.xml中加入上面的两个权限,然后在用工具apktool重新打包
获得<uses-permission android:name="android.permission.DELETE_PACKAGES"/>
权限后,定义PackageDeleteObserver实现类,实现packageDeleted方法
private class PackageDeleteObserver extends IPackageDeleteObserver.Stub { private int position; private int mFlag; public PackageDeleteObserver(int index, int flag) { position = index; mFlag = flag;// 0卸载1个包,1卸载N个包 N>1 } @Override public void packageDeleted(String arg0, int arg1) throws RemoteException { // TODO Auto-generated method stub Message msg; msg = mHandle.obtainMessage(); msg.what = FLAG_DELETE_VIRUS; msg.arg1 = position; msg.arg2 = mFlag; msg.sendToTarget(); } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
获取PackageManager 对象,调用deletePackage方法
PackageManager pkgManager = mContext.getPackageManager();
PackageDeleteObserver observer = new PackageDeleteObserver(currVirus, 1); pkgManager.deletePackage(pakName, observer, 0);
- 1
- 2
- 3
最后,还需要进行系统签名才能使用
对apk进行系统签名:
java -jar signapk.jar platform.x509.pem platform.pk8 test.apk test_signed.apk
- 1
将签名之后的文件 push到手机中,需要root权限
方法三
通过pm命令方式实现静默卸载
该方法直接对Android系统执行卸载命令,需要root权限
//pm命令可以通过adb在shell中执行,同样,我们可以通过代码来执行 public static String execCommand(String... command) { Process process = null; InputStream errIs = null; InputStream inIs = null; String result = ""; try { process = new ProcessBuilder().command(command).start(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int read = -1; errIs = process.getErrorStream(); while ((read = errIs.read()) != -1) { baos.write(read); } inIs = process.getInputStream(); while ((read = inIs.read()) != -1) { baos.write(read); } result = new String(baos.toByteArray()); if (inIs != null) inIs.close(); if (errIs != null) errIs.close(); process.destroy(); } catch (IOException e) { result = e.getMessage(); } return result; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
执行卸载命令
execCommand("pm","uninstall", "packageName");
- 1
编译生成apk时,要在manifest文件下添加Android:sharedUserId=”android.uid.system”
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.xieyuan.mhfilemanager" android:versionCode="1" android:versionName="1.0" android:installLocation="internalOnly" android:sharedUserId="android.uid.system" >
- 1
- 2
- 3
- 4
- 5
- 6