我正在开发设备管理应用程序(已由制造商签名)。我正在使用它来安装其他应用程序,使用以下用于 android 9 的 adb shell 命令:-
cat /sdcard/Download/myfolder/newapp.apk | pm install -S 1528293
Run Code Online (Sandbox Code Playgroud)
我只是像这样传递它:-
String command = "cat /sdcard/Download/myfolder/newapp.apk | pm install -S 1528293"
Runtime.getRuntime().exec(command);
Run Code Online (Sandbox Code Playgroud)
但我收到错误“猫未知选项 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);
Run Code Online (Sandbox Code Playgroud)
但现在我收到错误:-
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 …Run Code Online (Sandbox Code Playgroud) 没有root用户,我知道可以使用Intent安装一个普通的APK(此处)。
给定root,我知道可以使用this安装它。
这将像正常安装过程一样将应用程序安装为用户应用程序。
还有一种方法来安装拆分式APK应用程序(在此处),尽管由于某种原因我没有成功使用它。
我想知道如何将应用程序转换和/或安装为系统安装的应用程序,然后再转换为用户应用程序。
这包括尚未安装的应用程序和已经安装的应用程序的APK文件。
我发现了一些很旧的方式将现有的应用程序(或安装一个新的)到系统的应用程序(在这里,例如或这里),称(简称),我应该只是移动APK文件转换成/system/app/路径。
事实是,这可能在过去有效,但现在却没有。我认为这是因为现在的应用程序/system/app/以不同的方式存在:每个应用程序都有一个文件夹,其中包含一些文件。
至于转换回用户应用程序,我找不到它。将拆分的APK应用程序安装到系统应用程序并将其转换回用户应用程序也是如此。
实际上,我记得Play商店中有一些应用程序(例如这一类),可以将其他应用程序很好地转换为系统应用程序(使用root)-现在无法执行任何操作。
将应用安装/转换为系统应用的方法何时生效?为什么它不再起作用了?
在旧版和新版Android上,将应用程序安装/转换为系统应用程序,然后再转换回用户应用程序应怎么做?
分离式应用程序(例如:AirBnb应用程序)或至少已安装的应用程序是否可能具有相同的作用?
使用 root,我知道对于单个 APK 文件,我们可以使用“libsu”库(此处)进行安装:
val installResult = Shell.su("pm install -t \"$filePath\"").exec()
Run Code Online (Sandbox Code Playgroud)
如果失败了(在新的 Android 版本上失败了,不确定是哪个版本),如下(在这里写下):
val installResult = Shell.su("cat \"$filePath\" | pm install -t -S ${apkSource.fileSize}").exec()
Run Code Online (Sandbox Code Playgroud)
我还知道,在安装拆分 APK 文件时,事情会变得非常混乱(如此处所示)。首先,您需要使用“pm install-create”命令创建一个会话:
var sessionId: Int? = null
run {
val sessionIdResult =
Shell.su("pm install-create -r -t").exec().out
val sessionIdPattern = Pattern.compile("(\\d+)")
val sessionIdMatcher = sessionIdPattern.matcher(sessionIdResult[0])
sessionIdMatcher.find()
sessionId = Integer.parseInt(sessionIdMatcher.group(1)!!)
Log.d("AppLog", "sessionId:$sessionId")
}
Run Code Online (Sandbox Code Playgroud)
然后你必须“推送”每个 APK 文件,如下所示:
for (apkSource in fileInfoList) {
val filePath = File(apkSource.parentFilePath, apkSource.fileName).absolutePath
Log.d("AppLog", "installing …Run Code Online (Sandbox Code Playgroud) android adb android-install-apk android-app-bundle android-10.0