2017-01-20 3 views
1

Я использую Mac для запуска программы Java, которая содержит некоторые команды для выполнения на удаленном устройстве Android. Когда я запускаю свою программу на компьютере с Windows, она дает правильный вывод, но когда я запускаю ту же программу на компьютере Mac, это не так. Здесь я использую фрагмент кода и вывод, который я получаю.Запуск команд оболочки adb из кода Java на разных платформах

Код:

private static final String DUMPSYSCOMMAND = "adb -s ? shell \"dumpsys package com.PACKAGENAME.service | grep versionName\""; 

    String versionString = runADBCommand(DUMPSYSCOMMAND.replace("?", 
     deviceIP)); 
    System.out.println("Version String Result " + versionString); 

    String versionName = null; 
    if (versionString != null && !versionString.isEmpty()) { 
     versionString = versionString.replace("\\s+", ""); 
     versionName = versionString.replace(".", "-") 
      .substring(versionString.indexOf("=") + 1) 
      .replaceAll("\\s+", ""); 
     System.out.println("Version String " + versionName); 

    } 

public String runADBCommand(String adbCommand) throws IOException { 
     System.out.println("Running given command= " + adbCommand + "$$$"); 
     StringBuffer returnValue = new StringBuffer(); 
     String line; 
     InputStream inStream = null; 
     try { 
      System.out.println("adbCommand = " + adbCommand); 
      Process process = Runtime.getRuntime().exec(adbCommand); 

      // process.waitFor();/ 
      inStream = process.getInputStream(); 
      BufferedReader brCleanUp = new BufferedReader(
        new InputStreamReader(inStream)); 
      while ((line = brCleanUp.readLine()) != null) { 
       if (!line.equals("")) { 
        System.out.println("After exec"); 
        System.out.println("Line=" + line); 

       } 

       // returnValue = returnValue + line + "\n"; 
       returnValue.append(line).append("\n"); 
      } 

      brCleanUp.close(); 
      try { 


       process.waitFor(); 

      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
      System.out.println("Error: " + e.getMessage()); 
     } 
     System.out.println(returnValue.toString() + "@@"); 
     return returnValue.toString(); 
    } 

Выход:

@@Running given command= adb -s DEVICEIP shell "dumpsys package PACKAGENAME | grep versionName"$$$ 
adbCommand = adb -s DEVICEIP shell "dumpsys package PACKAGENAME | grep versionName" 
After exec 
Line=/system/bin/sh: dumpsys package PACKAGENAME | grep versionName: not found 
/system/bin/sh: dumpsys package PACKAGENAME | grep versionName: not found 
@@Version String Result /system/bin/sh: dumpsys package PACKAGENAME | grep versionName: not found 
Version String /system/bin/sh:dumpsyspackagecom-PACKAGENAME|grepversionName:notfound 

Когда я запускаю ту же команду оболочки из командной строки, он дает мне ожидаемый выход на Mac, а также.

ответ

1

Лучше использовать ProcessBuilder. Но если вы настаиваете на использовании Runtime.getRuntime().exec() - использовать .exec(String[] cmdarray) вместо текущих .exec(String command):

private static final String DUMPSYSCOMMAND = "dumpsys package com.PACKAGENAME.service | grep versionName"; 

String versionString = runADBCommand({"adb", "-s", deviceIP, "shell", DUMPSYSCOMMAND}); 

... 

public String runADBCommand(String[] adbCommand) throws IOException { 

... 

// do not forget to remove/modify this println - it expect a string 
//  System.out.println("adbCommand = " + adbCommand); 
+0

Спасибо большое !! Пытались с помощью процесса строитель, и она работала :) –

+0

есть ли способ запустить эти команды в приложение для Android – Shohrab