Android からのシェル コマンドの実行: よくある落とし穴の分析
Android 開発では、シェル コマンドの実行が必要になる場合があります。 。ただし、Java アプリケーション内からそのようなコマンドを実行しようとすると、よくある落とし穴が発生する可能性があります。このような落とし穴の 1 つは、root 化されたデバイスでスーパーユーザー権限を付与する「su」コマンドで観察されます。
screenrecord コマンドを使用して画面をキャプチャするシナリオを考えてみましょう。アプリケーション エミュレータ ターミナルを通じてコマンドを実行すると、コマンドは記録を正常に開始します。ただし、Runtime.getRuntime().exec() メソッドを使用して Java から同じコマンドを実行すると、記録の作成に失敗します。
この不一致は、コマンドを「su」プロセスに渡す方法から発生します。エミュレータ ターミナルではコマンドを直接入力できますが、Java では、標準入力を介してコマンドを「su」プロセスへの入力として提供する必要があります。
解決策には、コマンドを「su」プロセスの「su」プロセスにリダイレクトする必要があります。 DataOutputStream を使用した標準入力。修正されたコード スニペットは次のとおりです。
try{ Process su = Runtime.getRuntime().exec("su"); DataOutputStream outputStream = new DataOutputStream(su.getOutputStream()); outputStream.writeBytes("screenrecord --time-limit 10 /sdcard/MyVideo.mp4\n"); outputStream.flush(); outputStream.writeBytes("exit\n"); outputStream.flush(); su.waitFor(); }catch(IOException e){ throw new Exception(e); }catch(InterruptedException e){ throw new Exception(e); }
コマンドを標準入力にリダイレクトすることで、「su」プロセスがコマンドを受け取り、root 権限で昇格し、画面記録が正常に実行されます。この手法により、スーパーユーザー権限が必要な場合でも、Android アプリケーションからシェル コマンドを効果的に実行できるようになります。
以上がJava ターミナルとエミュレータ ターミナルで「su」コマンドの実行が異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。