要实现静默卸载,首先你要有root权限,能把你的静默卸载程序移动到system/app目录下。用RE浏览器将你的应用一般在/data/app目录下)移动到/system/app目录下,如果你的程序有.so文件,那么请将相应的.so文件从/data/data/程序包名/lib目录下移动到/system/lib目录下。重启你的手机,你就会发现你的应用已经是系统级应用了,不能被卸载,也就是说你的应用现在已经八门全开,活力无限了。
android在root权限下实现apk的静默卸载,静默安装,重启
1.静默卸载实现:
/**
* 静默卸载app
*
* @param context
* @param packageName app的包名
* @throws IOException
* @throws InterruptedException
*/
public static void uninstallApp(Context context, String packageName) throws IOException, InterruptedException {
List<PackageInfo> packageInfos = context.getPackageManager().getInstalledPackages(PackageManager.GET_ACTIVITIES);
for (PackageInfo packageInfo1 : packageInfos) {
if (packageName.equals(packageInfo1.packageName)) {
String suPath = "/system/xbin/su";
File file = new File(suPath);
if (!file.exists()) {
suPath = "/system/bin/su";
}
Process process = Runtime.getRuntime().exec(suPath);
String cmd = "pm uninstall " + packageName + "\n" + "exit\n";
process.getOutputStream().write(cmd.getBytes());
process.waitFor();
break;
}
}
}
2.静默安装实现:
/**
* 静默安装app
*
* @param filePath
* @throws IOException
* @throws InterruptedException
*/
public static void installApp(String filePath) throws IOException, InterruptedException {
String suPath = "/system/xbin/su";
File file = new File(suPath);
if (!file.exists()) {
suPath = "/system/bin/su";
}
Process process = Runtime.getRuntime().exec(suPath);
String cmd = "pm install -r " + filePath + "\n" + "exit\n";
process.getOutputStream().write(cmd.getBytes());
process.waitFor();
}
最后加上重启命令:
/**
* 重启系统
*
* @return
*/
public static boolean reboot() {
try {
String suPath = "/system/xbin/su";
File file = new File(suPath);
if (!file.exists()) {
suPath = "/system/bin/su";
}
Process process = Runtime.getRuntime().exec(suPath);
String cmd = "reboot\nexit\n";
process.getOutputStream().write(cmd.getBytes());
return true;
} catch (IOException error) {
return false;
}
}
注意卸载和安装需要在子线程中执行;如果单纯关机则用“reboot -p”命令。
Android静默安装与静默卸载(系统应用)
一.轰隆一声雳响,我闪亮登场。
本篇基于已有系统证书(从Android设备厂家获得)的情况下实现静默安装与静默卸载,可分为三部分讲解:将apk内置为系统应用,apk静默安装与apk静默卸载。
1.将apk内置为系统应用。内置的方法有共性,也有区别。基础操作是共性,区别就在于Android4.4以上版本与Android4.4以下版本。
2.apk静默安装。
3.apk静默卸载。
二.若您觉得本文对您有帮助,记得点个关注哟~
android如何实现静默安装哦
原理
静默安装、卸载的原理就是利用pm install命令来安装apk,pm uninstall 来卸载apk.
智能安装是利用android系统提供的无障碍服务AccessibilityService,来模拟用户点击,从而自动安装.
//静默安装private void installSlient() {
String cmd = "pm install -r /mnt/sdcard/test.apk";
Process process = null;
DataOutputStream os = null;
BufferedReader successResult = null;
BufferedReader errorResult = null;
StringBuilder successMsg = null;
StringBuilder errorMsg = null;
try {
//静默安装需要root权限
process = Runtime.getRuntime().exec("su");
os = new DataOutputStream(process.getOutputStream());
os.write(cmd.getBytes());
os.writeBytes("\n");
os.writeBytes("exit\n");
os.flush();
//执行命令
process.waitFor();
//获取返回结果
successMsg = new StringBuilder();
errorMsg = new StringBuilder();
successResult = new BufferedReader(new InputStreamReader(process.getInputStream()));
errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String s;
while ((s = successResult.readLine()) != null) {
successMsg.append(s);
}
while ((s = errorResult.readLine()) != null) {
errorMsg.append(s);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (os != null) {
os.close();
}
if (process != null) {
process.destroy();
}
if (successResult != null) {
successResult.close();
}
if (errorResult != null) {
errorResult.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
//显示结果
tvTest.setText("成功消息:" + successMsg.toString() + "\n" + "错误消息: " + errorMsg.toString());
}
android N 内置可卸载app
方法一
直接使用Intent卸载
Uri uri = Uri.fromParts("package", "com.example.demo", null);
Intent intent = new Intent(Intent.ACTION_DELETE, uri);
startActivity(intent);123
这是最简单的方式,调用卸载方法系统会弹出卸载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();
}
} 123456789101112131415161718192021
获取PackageManager 对象,调用deletePackage方法
PackageManager pkgManager = mContext.getPackageManager();
PackageDeleteObserver observer = new PackageDeleteObserver(currVirus, 1);
pkgManager.deletePackage(pakName, observer, 0); 123
最后,还需要进行系统签名才能使用
对apk进行系统签名:
java -jar signapk.jar platform.x509.pem platform.pk8 test.apk test_signed.apk1
将签名之后的文件 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;
}123456789101112131415161718192021222324252627282930
执行卸载命令
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" >