(轉)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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM