灌水 在 mac 里怎么用 java 运行 adb

未来来 · November 14, 2015 · Last by 未来来 replied at November 27, 2015 · 2102 hits

在 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 的??

共收到 19 条回复 时间 点赞

你自己在 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 之类的也能正常运行

#3 楼 @75281920 对啊 就是这样啊。因为你的环境变量 ide 并不知道啊

#2 楼 @monkey 头像很不错啊。现在遇到的问题就是在 java 程序直接运行 adb 命令会报错,但将 adb 的路径一起传进去运行就正常,类似 appium 的:info: [debug] Using adb from /Users/tangbincheng/adt-bundle-mac-x86_64-20131030/sdk/platform-tools/adb,所以想兼容其他 mac,不知道怎么很好的处理

#4 楼 @lihuazhang 我在命令行运行 adb 是直接可以的。又试了将 adb 复制到/usr/bin/就能正常运行了。ide 运行自己写的脚本,就没办法获取.bash_profile 文件的环境变量吗?

#4 楼 @lihuazhang 明白你的意思了,ide 也要取得我配置的环境变量,但我想我的脚本在其他的 mac 上也还好用,就要其他人的 ide 也要配置一下,感觉兼容性不大好

#7 楼 @75281920 建议你看下 mac 下的环境变量配置。本来就是这样的,没有什么兼容性的问题。

#8 楼 @lihuazhang 好的,多谢啦

是 ide 的问题,打开的时候使用.sh 脚本打开,在 eclipse 根目录下,和 eclipse 图标在一起

#10 楼 @doctorq 其实要养成从终端打开 ide 的习惯。比如

用 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
18Floor has deleted

后面跟帖的人先看清楚问题再回答,然后用 markdown 做代码格式。真是一群烂测试。

@doctorq @lihuazhang 果然终端打开 ide 就可以了,多谢多谢

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up