3

私はこれがたくさん尋ねられたことを知っていますが、決して答えられませんでした。私は間違いなくrootにファイルを書き込む必要があります。他の解決策はありません。私は現在このコードを使用していますが、/system/に新しいものは何も表示されません。アセットから/systemフォルダー(サブディレクトリを含む)にファイルをコピーしたい

public void installFiles(View v) {
            try {
        Runtime.getRuntime().exec("su");
    } catch (IOException e) {
        mDebugView.append(e.toString());
    }
    copyPath("system/bin", "/system/bin/");
    copyPath("system/lib", "/system/lib/");
    copyPath("system/etc", "/system/etc/");
    copyPath("system/etc/audio", "/system/etc/audio/");
    copyPath("system/etc/soundimage", "/system/etc/soundimage/");
    copyPath("system/lib/soundfx", "/system/bin/soundfx/");
}

public void copyPath(String from, String to) {
    mDebugView.append("Copying path assets/" + from + " to " + to + "\n");
    AssetManager assetManager = getAssets();
    String[] files = null;
    try {
        files = assetManager.list(from);
        for (String filename : files) {
            mDebugView.append(filename + "... \n");
            if (new File(filename).isFile()) {
                mDebugView.append("Copying " + filename + "\n");
                InputStream in = null;
                OutputStream out = null;
                in = assetManager.open(filename);
                out = new FileOutputStream(to);
                copyFile(in, out);
                in.close();
                in = null;
                out.flush();
                out.close();
                out = null;
            }
        }
    } catch (IOException e) {
        Log.e(this.getClass().toString(), e.toString());
        mDebugView.append(e.toString() + "\n");
    }
}

private void copyFile(InputStream in, OutputStream out) throws IOException {
    mDebugView.append("..");
    byte[] buffer = new byte[1024];
    int read;
    while ((read = in.read(buffer)) != -1) {
        out.write(buffer, 0, read);
    }
}
4

4 に答える 4

3

あなたの

Runtime.getRuntime().exec("su");

何もしません。プロセスが作成されてからリリースされると。ファイルを移動するには、suでcatバイナリを使用する必要があります。IE

Runtime.getRuntime().exec("su cat filepath1 > filepath2");

必要な数のコマンドについては、suのプロセスインスタンスを取得してから、すべてのmoveコマンドを一度に実行することをお勧めします。

また、デフォルトではおそらくr / wではないため、システムパーティションをrwとしてマウントする必要がある場合があることにも注意してください。

于 2012-06-29T21:14:30.337 に答える
2

私は掘り続け、それを行う方法を見つけました。

  1. 何度か試みた後、私のROM(より正確には/ systemフォルダー)がひどく損傷したため、エラーストリームの入力が常に表示されていました:「許可なし」->ワイプでROMを再インストールしました

  2. ファイルを外部ストレージにコピーしました(この場合は/ sdcardですが、別のパスである可能性があることに注意してください。パスを取得するには、Environment Objectを使用してください)。すべてのサブフォルダーをメインフォルダーに抽出しました。

  3. 以前のコードと同じ新しいコードがSUセッションを開き、再び閉じました。

    Process proc = runtime.exec("su");
                new ProcessReader(proc).start();
                new ErrorReader(proc).start();
                DataOutputStream os = new DataOutputStream(
                        proc.getOutputStream());
                os.writeBytes("chmod 755 /system/" + "\n");
                os.writeBytes("find /sdcard/.beats_cache/systembin -exec mv '{}' /system/bin +\n");
                os.writeBytes("find /sdcard/.beats_cache/systemlib -exec mv '{}' /system/lib +\n");
                os.writeBytes("find /sdcard/.beats_cache/systemetc -exec mv '{}' /system/etc +\n");
                os.writeBytes("find /sdcard/.beats_cache/systemetcaudio -exec mv '{}' /system/etc/audio +\n");
                os.writeBytes("find /sdcard/.beats_cache/systemetcsoundimage -exec mv '{}' /system/etc/soundimage +\n");
                os.writeBytes("find /sdcard/.beats_cache/systemlibsoundfx -exec mv '{}' /system/lib/soundfx +\n");
                os.writeBytes("exit\n");
                os.flush();
    
于 2012-07-01T16:53:19.687 に答える
2

You don't see any changes on /system because it's mounted as read-only by default. Please ensure that you remounted it before writing files. Although as others mentioned su should be used with a command.

于 2012-06-29T22:08:55.033 に答える
1

最初に「su」を実行しても、/systemフォルダーへの書き込み権限を得るには不十分な場合があります。Root Explorerおよびその他のファイル管理アプリはすべて、/systemをr/ wとして再マウントし、読み取り専用としてマウントし直す必要があります。この質問に対する答えは、/systemパスを再マウントするコマンドを示しています。答えはadbを使用することですが、デバイスで実行すると同じように機能するはずです。

ちなみに、ファイルを自分で移動するよりも、システムコマンドを実行してファイルを移動する方が簡単な場合があります。Cyanogenmod7.xを実行している私のLGOptimusTでは、/ system / xbinにあり、/ cpsystemmvを再マウントせずにファイルをコピー/移動できます(そうであれば、おそらくsu mvまたはを介してのみsu cp)。私はあなた(またはあなたのアプリをインストールする人)もそれらのファイルを持っているかどうかを確実に知るためにアンドロイドのこの部分について十分に知りませんが、調べる価値があります。彼らはbusyboxを必要とするかもしれません、私はそれを調べていません。

于 2012-06-29T20:54:58.680 に答える