Установите APK и запустите приложение из сценария Shell
Мое требование:Приложение A будет запускать сценарий оболочки (myshellscript.sh), который уже находится в расположении "system/bin", а сценарий оболочки установит приложение B, которое хранится в расположении "sdcard/Download", и запустит приложение B.
Поэтому, прежде чем продолжить, я хочу сказать вам, что
- мое устройство уже рутировано, так как в нем прошито пользовательское ПЗУ
- Приложение A - это системное приложение с системными привилегиями.
- Мой скрипт работает нормально в соответствии с требованием, когда я запускаю свой скрипт командой:
adb shell sh system/bin/myshellscript.sh
- У меня не так много знаний о сценарии оболочки.
ниже мой сценарий оболочки:
#!/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;
Поэтому проблема заключается в том, что когда я запускаю этот скрипт по команде, упомянутой выше, он работает нормально, но когда тот же скрипт запускается программно по нажатию кнопки приложения 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
1 ответ
При выполнении сценария с помощью оболочки adb он запускается с разрешения оболочки. Shell имеет более высокое разрешение, чем ваше приложение, которое находится в песочнице.