从 Shell 脚本安装 APK 和启动应用程序 [重复]

Posted

技术标签:

【中文标题】从 Shell 脚本安装 APK 和启动应用程序 [重复]【英文标题】:Install a APK and Launch App from Shell script [duplicate] 【发布时间】:2018-05-20 00:15:49 【问题描述】:

我的要求是: App A 将运行已经在 "system/bin" 位置的 shell 脚本(myshellscript.sh),并且 shell 脚本将安装 App B存储在“sdcard/Download”位置,将启动App B

所以在继续之前我想告诉你

    我的设备已经植根,因为我已经在其中刷入了自定义 ROM App A 是具有系统权限的系统应用。 当我通过命令运行我的脚本时,我的脚本按照要求运行良好:adb shell sh system/bin/myshellscript.sh 我对 shell 脚本了解不多。

下面是我的shell脚本:

#!/bin/bash 
echo "Shell script works on android"
pm install -r "/sdcard/Download/SampleApplication.apk";
echo "Going to sleep for 15 sec"
sleep 15;
echo "woked up after 15 sec"
am start -n "com.aaa.sampleapplication/.MainActivity";
sleep 5;

所以问题是,当我通过上面提到的命令运行此脚本时,它工作正常,但是当在 App A 的按钮单击上以编程方式运行相同的脚本时,除pm install -r "/sdcard/Download/SampleApplication.apk"; 之外,所有用脚本编写的命令都可以正常工作 我试图运行我的脚本的代码是:

            try
            
                Runtime rt = Runtime.getRuntime();

                Process proc = rt.exec("sh /system/bin/myshellscript.sh");
                InputStream is = proc.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
                String line;

                while ((line = br.readLine()) != null) 
                    System.out.println(line);
                
             catch (Throwable t)
            
                t.printStackTrace();
            

更新: 我捕获了 adb 日志并得到以下异常:

AndroidRuntime: Calling main entry com.android.commands.pm.Pm
11-19 00:37:50.867  7887  7887 E Pm      : Error
11-19 00:37:50.867  7887  7887 E Pm      : java.lang.NullPointerException
11-19 00:37:50.867  7887  7887 E Pm      :  at android.os.Parcel.readException(Parcel.java:1690)
11-19 00:37:50.867  7887  7887 E Pm      :  at android.os.Parcel.readException(Parcel.java:1637)
11-19 00:37:50.867  7887  7887 E Pm      :  at android.content.pm.IPackageInstaller$Stub$Proxy.createSession(IPackageInstaller.java:249)
11-19 00:37:50.867  7887  7887 E Pm      :  at com.android.commands.pm.Pm.doCreateSession(Pm.java:552)
11-19 00:37:50.867  7887  7887 E Pm      :  at com.android.commands.pm.Pm.runInstall(Pm.java:392)
11-19 00:37:50.867  7887  7887 E Pm      :  at com.android.commands.pm.Pm.run(Pm.java:142)
11-19 00:37:50.867  7887  7887 E Pm      :  at com.android.commands.pm.Pm.main(Pm.java:99)
11-19 00:37:50.867  7887  7887 E Pm      :  at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
11-19 00:37:50.867  7887  7887 E Pm      :  at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:277)
11-19 00:37:50.869  7887  7887 I art     : System.exit called, status: 1

【问题讨论】:

你能把rt.exec("sh /system/bin/myshellscript.sh");改成用单独的参数调用rt.exec("sh", "/system/bin/myshellscript.sh"); rt.exec() API 不接受两个字符串作为参数。但我想问题不在于运行脚本,因为我的脚本正在运行,正如我在问题中提到的那样,脚本中的所有命令都在运行,除了安装。 【参考方案1】:

通过 adb shell 执行脚本时,它在 shell 权限下运行。 Shell 比您的沙盒应用拥有更高的权限。

【讨论】:

以上是关于从 Shell 脚本安装 APK 和启动应用程序 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

安装apached源码包以及编写shell脚本使其启动更加方便,并且和启动系统服务相同

Android 逆向获取安装在手机中的应用的 APK 包 ( 进入 adb shell | 获取 root 权限 | 进入 /data/app/ 目录 | 拷贝 base.apk 到外置存储 )(代码

Android 逆向获取安装在手机中的应用的 APK 包 ( 进入 adb shell | 获取 root 权限 | 进入 /data/app/ 目录 | 拷贝 base.apk 到外置存储 )(代码

从 ChromeBook 安全 shell 脚本启动网页?

Shell脚本 | 性能测试之启动流量

在ubuntu中如何安装shell 脚本程序