最近項(xiàng)目有自動(dòng)更新的需求仗阅,因?yàn)槭菬o人值守的項(xiàng)目,所以需要靜默更新并且更新完成后打開app国夜,網(wǎng)上搜了一通减噪,大概有兩個(gè)方案。設(shè)備是root過的。
1筹裕、shell安裝醋闭,廣播開啟
通過shell命令安裝app,然后注冊(cè)廣播接收app安裝成功的廣播朝卒,然后打開app目尖。
測(cè)試發(fā)現(xiàn),完全行不通扎运,網(wǎng)上一群人,抄來抄去饮戳,自己根本沒測(cè)試過豪治。問題是,安裝新app之后扯罐,舊的app已經(jīng)被卸載了负拟,根本接收不到廣播并且執(zhí)行打開的代碼。而且歹河,通過shell安裝在很多設(shè)備上是不會(huì)發(fā)送安裝成功的廣播的掩浙。
2、shell安裝秸歧,shell啟動(dòng)
這個(gè)方法方向是對(duì)的厨姚,具體方式是:
pm install -r " + apkPath
安裝,然后:
sleep 60; am start -n 包名 / 包名+activity名
啟動(dòng)程序键菱,sleep 60谬墙;是等待60秒之后執(zhí)行安裝命令。
這個(gè)方法思路很好经备,但是還是存在問題拭抬,可以安裝成功,但是無法打開侵蒙,在控制臺(tái)執(zhí)行也有無法打開app
正確做法
shell可以連續(xù)執(zhí)行多條命令造虎,具體如下
1. command1; command2;command3
表示順序執(zhí)行command1,command2纷闺,command3而不管命令是否成功執(zhí)行了算凿。
2. command1 && command2 && command3
也表示順序執(zhí)行,但是與第一種寫法的不同之處在于必須前面的成功執(zhí)行后才會(huì)執(zhí)行下一個(gè)命令急但,前一個(gè)失敗了澎媒,則不會(huì)繼續(xù)執(zhí)行。
3.command1 || command2 || command3
這種寫法各個(gè)命令之間是邏輯或的關(guān)系波桩,表示如果command1成功執(zhí)行了戒努,那么就不再執(zhí)行后面的命令了湃鹊;而如果command1執(zhí)行失敗了則會(huì)執(zhí)行command2,依次類推权均。
現(xiàn)在思路清晰了驯镊,我們安裝命令和開啟命令通過&&來連接
上代碼,親測(cè)可用:
public static void install(String apkPath){
String cmd1= "am start -n 包名/包名+activity名";
String cmd2 = "pm install -r " + apkPath + " && ";
String cmd = cmd2 + cmd1;
//Runtime對(duì)象
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();
}
}
希望可以幫你不在被那些垃圾抄來抄去的文章毒害撒穷。
如果對(duì)你有用匣椰,給我點(diǎn)個(gè)贊吧。