2011-07-04 13 views
2

私はルートアクセスでシステムファイルを変更できるファイルエクスプローラを作成していますが、いくつかの問題が発生しました。ファイルエクスプローラでのルートアクセス

私が今やっていることは、私のアプリケーションのルートアクセスを許可することですが、 "su"を実行することはできません。 私がadbシェルのフォルダにアクセス権を設定しても、アプリケーションは正常に動作しますが、ルートブラウジングはchmodsに依存しないと思います。

私のアプリがルート権限を持っているかのように動作させる適切な方法は誰にもありますか?

答えて

2

アンドロイドアプリケーションプロセス(そのdalvik VMとネイティブライブラリ)をルートとして実行することは非常に難しく、セキュリティだけでなくシステムライブラリのプライベートコピーをロードすることによるメモリの無駄を含む多くの理由ではお勧めできません通常のアプリケーションの起動時と同様に、zygoteから特権のないプロセスを継承するときに利用できる共有読み取り専用コピーを使用することができます。

根本的な電話機の非公式の「su」ハックは、アプリケーションプロセスが特権を持たないままルートとして実行されるヘルパープロセスを起動することを可能にします。それを呼び出すアプリケーションのユーザーIDは変更されません。実際、UNIX系のオペレーティングシステムでは、これを行うためのメカニズムは実際には設計されていません。

特権ヘルパープロセスを取得したら、stdin/stdoutやunixドメインソケットなどのプロセス間通信の手段を使用して通信して、ファイル操作を実行する必要があります。シェル上に存在するシェルは、おそらくヘルパーアプリケーションとして使用することもできます。ファイルマネージャが必要とするもののほとんどは、 'cat'コマンドで実装できます。公式には、これは安定したAPIではありませんが、アプリケーションにアクセス可能な「su」ハックは公式のアンドロイドにはありませんので、プロジェクト全体が「サポートされていない」領域に深く入り込んでいます。

+0

[OK]を、私は理解しています。私はより簡単な方法があったが、とにかくヒントをありがとう。 – glodos

1

ルートアクセスで新しいプロセスが作成されるため、アプリケーションにルート権限がありません。
root特権でできることは実行コマンドなので、アンドロイドのコマンドを知る必要があります。多くのコマンドはcplsなどのLinuxベースです。

使用するコマンドを実行し、出力を得るために、このコード:ファイルエクスプローラのため

/** 
* Execute command and get entire output 
* @return Command output 
*/ 
private String executeCommand(String cmd) throws IOException, InterruptedException { 
    Process process = Runtime.getRuntime().exec("su"); 
    InputStream in = process.getInputStream(); 
    OutputStream out = process.getOutputStream(); 
    out.write(cmd.getBytes()); 
    out.flush(); 
    out.close(); 
    byte[] buffer = new byte[1024]; 
    int length = buffer.read(buffer); 
    String result = new String(buffer, 0, length); 
    process.waitFor(); 
    return result; 
} 

/** 
* Execute command and an array separates each line 
* @return Command output separated by lines in a String array 
*/ 
private String[] executeCmdByLines(String cmd) throws IOException, InterruptedException { 
    Process process = Runtime.getRuntime().exec("su"); 
    InputStream in = process.getInputStream(); 
    OutputStream out = process.getOutputStream(); 
    out.write(cmd.getBytes()); 
    out.flush(); 
    out.close(); 
    byte[] buffer = new byte[1024]; 
    int length = buffer.read(buffer); 
    String output = new String(buffer, 0, length); 
    String[] result = output.split("\n"); 
    process.waitFor(); 
    return result; 
} 

用途を:

は、ファイルのリストを取得します:

for (String value : executeCmdByLines("ls /data/data")) { 
    //Do your stuff here 
} 

読むテキストファイル:

String content = executeCommand("cat /data/someFile.txt"); 
//Do your stuff here with "content" string 

コピーファイル(一部のデバイス上で動作していないcpコマンド):

executeCommand("cp /source/of/file /destination/file"); 

削除ファイル(一部のデバイス上で動作していないrmコマンド):

executeCommand("rm /path/to/file"); 
関連する問題