web-dev-qa-db-ja.com

Jelly BeanのREAD_LOGS権限(API 16)

Android Jelly Beanは ログの読み取り許可 (この this google io 2012ビデオ および this oneによれば)をサポートしていません。 too )、ルート権限を取得されたデバイス(またはルート権限を取得されていないデバイス)がこの制限を回避してログを読み取ることができるかどうかを知りたいです。

それ、どうやったら出来るの?アプリをシステムアプリにする必要がありますか、それとも十分に応援していますか?

22

アプリからpm grantコマンドを実行すると、ルート権限を取得されたデバイスで権限を取得できます。ただし、変更を有効にするには、その後にアプリを再起動する必要があります。

String pname = getPackageName();
String[] CMDLINE_GRANTPERMS = { "su", "-c", null };
if (getPackageManager().checkPermission(Android.Manifest.permission.READ_LOGS, pname) != 0) {
    Log.d(TAG, "we do not have the READ_LOGS permission!");
    if (Android.os.Build.VERSION.SDK_INT >= 16) {
        Log.d(TAG, "Working around JellyBeans 'feature'...");
        try {
            // format the commandline parameter
            CMDLINE_GRANTPERMS[2] = String.format("pm grant %s Android.permission.READ_LOGS", pname);
            Java.lang.Process p = Runtime.getRuntime().exec(CMDLINE_GRANTPERMS);
            int res = p.waitFor();
            Log.d(TAG, "exec returned: " + res);
            if (res != 0)
                throw new Exception("failed to become root");
        } catch (Exception e) {
            Log.d(TAG, "exec(): " + e);
            Toast.makeText(context, "Failed to obtain READ_LOGS permission", Toast.LENGTH_LONG).show();
        }
    }
} else
    Log.d(TAG, "we have the READ_LOGS permission already!");

このコードは、onCreate()から呼び出す必要があります。許可が与えられると、それ以上のルート権限は必要ありません。

PS:スーパーユーザーアプリのp.waitFor()ブロックは、アプリの起動を遅らせ、ANRを引き起こす可能性があります。

27
ge0rg

[〜#〜] edit [〜#〜]adb Shell pm grantはエミュレータでのみ機能します。本番デバイスでは、Shellがオプションの権限を付与および取り消すことはできません。


Rootである必要はありません。非システムアプリケーションに対してREAD_LOGSを有効にする必要があるのは、Android SDKをインストールすることだけです。

基本的に、あなたは呼び出す必要があります:

adb Shell pm grant <pkg.name> Android.permission.READ_LOGS

どこ <pkg.name>は、アプリケーションのパッケージ名です。これは、READ_LOGSが「システム」権限だけでなく、「開発」権限でもあるため可能です(この用語はJBで導入されています)。これにより、ユーザーはどのアプリケーションにもこの権限を付与できます。ルートは必要ありません。

詳細については、こちらをご覧ください google groups thread Dianne Hackbornからのコメント。

22
inazaruk

私はsuでlogcatを呼び出し、標準出力から読み取ることで、ルート権限を取得したデバイスでこれを回避しました

... .getRuntime().exec("su -c logcat -d");
3
bara

ルート権限なしですべてのログにアクセスする別の方法があります。リモートデバッグを使用できます。オープンソース rootless Logcat app を見てください。

0
Anton Tananaev