2017-01-20 8 views
1

私はMacを使用して、リモートのAndroidデバイスで実行するいくつかのコマンドを含むJavaプログラムを実行しています。 Windowsマシンでプログラムを実行すると適切な出力が得られますが、同じプログラムをMacマシンで実行すると、出力されません。ここで私はコードスニペットと私が得る出力を共有しています。異なるプラットフォーム上のJavaコードからadbシェルコマンドを実行

コード:

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を使用してください。アンドロイドのアプリケーションにこれらのコマンドを実行するにはどのような方法がある!!

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

を働いた - しかし、あなたはRuntime.getRuntime().exec()を使う、という場合は、あなたの現在の.exec(String command)の代わりに.exec(String[] cmdarray)を使用 – Shohrab

関連する問題