【问题标题】:Getting exception while running adb commands programmatically以编程方式运行 adb 命令时出现异常
【发布时间】:2017-01-20 12:10:09
【问题描述】:

我正在尝试通过代码获取 adb 设备列表,但在启动 ProcessBuilder 时出现异常。

这是我的代码 -->

try {
                ProcessBuilder pb = new ProcessBuilder("adb.exe", "adb devices");
                pb.directory(new File("C:\\Users\\user\\AppData\\Local\\Android\\sdk\\platform-tools"));

                Process p = pb.start(); // here is the xception
                BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));  
                String line = null;  

                Pattern pattern = Pattern.compile("^([a-zA-Z0-9\\-]+)(\\s+)(device)");
                Matcher matcher;

                while ((line = in.readLine()) != null) {  
                    if (line.matches(pattern.pattern())) {
                        matcher = pattern.matcher(line);
                        if (matcher.find())
                            System.out.println(matcher.group(1));
                    }
                } 

这里是异常堆栈跟踪 -->

java.io.IOException:无法运行程序“adb.exe”(在目录中 “C:\Users\user\AppData\Local\Android\sdk\platform-tools”): CreateProcess error=2, 系统找不到指定的文件 java.lang.ProcessBuilder.start(未知来源)在 MainTest.Example.main(Example.java:45) 引起:java.io.IOException: CreateProcess error=2, 系统找不到指定的文件 java.lang.ProcessImpl.create(Native Method) 在 java.lang.ProcessImpl.(未知来源)在 java.lang.ProcessImpl.start(Unknown Source) ... 2 更多

我在 ProcessBuilder 中更改命令后尝试过,但没有运气。

需要帮助。

【问题讨论】:

    标签: java android adb


    【解决方案1】:

    这应该可以工作

    ProcessBuilder pb = new ProcessBuilder("C:\\Users\\<your user name>\\AppData\\Local\\Android\\sdk\\platform-tools\\adb.exe", "adb devices");
    

    不要忘记: &lt;your user name&gt; - 设置你的名字

    或将C:\Users\&lt;your user name&gt;\AppData\Local\Android\sdk\platform-tools\ 放入windows PATH 变量中。

    【讨论】:

    • 现在我可以看到 adb.exe 已在任务管理器中启动,但似乎 adb devices 命令未执行且流程卡在while ((line = in.readLine()) != null)
    • @vv88,首先将new ProcessBuilder("adb.exe", "adb devices");改成`new ProcessBuilder("adb.exe", "adb","devices");`
    • 我已将其更改为ProcessBuilder pb = new ProcessBuilder("C:\\Users\\vv88\\AppData\\Local\\Android\\sdk\\platform-tools\\adb.exe", "adb", "devices");,但仍停留在同一点。感谢您帮助我。
    • @vv88 简单的pb.waitFor() 有效吗?还是它也动手?
    • 我把p.waitFor()放在pb.start()之后。根据 javadoc waitFor() 方法将一直等待,直到 p 表示的进程未终止。所以现在我被困在`p.waitFor()'。
    【解决方案2】:

    经过 Vyacheslav 在聊天中的大量帮助和建议,这里是社区的有效解决方案 -->

    try 
                {
    
                    ProcessBuilder pb = new ProcessBuilder("C:\\Users\\<Your User Name Here>\\AppData\\Local\\Android\\sdk\\platform-tools\\adb.exe", "devices");
    
                    //pb.redirectErrorStream(true); // can use these 2 line if you want to see output or errors in file.
                    //pb.redirectOutput(new File("C:/pbOutput.Txt"));
    
                    Process p = pb.start();
    
                    while(p == null)
                        Thread.sleep(1000);
    
                    BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
    
                    String line = null;  
    
                    Pattern pattern = Pattern.compile("^([a-zA-Z0-9\\-]+)(\\s+)(device)");
                    Matcher matcher;
    
    
                    while ((line = in.readLine()) != null) {  
                        if (line.matches(pattern.pattern())) {
                            matcher = pattern.matcher(line);
                            if (matcher.find())
                                System.out.println(matcher.group(1));
                        }
                    }  
                } 
                catch (IOException e) 
                {
                    e.printStackTrace();
                }
    

    我只需要找出“adb devices”不起作用的原因。

    【讨论】:

      猜你喜欢
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      • 2021-03-07
      • 1970-01-01
      • 2018-12-15
      • 2011-01-22
      • 2011-05-30
      • 1970-01-01
      相关资源
      最近更新 更多