最近项目有自动更新的需求,因为是无人值守的项目,所以需要静默更新并且更新完成后打开app,网上搜了一通,大概有两个方案。设备是root过的。
1、shell安装,广播开启
通过shell命令安装app,然后注册广播接收app安装成功的广播,然后打开app。
测试发现,完全行不通,网上一群人,抄来抄去,自己根本没测试过。问题是,安装新app之后,旧的app已经被卸载了,根本接收不到广播并且执行打开的代码。而且,通过shell安装在很多设备上是不会发送安装成功的广播的。
2、shell安装,shell启动
这个方法方向是对的,具体方式是:
pm install -r " + apkPath
安装,然后:
sleep 60; am start -n 包名 / 包名+activity名
启动程序,sleep 60;是等待60秒之后执行安装命令。
这个方法思路很好,但是还是存在问题,可以安装成功,但是无法打开,在控制台执行也有无法打开app
正确做法
shell可以连续执行多条命令,具体如下
1. command1; command2;command3
表示顺序执行command1,command2,command3而不管命令是否成功执行了。
2. command1 && command2 && command3
也表示顺序执行,但是与第一种写法的不同之处在于必须前面的成功执行后才会执行下一个命令,前一个失败了,则不会继续执行。
3.command1 || command2 || command3
这种写法各个命令之间是逻辑或的关系,表示如果command1成功执行了,那么就不再执行后面的命令了;而如果command1执行失败了则会执行command2,依次类推。
现在思路清晰了,我们安装命令和开启命令通过&&来连接
上代码,亲测可用:
public static void install(String apkPath){
String cmd1= "am start -n 包名/包名+activity名";
String cmd2 = "pm install -r " + apkPath + " && ";
String cmd = cmd2 + cmd1;
//Runtime对象
Runtime runtime = Runtime.getRuntime();
try {
Process localProcess = runtime.exec("su");
OutputStream localOutputStream = localProcess.getOutputStream();
DataOutputStream localDataOutputStream = new DataOutputStream(localOutputStream);
localDataOutputStream.writeBytes(cmd);
localDataOutputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
希望可以帮你不在被那些垃圾抄来抄去的文章毒害。
如果对你有用,给我点个赞吧。
网友评论