方法一

直接使用Intent卸载

Uri uri = Uri.fromParts("package", "com.example.demo", null);Intent intent = new Intent(Intent.ACTION_DELETE, uri);startActivity(intent);

这是最简单的方式,调用卸载方法系统会弹出卸载APP对话框,点击确定就会立即卸载,不需要额外权限

方法二

使用PackageManager静默卸载

谷歌认为该方法是不安全的行为,因此该接口是@hide的,不是公开的接口,调用此接口需要有系统签名和相应的系统级权限

具体来说就是需要
权限,但 是系统级权限,普通APP根本无法获取到,如果在AndroidManifest.xml强行加入该权限编译也不会通过

唯一的办法就是使用APK反编译工具在Android Studio之外修改权限,比如用apktool反编译工具先把apk文件解压出来,用编辑器在AndroidManifest.xml中加入上面的两个权限,然后在用工具apktool重新打包

获得权限后,定义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();      }  }  

获取PackageManager 对象,调用deletePackage方法

PackageManager pkgManager = mContext.getPackageManager();  PackageDeleteObserver observer = new PackageDeleteObserver(currVirus, 1);  pkgManager.deletePackage(pakName, observer, 0);  

最后,还需要进行系统签名才能使用

对apk进行系统签名:

java -jar signapk.jar platform.x509.pem platform.pk8 test.apk test_signed.apk

将签名之后的文件 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;}

执行卸载命令

execCommand("pm","uninstall", "packageName");

编译生成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. Android实现文件目录的选择并保存到SharedPreferences中(适配6.0
  2. [android]adb remount失败的解决方法
  3. Android自动测试之MonkeyRunner之MonkeyImage
  4. 在android上开启root权限临时解决方法
  5. Android中控制和禁止ScrollView自动滑动到底部的方法
  6. Android实现双模(CDMA/GSM)手机短信监听的方法
  7. NDK/Jni底层获取root权限的四种思路
  8. android rom修改小白有福了
  9. 安卓学习笔记之使用widget桌面小控件及源码分析

随机推荐

  1. Android的Handler机制详解3_Looper.loope
  2. Android四大组件的理解
  3. 【Android(安卓)开发教程】Toast通知
  4. GitHub 优秀的 Android(安卓)开源项目
  5. opengrok setup on ubuntu for android s
  6. Android(安卓)闹钟管理类的使用
  7. Android(安卓)P SystemUI之StatusBar UI
  8. Android学习篇之Menu的使用
  9. Android软键盘适配问题
  10. Android(安卓)Service AIDL