1. ホーム
  2. Android

ProcessBuilderExceptionCreateProcess error=2, ϵͳÕҲ "μ½ָ¶".

2022-02-11 12:54:33

後ろのごちゃごちゃしたコードで、質問の答えをググらなきゃと思い、スクロールしてみると、啓発されました。

最初はAPK情報の取得方法をいじっていたのですが、ProcessBuilderクラスの存在を知り、まさにこのクラスがAPK情報を取得する方法を知り、このクラスの分析記事を別途書きました。

public class TestProcess {
	public static void main(String[] args) {
		ProcessBuilder pb = new ProcessBuilder();
		pb.redirectErrorStream(true);
		try {
			Process p = pb.command("C:/getapkinfo/aapt.exe d badging D:/new/test.apk").start();
			BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream(),"UTF-8"));
			String s = "";
			while((s = br.readLine())! = null){
				System.out.println(s);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}



このコードを実行すると、次のように報告されます。
 java.io.IOException。プログラム "C:/getapkinfo/aapt.exe d" を実行できません。CreateProcess error=2, ϵͳÕҲ "µ½ָ¶ (CreateProcess エラー)。

エラーのことです。

しかし、Dos窓で直接実行可能です。

というコードに変更します。

Process p = pb.command("ipconfig").start();



正常に実行されます。後者の検索で見つけた回答の束は、全てパスの問題に関するものでした。いや、全部間違った解答なんですけどね。

ProcessBuiderのAPIは、以下のように記述します。 command は有効なオペレーティング・システム・コマンドに対応するため、システム・コマンドでない場合はプロンプトが表示されません。

そこで、Web上の回答やソースコードに触発され、コードを次のように変更してみました。

Process p = pb.command("C:/getapkinfo/aapt.exe d","badging","D:/new/test.apk").start();



はい、これはちゃんと実行されます。

なぜ?

命令と命令の間にスペースがあり、別の文字列で区切られていない場合、認識されないようです。

Process p = pb.command("C:/getapkinfo/aapt.exe"," " ","d","badging","D:/new/test.apk") .start();

これは正常に実行されますが、結果はDosウィンドウでC:/getapkinfo/aapt.exeとタイプしたのと同じです。

すると、もともとipconfig /allでipアドレスの詳細が出力できるようになっていました。

しかし、それは変更された。

Process p = pb.command("ipconfig //all").start();



また、同じエラーが報告され、この時点ではエラーの場所が分かっています。

スペースが含まれるディレクティブは、別の文字列で区切る必要があります。

メソッドのAPIを読み直した結果。

public ProcessBuilder command(String... command)

command - プログラムとその引数を含む文字列配列

このように、コマンドと引数を別々の文字列配列に配置することで、以下のように正しく実行されるようになっています。

Process p = pb.command("C:/getapkinfo/aapt.exe"," " ","d","badging","D:/new/test.apk") .start();