ProcessBuilderExceptionCreateProcess error=2, ϵͳÕҲ "μ½ָ¶".
後ろのごちゃごちゃしたコードで、質問の答えをググらなきゃと思い、スクロールしてみると、啓発されました。
最初は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();
関連
-
ADBサーバーがACKしない ソリューション
-
Android プロジェクト コンパイル時に com.android.builder.internal.aapt.v2.Aapt2Exception に遭遇しました。AAPT2 エラー: 詳細はログを確認してください。
-
GPSプロンプトの問題は、Callがユーザーによって拒否される可能性のある許可を必要とすることです:コードは、明示的にsをチェックする必要があります。
-
ERROR: x86 エミュレーションには現在ハードウェアアクセラレーションが必要です。
-
障害発生 [INSTALL_FAILED_OLDER_SDK] 解決方法
-
ライブ画面録画のAndroid実装 (a) ScreenRecorderの簡易解析
-
Android ProgressBarの詳しい解説とカスタマイズ方法
-
Android 高機能版 (xxv) setTextColor() パラメータ設定方法
-
Android Studioのインポートプロジェクトが表示されます。ファイルをクランチするのに失敗しました
-
Android開発日記】SwipeRefreshLayoutにプルアップ読み込み機能を追加しました
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
android:ems="10 "とは何ですか?
-
アンドロイド アルメアビ アルメアビ-v7a
-
SolutionMethod がスーパークラスのメソッドをオーバーライドしない。
-
アプリケーションがメインスレで仕事をしすぎている可能性がある
-
Android マルチメディア MediaPlayerの使用方法詳細
-
Android画像角丸
-
アンドロイドアンダーライン(図形入り
-
Android Studioのヒント - これを読めば、すべてのヒントが役に立つ
-
android studioエミュレータの起動に失敗しました
-
SQLiteReadOnlyDatabaseException: 読み取り専用のデータベースを書き込もうとした (コード 1032)