采用获取root方式安装安装包,并通过广播监听安装包的安装卸载。
1.注册广播接收器
/**
* 监听安装包安装卸载的广播接收器
*/
public class UpdateReceiver extends BroadcastReceiver {
public static final String APK_FILE_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "Download" + File.separator + "test.apk";
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_PACKAGE_REPLACED.equals(intent.getAction())) {
Log.i("install", "安装了完成:" + "包名的程序");
Intent intent1 = context.getPackageManager().getLaunchIntentForPackage("com.example.joe");
context.startActivity(intent1);
File file = new File(APK_FILE_PATH);
if (file.exists() && file.isFile()) {
Log.i("install", "删除了文件:" + APK_FILE_PATH);
file.delete();
} else {
Log.i("install", "文件不存在:" + APK_FILE_PATH);
}
}
//接收安装广播
if (Intent.ACTION_PACKAGE_ADDED.equals(intent.getAction())) {
String packageName = intent.getDataString();
Log.e("install", "安装了:" + packageName + "包名的程序");
}
//接收卸载广播
if (Intent.ACTION_PACKAGE_REMOVED.equals(intent.getAction())) {
String packageName = intent.getDataString();
Log.e("install", "卸载了:" + packageName + "包名的程序");
}
}
}
<!--静默更新、自启动-->
<receiver android:name=".UpdateReceiver">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REPLACED" />
<action android:name="android.intent.action.PACKAGE_ADDED" />
<action android:name="android.intent.action.PACKAGE_CHANGED" />
<action android:name="android.intent.action.PACKAGE_REPLACED" />
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<data android:scheme="package" />
</intent-filter>
</receiver>
添加权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.RESTART_PACKAGES" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.BROADCAST_PACKAGE_REPLACED" />
<uses-permission android:name="android.permission.BROADCAST_PACKAGE_REMOVED" />
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.DELETE_PACKAGES" />
<uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" />
<uses-permission android:name="android.permission.CLEAR_APP_CACHE" />
<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />
2.安装工具类
public class RootUtils {
public static final String[] SU_BINARY_DIRS = {
"/system/bin",
"/system/sbin",
"/system/xbin",
"/vendor/bin",
"/sbin"
};
/**
* 检查设备是否root
*
* @return
*/
public static boolean checkRoot() {
boolean isRoot = false;
try {
for (String dir : SU_BINARY_DIRS) {
File su = new File(dir, "su");
if (su.exists()) {
isRoot = true;
break;
}
}
} catch (Exception e) {
}
return isRoot;
}
private static void closeIO(Closeable closeable) {
try {
if (closeable != null) {
closeable.close();
}
} catch (Exception e) {
}
}
/**
* 运行root命令
*
* @return
*/
public static boolean runRootCmd(String cmd) {
boolean grandted;
DataOutputStream outputStream = null;
BufferedReader reader = null;
try {
Process process = Runtime.getRuntime().exec("su");
outputStream = new DataOutputStream(process.getOutputStream());
outputStream.writeBytes(cmd + "\n");
outputStream.writeBytes("exit\n");
outputStream.flush();
process.waitFor();
reader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
grandted = true;
String msg = reader.readLine();
if (msg != null) {
Log.v(RootUtils.class.getSimpleName(), msg);
}
} catch (Exception e) {
e.printStackTrace();
grandted = false;
closeIO(outputStream);
closeIO(reader);
}
return grandted;
}
public static boolean installPkg(String apkPath) {
return runRootCmd("pm install -r " + apkPath);
}
/**
* 为app申请root权限
*
* @param context
* @return
*/
public static boolean grantRoot(Context context) {
return runRootCmd("chmod 777 "+ context.getPackageCodePath());
}
}
private void installApk(File apk) {
if (apk != null & apk.exists()) {
if (RootUtils.checkRoot()) {
RootUtils.installPkg(apk.getAbsolutePath());
}
}
}