首页 > 技术文章 > (转)Android APP中卸载其他APP的三种方法

wodehao0808 2018-06-04 15:49 原文

方法一

直接使用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
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ta_ab/article/details/77949348
 
原文地址:https://blog.csdn.net/ta_ab/article/details/77949348

推荐阅读