1

さて、私はAndroidプログラミングに非常に慣れていません。特定のファイルをボタンで/ system/frameworkにプッシュするルートアプリを作成しています

どうすればこれを達成できますか? コマンドスタイルを試しましたが、どれも機能していません

4

1 に答える 1

1

これを行うには、いくつかの手順を実行する必要があります。

まず(もちろん)デバイスをルート化する必要があります。これは、さまざまな方法で確認できます。

次のコードは、「su」コマンドがコマンドが見つからないというエラーを返すかどうか (su バイナリが存在するかどうか)、および要求後にアクセス許可を付与するためにスーパー ユーザー アプリがインストールされているかどうかを確認します。

 private boolean isDeviceRooted() {

            // check for SU command in shell
            if ((new ExecShell().executeCommand(ExecShell.SHELL_COMMAND.su_check) != null) && (appInstalled("eu.chainfire.supersu.nonag") || appInstalled("eu.chainfire.supersu") || appInstalled("com.noshufou.android.su") || appInstalled("com.koushikdutta.superuser"))) {
                Log.i(TAG, "Device Rooted");
                return true;
            }

            // check for SU application installed
            if (appInstalled("eu.chainfire.supersu.nonag") || appInstalled("eu.chainfire.supersu") || appInstalled("com.noshufou.android.su") || appInstalled("com.koushikdutta.superuser")) {
                Log.i(TAG, "Device Rooted");
                return true;
            }

            Log.i(TAG, "Device Not Rooted");
            return false;
        }


        private boolean appInstalled(String uri) {
            PackageManager pm = getPackageManager();
            boolean app_installed = false;
            try {
                pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
                app_installed = true;
            } catch (PackageManager.NameNotFoundException e) {
                app_installed = false;
            }
            return app_installed;
        }

このコードが false を返す場合は、フラグまたは表示とエラーを設定できます。それ以外の場合は続行します。

次に、デバイスがルート化されていることがわかったら、必要なルート コマンドを実行して必要なことを行います。

次のコードは、コマンドの String[] を入力として受け取り、ルートとして順番に実行します。

public boolean RunAsRoot(String[] cmds) {
    Process p;
    try {
        p = Runtime.getRuntime().exec("su");
        DataOutputStream os = new DataOutputStream(p.getOutputStream());
        try {
            for (String tmpCmd : cmds) {
                os.writeBytes(tmpCmd + "\n");
            }
            os.writeBytes("exit\n");
            os.flush();
            return true;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return false;
    }
}

あなたの場合、最初に/systemをrwとしてマウントしたいと思うでしょう。必要なコマンドを見つけるのに役立つ情報がウェブ上にたくさんありますが、次のようになります mount -o remount rw /system mount -o remount rw /system

mv次に、またはを使用して必要なファイルを移動しますcp

root コマンドの使用例は次のようになります。

String[] cmds = {"mount -o remount rw /system mount -o remount rw /system", "cp /sdcard/myfile /system/framework/myfile"};
if(!RunAsRoot(cmds)){
    //Commands failed to run, show an error/retry
}

これは、ルート機能である「ハード」ビットをカバーしています。

ボタンの簡単なチュートリアルは、ここにあります。

プログラムの流れは

onCreate(){
    checkIsRooted();
    Button x = (Button) findViewById(R.id.x);
    x.setOnClickListener(onClickListener());
}

onClickListener(){
    onClick(){
        String[] cmds = {...};
        if(!runAsRoot(cmds))
            AlertDialog.Builder.makeText(...).show();
    }
}

注、これは疑似コードです。このコードをコピーして貼り付けて機能させることはできません。自分で適切に行う必要があります。

于 2013-09-26T01:38:01.047 に答える