我正在尝试用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安装-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。
安迪
答案 0 :(得分:1)
我想这是因为你的java应用程序无法解析adb二进制文件。尝试在环境变量中添加adb二进制文件,以便可以从任何地方访问它。
试试这个:
ProcessBuilder pb = new ProcessBuilder("cmd","arg1");
pb = pb.redirectErrorStream(true);
Process proc = pb.start();
InputStream is = proc.getInputStream();