运行 shell 在 Android 上使用 Runtime.getRuntime 命令
Running shell commands on Android using Runtime.getRuntime
我正在开发一个设备管理应用程序(已由制造商签名)。我正在使用它来安装其他应用程序,使用下面的 adb shell 命令 android 9 :-
cat /sdcard/Download/myfolder/newapp.apk | pm install -S 1528293
我只是这样传递它:-
String command = "cat /sdcard/Download/myfolder/newapp.apk | pm install -S 1528293"
Runtime.getRuntime().exec(command);
但是我收到错误 "cat unknown option S "。
当我从 adb shell 运行 时,相同的命令工作得很好。
不知道我做错了什么,需要一些帮助。
编辑 1:-
我尝试了 运行 如下命令:-
String[] commandInstall = {
"/system/bin/sh",
"-c",
"cat /sdcard/Download/myfolder/newapp.apk | pm install -S 1528293"
};
Process process = Runtime.getRuntime().exec(commandInstall);
但现在我得到错误:-
ava.lang.SecurityException: Reverse mode only supported from shell
at com.android.server.pm.PackageInstallerSession.doWriteInternal(PackageInstallerSession.java:679)
at com.android.server.pm.PackageInstallerSession.write(PackageInstallerSession.java:612)
at android.content.pm.PackageInstaller$Session.write(PackageInstaller.java:852)
at com.android.server.pm.PackageManagerShellCommand.doWriteSplit(PackageManagerShellCommand.java:2447)
at com.android.server.pm.PackageManagerShellCommand.runInstall(PackageManagerShellCommand.java:915)
at com.android.server.pm.PackageManagerShellCommand.onCommand(PackageManagerShellCommand.java:158)
at android.os.ShellCommand.exec(ShellCommand.java:103)
at com.android.server.pm.PackageManagerService.onShellCommand(PackageManagerService.java:21330)
at android.os.Binder.shellCommand(Binder.java:634)
at android.os.Binder.onTransact(Binder.java:532)
at android.content.pm.IPackageManager$Stub.onTransact(IPackageManager.java:2821)
at com.android.server.pm.PackageManagerService.onTransact(PackageManagerService.java:3856)
at android.os.Binder.execTransact(Binder.java:731)
编辑 2:- 在 android 9 之前,我可以执行以下安装应用程序:-
Runtime.getRuntime().exec("pm install -r app.apk");
来自 PackageInstallerSession.java:
switch (Binder.getCallingUid()) {
case android.os.Process.SHELL_UID:
case android.os.Process.ROOT_UID:
case android.os.Process.SYSTEM_UID:
break;
default:
throw new SecurityException(
"Reverse mode only supported from shell or system");
}
如果您的应用在 system/app 下,您可能必须将其放在 system/priv-app 下。希望异常的起源能以某种方式帮助你。
查看PackageInstallerSession的源码发现改成了:-
switch (Binder.getCallingUid()) {
case android.os.Process.SHELL_UID:
case android.os.Process.ROOT_UID:
break;
default:
throw new SecurityException("Reverse mode only supported from shell");
}
Source
因此,即使是系统应用程序,安装的 shell 命令也可能无法正常工作。从提交消息看来,这样做是为了让 PackageInstaller 完成这项工作。
然而似乎这在某些时候又被更改为,但可能不包含在 android 9:-
switch (Binder.getCallingUid()) {
case android.os.Process.SHELL_UID:
case android.os.Process.ROOT_UID:
case android.os.Process.SYSTEM_UID:
break;
default:
throw new SecurityException(
"Reverse mode only supported from shell or system");
}
所以如果应用程序是系统应用程序,那么最好的方法是使用 PackageInstaller。
我正在开发一个设备管理应用程序(已由制造商签名)。我正在使用它来安装其他应用程序,使用下面的 adb shell 命令 android 9 :-
cat /sdcard/Download/myfolder/newapp.apk | pm install -S 1528293
我只是这样传递它:-
String command = "cat /sdcard/Download/myfolder/newapp.apk | pm install -S 1528293"
Runtime.getRuntime().exec(command);
但是我收到错误 "cat unknown option S "。
当我从 adb shell 运行 时,相同的命令工作得很好。 不知道我做错了什么,需要一些帮助。
编辑 1:- 我尝试了 运行 如下命令:-
String[] commandInstall = {
"/system/bin/sh",
"-c",
"cat /sdcard/Download/myfolder/newapp.apk | pm install -S 1528293"
};
Process process = Runtime.getRuntime().exec(commandInstall);
但现在我得到错误:-
ava.lang.SecurityException: Reverse mode only supported from shell
at com.android.server.pm.PackageInstallerSession.doWriteInternal(PackageInstallerSession.java:679)
at com.android.server.pm.PackageInstallerSession.write(PackageInstallerSession.java:612)
at android.content.pm.PackageInstaller$Session.write(PackageInstaller.java:852)
at com.android.server.pm.PackageManagerShellCommand.doWriteSplit(PackageManagerShellCommand.java:2447)
at com.android.server.pm.PackageManagerShellCommand.runInstall(PackageManagerShellCommand.java:915)
at com.android.server.pm.PackageManagerShellCommand.onCommand(PackageManagerShellCommand.java:158)
at android.os.ShellCommand.exec(ShellCommand.java:103)
at com.android.server.pm.PackageManagerService.onShellCommand(PackageManagerService.java:21330)
at android.os.Binder.shellCommand(Binder.java:634)
at android.os.Binder.onTransact(Binder.java:532)
at android.content.pm.IPackageManager$Stub.onTransact(IPackageManager.java:2821)
at com.android.server.pm.PackageManagerService.onTransact(PackageManagerService.java:3856)
at android.os.Binder.execTransact(Binder.java:731)
编辑 2:- 在 android 9 之前,我可以执行以下安装应用程序:-
Runtime.getRuntime().exec("pm install -r app.apk");
来自 PackageInstallerSession.java:
switch (Binder.getCallingUid()) {
case android.os.Process.SHELL_UID:
case android.os.Process.ROOT_UID:
case android.os.Process.SYSTEM_UID:
break;
default:
throw new SecurityException(
"Reverse mode only supported from shell or system");
}
如果您的应用在 system/app 下,您可能必须将其放在 system/priv-app 下。希望异常的起源能以某种方式帮助你。
查看PackageInstallerSession的源码发现改成了:-
switch (Binder.getCallingUid()) {
case android.os.Process.SHELL_UID:
case android.os.Process.ROOT_UID:
break;
default:
throw new SecurityException("Reverse mode only supported from shell");
}
Source 因此,即使是系统应用程序,安装的 shell 命令也可能无法正常工作。从提交消息看来,这样做是为了让 PackageInstaller 完成这项工作。
然而似乎这在某些时候又被更改为,但可能不包含在 android 9:-
switch (Binder.getCallingUid()) {
case android.os.Process.SHELL_UID:
case android.os.Process.ROOT_UID:
case android.os.Process.SYSTEM_UID:
break;
default:
throw new SecurityException(
"Reverse mode only supported from shell or system");
}
所以如果应用程序是系统应用程序,那么最好的方法是使用 PackageInstaller。