在 mac 上用 Runtime.getRuntime().exec() 执行 adb 命令遇到报错
代码如下:
System.out.println(Command.execCmdStr("adb devices"));
执行报错:
我的 android 环境变量是配置在.bash_profile 文件里的,在终端可以正常执行 adb 命令
也想过用 java 执行 which adb 来获取 adb 的路径,然而发现并不能将这个路径打印出来(终端能显示),目前想了个折中的方法,就是直接读取.bash_profile 的 ANDROID_HOME 的值,但我感觉这样子做并不能很好的兼容其他人的 mac。
不知道大家用 mac 写程序,怎么用 java 或其他语言来运行 adb 的??
你自己在 ide 里面运行了吧?
参考
public static synchronized String sendADB(String cmd, int timeout) {
Process process = null;
try {
process = Runtime.getRuntime().exec(cmd);
ADBReader reader = new ADBReader(process.getInputStream());
reader.start();
long start_time = System.currentTimeMillis();
while (true) {
try {
int value = process.exitValue();
break;
} catch (IllegalThreadStateException e1) {
long end_time = System.currentTimeMillis();
if ((end_time - start_time) < timeout) {
Thread.sleep(5000);
} else {
// System.out.println("process destroy");
process.destroy();
break;
}
}
}
String event = reader.getEvent();
// System.out.println(event);
if (!event.trim().equals(""))
return event;
// process.waitFor();
} catch (IOException e) {
System.out.println("Cannot run program");
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "";
}
#1 楼 @lihuazhang 对的,在 ide 中运行 java 的方法,直接运行 adb 就会报错,但将 adb 的整个路径传进去就能正常运行。或者运行比如 ls 之类的也能正常运行
#4 楼 @lihuazhang 我在命令行运行 adb 是直接可以的。又试了将 adb 复制到/usr/bin/就能正常运行了。ide 运行自己写的脚本,就没办法获取.bash_profile 文件的环境变量吗?
#4 楼 @lihuazhang 明白你的意思了,ide 也要取得我配置的环境变量,但我想我的脚本在其他的 mac 上也还好用,就要其他人的 ide 也要配置一下,感觉兼容性不大好
#8 楼 @lihuazhang 好的,多谢啦
是 ide 的问题,打开的时候使用.sh 脚本打开,在 eclipse 根目录下,和 eclipse 图标在一起
用 adb 的全路径。
可以学习一下,Linux 加载配置文件的机制。
如果想要兼容其他人的机器,就需要写一个启动脚本,然后对环境进行检查,然后再通过脚本打开 ide
#!/user/bin
# 伪脚本,按照自己的需要实现代码
check adb
check android_home
open android_studio.app
配置下你的 $PATH 变量即可.
#14 楼 @seveniruby 不行的。 mac 下 ide 的环境变量不通过 shell
楼上已经说的很清楚了,有些 IDE 直接通过应用程序打开是有这个问题 (比如 eclipse)。你可以尝试从终端启动 IDE,如果嫌麻烦可以自己写个 sh 脚本,另外你也可以看看 IDE 里能不能设置单独的环境变量。
#!/bin/sh
open -n /Applications/eclipse/Eclipse.app
我是在用户的 home 目录中,配置.bash_profile 文件,里面写 export 的方式实现的。
目前亲测可用,包括 py 和 Android 的环境变量。
py 代码参考如下。
def ex_cmd(cmd):
fh = os.popen(cmd)
res = list()
for line in fh.readlines():
line = line.strip()
if line != '':
res.append(line)
return res
后面跟帖的人先看清楚问题再回答,然后用 markdown 做代码格式。真是一群烂测试。
@doctorq @lihuazhang 果然终端打开 ide 就可以了,多谢多谢