web-dev-qa-db-ja.com

Androidアプリケーションからシェルスクリプトを実行することは可能ですか?

私は、Termux、Androidターミナルエミュレータです。

これは、ルートアクセスを必要とせずにAndroidオペレーティングシステムへのアクセスを許可する優れたアプリケーションです。

私が達成したいのは、同じデバイスにインストールされた別のAndroidアプリケーション内から、Termux内でスクリプト/コマンドを実行することです。

私は、Termuxがインテント経由でTaskerタスクを実行することを許可していたと信じていますが、現在はそうではありません。

別のAndroidアプリケーションからTermux(または他のそのようなアプリ)を介して一連のコマンドのスクリプトを実行することは可能ですか?.

または...

基になるAndroidオペレーティングシステムにアクセスし、Androidアプリ内からスクリプトを実行することはできますか?

更新

私のAndroidアプリケーションからこのコードを実行すると

    try {
        ProcessBuilder pb = new ProcessBuilder("pkg", "install -y", "ffmpeg python");
        final Process p = pb.start();
        BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line;
        while ((line = br.readLine()) != null) {
            Log.d(TAG, "onCreate(2): " + line);
        }
    } catch (Exception ex) {
        Log.e(TAG, "onCreate: ", ex);
    }

このエラーメッセージが表示される

Java.io.IOException: Cannot run program "pkg": error=13, Permission denied
        at Java.lang.ProcessBuilder.start(ProcessBuilder.Java:1050)
        at org.home.assignment.Shell.MainActivity.commandThree(MainActivity.Java:32)
        at org.home.assignment.Shell.MainActivity.onCreate(MainActivity.Java:21)
        at Android.app.Activity.performCreate(Activity.Java:7802)
        at Android.app.Activity.performCreate(Activity.Java:7791)
        at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1299)
        at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:3243)
        at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:3407)
        at Android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.Java:83)
        at Android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.Java:135)
        at Android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.Java:95)
        at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:2016)
        at Android.os.Handler.dispatchMessage(Handler.Java:107)
        at Android.os.Looper.loop(Looper.Java:214)
        at Android.app.ActivityThread.main(ActivityThread.Java:7343)
        at Java.lang.reflect.Method.invoke(Native Method)
        at com.Android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.Java:492)
        at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:933)
     Caused by: Java.io.IOException: error=13, Permission denied
        at Java.lang.UNIXProcess.forkAndExec(Native Method)
        at Java.lang.UNIXProcess.<init>(UNIXProcess.Java:133)
        at Java.lang.ProcessImpl.start(ProcessImpl.Java:141)
        at Java.lang.ProcessBuilder.start(ProcessBuilder.Java:1029)
        at org.home.assignment.Shell.MainActivity.commandThree(MainActivity.Java:32) 
        at org.home.assignment.Shell.MainActivity.onCreate(MainActivity.Java:21) 
        at Android.app.Activity.performCreate(Activity.Java:7802) 
        at Android.app.Activity.performCreate(Activity.Java:7791) 
        at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1299) 
        at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:3243) 
        at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:3407) 
        at Android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.Java:83) 
        at Android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.Java:135) 
        at Android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.Java:95) 
        at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:2016) 
        at Android.os.Handler.dispatchMessage(Handler.Java:107) 
        at Android.os.Looper.loop(Looper.Java:214) 
        at Android.app.ActivityThread.main(ActivityThread.Java:7343) 
        at Java.lang.reflect.Method.invoke(Native Method) 
        at com.Android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.Java:492) 
        at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:933) 

しかしながら com.termuxは、このようなコマンドを実行できます。アプリケーションでこれらのコマンドを実行する権限を取得するにはどうすればよいですか?

8
Hector

私が試した限りでは、それはうまくいきます。シェルコマンドを発行することで、多くのLinux GUIアプリが作業の一部を実行するためです。

念のため、私はVanillaコマンドの出力をLogcatに発行し、ルート化されていない古いローエンドのAndroid 6.0の電話)で動作させました(以下の作業コード)。

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        String[] cmd = new String[]{"ls", "-la", "/"};

        try {
            // These two lines are what we care about
            Process process = Runtime.getRuntime().exec(cmd);
            InputStream iStream = process.getInputStream();

            // This is how we check whether it works
            tryWriteProcessOutput(iStream);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    private void tryWriteProcessOutput(InputStream iStream) throws IOException {
            BufferedReader reader = new BufferedReader(new InputStreamReader(iStream));

            String output = "";
            String line;

            try {
                while ((line = reader.readLine()) != null) {
                    output += line + "\n";
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                reader.close();
            }

        Log.d("cmdOutput", output);
    }
}

ただし、走行距離はここでは大きく異なる場合があります。 Android製造元が多ければ、デバイスごとにコマンドシェルのバージョンが異なることを期待しているため、すべてのAndroidデバイスがそれが本当に一般的なものでない限り、私が投げたコマンドを実行するだけです。

さらに、コマンドシェルではなくコマンド自体(つまり、busybox: Permission denied)。

Termuxはターミナルエミュレータですが、Android OSのすべてにアクセスすることはできません。最終的にはそのアプリであり、Androidの他のアプリと同様に制限に直面します。APTpkgおよびその他のパッケージインストーラーまたはパッケージはエミュレーター内にインストールされますが、システム全体としてはインストールされません。また、特定のコマンドには、ケースと同様の制限があります。たとえば、pmはrootまたはadb Shellは、他のアプリでは許可されていないユーザーIDでそのようなアクションを実行できるためです。つまり、pm install -r -t someapp.apkコマンドを実行すると、adb Shellを使用するか、root権限を持つ場合は確実に機能しますが、Termuxでエラーが発生します。

さらに明確にするために、Termuxでコマンドecho $PATHを実行すると、Termuxコマンドのみが含まれ、Android OSコマンドではないが、Android OS。これは、上で物事を実行するのに最適な方法ですAndroidサンドボックス環境のように、多くの制限に対処する必要がありません。特定のパッケージのインストールサンドボックスから出る必要がある場合は問題が発生するので注意してください。

2
ahasbini