【发布时间】:2013-12-14 19:18:33
【问题描述】:
我正在尝试用 Java 制作一个简单的应用程序,以便在通过 USB 连接的 android 设备上安装 APK。手动使用 ABD 然后一切正常,但我想在我的应用程序中提供一个简单的单击安装选项,但由于某种原因代码无法正常工作:
try {
abdsourcesync = apkpath;
progress.setString("sync in progress");
System.out.println("Starting Sync via adb with command " + "adb"
+ " install -r " + apkpath);
Process process = Runtime.getRuntime().exec(
"adb" + " install -r " + apkpath);
InputStreamReader reader = new InputStreamReader(
process.getInputStream());
Scanner scanner = new Scanner(reader);
scanner.close();
int exitCode = process.waitFor();
System.out.println("Process returned: " + exitCode);
进程退出,状态为 141,但我看不到其他错误,但是当我在平板电脑上查看时,.APK 尚未安装。我已检查以确保设备上有已植根并支持第三方应用程序等的空间,所以我确定问题出在我的 java 而不是 android 设备上(正如我所说,如果我自己运行 ADB install -r从终端然后一切正常)。
我搜索了 stackoverflow,但只找到了从 Android 应用程序中安装 APK 的线程,而不是从桌面 Java 应用程序。
感谢您的帮助;
编辑:使用 ProcessBuilder 管理 adb 调用的新代码现在看起来像这样:
try {
abdsourcesync = apkpath;
progress.setString("sync in progress");
System.out.println("Starting Sync via adb with command " + "adb"
+ " install -r " + apkpath);
ProcessBuilder apksync = new ProcessBuilder("adb", " install -r ", apkpath);
apksync = apksync.redirectErrorStream(true);
/* Process process = Runtime.getRuntime().exec(
"adb" + " install -r " + apkpath);*/
Process process = apksync.start();
InputStreamReader reader = new InputStreamReader(
process.getInputStream());
Scanner scanner = new Scanner(reader);
scanner.close();
int exitCode = process.waitFor();
System.out.println("Process returned: " + exitCode);
apk 同步直接失败,状态 1 返回到控制台。
如果我手动指定 apk 位置
ProcessBuilder apksync = new ProcessBuilder("adb","install","/home/geeky/Desktop/1.apk");
然后我得到与原始代码相同的错误,该过程返回状态 141,并且在一段时间后同步过程完成,但 .apk 在表上不可用。如果我尝试使用比我的 700mb 应用程序小得多的 APK,我也会得到相同的结果(因为在 500kb 的 .apk 中会得到相同的结果)。
EDIT3:我还尝试更改命令以推送 apk,它可以正常工作,apk 将毫无问题地推送到 /mnt/sdcard/test/1.apk。
安迪
【问题讨论】:
-
有人能就这个问题提供一些帮助吗?