• (转)Android APP中卸载其他APP的三种方法


    方法一

    直接使用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
  • 相关阅读:
    <四>ASP.NETCORE 控制器(controller) 和过滤器(filter)
    <二>Asp.netcore MVC 模型(Model)
    <一>领域驱动设计
    <一>Asp.netcore MVC 路由及URL生成
    sql优化技巧之 not in 改 left join
    <三>Asp.netcore MVC 视图(View)
    <一>Thread 线程基础
    [转]mysql 启动失败:su: warning: cannot change directory to /nonexistent: No such file or directory
    NuGet修改packages目录/迁移缓存文件夹
    ORA00933: SQL 命令未正确结束
  • 原文地址:https://www.cnblogs.com/wodehao0808/p/9133720.html
Copyright © 2020-2023  润新知