首先,必须得是Rk3399的系统应用,即有系统权限,并有系统签名
android:sharedUserId="android.uid.system"
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name= "android.permission.RESTART_PACKAGES" />
//app的gradle里系统签名
signingConfigs {
debug {
storeFile file('xxxx.jks')
storePassword 'xxxxx'
keyAlias 'xxxxxx'
keyPassword 'xxxxxx'
}
}
下面,就是重点安装和自动打开的功能,主要是命令安装和打开
// 赋予权限
public boolean givePermission(String path) {
Log.e("sx", "赋予权限 " + path);
String[] commands = {"su", "0", "chmod", "777", path};
return execCommand(commands);
}
//静默安装并自动打开
public void silentInstall(String apkPath) {
givePermission(apkPath);
install(apkPath);
}
//命令执行
private static boolean execCommand(String[] commands) {
ProcessBuilder processBuilder = new ProcessBuilder(commands);
Process process = null;
BufferedReader successResult = null;
BufferedReader errorResult = null;
StringBuilder successMsg = new StringBuilder();
StringBuilder errorMsg = new StringBuilder();
boolean result = false;
try {
process = processBuilder.start();
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) {
Log.e("log", "命令异常,"+e.toString());
} finally {
try {
if (successResult != null) {
successResult.close();
}
if (errorResult != null) {
errorResult.close();
}
} catch (IOException e) {
Log.e("log", "IOException异常,"+e.toString());
}
if (process != null) {
process.destroy();
}
}
Log.e("log", "命令执行结果 = " + "\nsuccessMsg:" + successMsg + "\nErrorMsg:" + errorMsg);
String success = successMsg.toString();
String error = errorMsg.toString();
//如果执行结果中,包含Success/success,或者无错误信息返回,则认为执行成功
if (success.contains("Success") || success.contains("success") || TextUtils.isEmpty(error)) {
result = true;
}
return result;
}
public static void install(String apkPath){
//cmd2 是执行安装apk, cmd1是安装后自动打开app
//String cmd1= "am start -s 包名/"+ 启动Activity.class.getCanonicalName()+ " \n";//可能不行
String cmd1= "am start -n 包名/"+"包名.启动的Activity"+" \n";
String cmd2 = "pm install -r " + apkPath + " && ";
String cmd = cmd2 + cmd1;
Runtime runtime = Runtime.getRuntime();
try {
Process localProcess = runtime.exec("su");
OutputStream localOutputStream = localProcess.getOutputStream();
DataOutputStream localDataOutputStream = new DataOutputStream(localOutputStream);
localDataOutputStream.writeBytes(cmd);
localDataOutputStream.flush();
Log.e("log", "安装成功了");
} catch (IOException e) {
Log.e("log", "安装失败,"+e.toString());
}
}
最后,android的gradle编译和目标版本是
compileSdkVersion 29
buildToolsVersion "29.0.3"
minSdkVersion 22
targetSdkVersion 29
最后的最后,希望大家都能尝试成功,主要还是要有系统权限