近期开发上线一个常驻app,项目已上线,今天随笔记录一下静默安装相关内容。我分三篇静默安装(root版)、静默安装(无障碍版)、监听系统更新、卸载、安装。
先说说我的项目需求:要求app一直运行,通过指令进行自动安装并在安装成功后自动开启。行业人事都了解,非root权限不可能无声无息的完成此要求。我分两步完成了此功能开发。今天记录一下root权限下实现静默安装app。
本文使用RunTime执行pm install安装指定文件。
一、获取权限
```java
public class SilentInstall {
/**
* root权限下,静默安装apk
* @param apkPath 目标文件
* @return true 安装成功; false 安装失败
*/
public boolean install(String apkPath) {
boolean result =false;
DataOutputStream dataOutputStream =null;
BufferedReader errorStream =null;
try{
// 申请su权限
Process process = Runtime.getRuntime().exec("su");
dataOutputStream =new DataOutputStream(process.getOutputStream());
// 执行pm install命令
String command ="pm install -r "+ apkPath +"\n";
dataOutputStream.write(command.getBytes(Charset.forName("utf-8")));
dataOutputStream.flush();
dataOutputStream.writeBytes("exit\n");
dataOutputStream.flush();
process.waitFor();
errorStream =new BufferedReader(new InputStreamReader(process.getErrorStream()));
String msg ="";
String line;
// 读取命令的执行结果
while((line = errorStream.readLine()) !=null) {
msg += line;
}
// 如果执行结果中包含Failure字样就认为是安装失败,否则就认为安装成功
if(!msg.contains("Failure")) {
result =true;
}
}catch(Exception e) {
Log.e("install",e.getMessage(),e);
}finally{
try{
if(dataOutputStream !=null) {
dataOutputStream.close();
}
if(errorStream !=null) {
errorStream.close();
}
}catch(IOException e) {
Log.e("install",e.getMessage(),e);
}
}
return result;
}
}
调用
if (!new SilentInstall().install(absolutePath)) {
// 调用系统安装方法
Intent install = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.fromFile(new File(apkPath));
install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
install.setDataAndType(uri,
"application/vnd.android.package-archive");
context.startActivity(install);
}
有root权限时,使用静默安装。没有权限时使用系统安装方法。
但是使用系统安装方法,明显时不符合项目需要的。所以我使用无障碍服务,辅助系统安装方法完成无操作安装。
下篇使用静默安装成功后应用自启动。欢迎各位同学指导……