美文网首页
Android ROOT下静默安装并打开APP

Android ROOT下静默安装并打开APP

作者: 一位不愿透露自己姓氏的先生 | 来源:发表于2020-08-26 18:20 被阅读0次

    最近项目有自动更新的需求,因为是无人值守的项目,所以需要静默更新并且更新完成后打开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();
            }
    
        }              
    

    希望可以帮你不在被那些垃圾抄来抄去的文章毒害。

    如果对你有用,给我点个赞吧。

    相关文章

      网友评论

          本文标题:Android ROOT下静默安装并打开APP

          本文链接:https://www.haomeiwen.com/subject/vijfsktx.html