Search code examples
androidloggingrootandroid-4.2-jelly-bean

READ_LOGS permission on Jelly Bean (api 16)


Since Android Jelly Bean doesn't support the logs reading permission (according to this google io 2012 video and this one too ) , i would like to know if it's possible for rooted devices (or non-rooted devices) to be able to bypass this restriction and be able to read the logs.

How do i do that? Do i really need to make the app a system app, or is rooting enough?


Solution

  • You can obtain the permission on a rooted device by executing the pm grant command from your app. Probably you will have to restart the app after that for the change to take effect, though:

    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!");
    

    This code should be called from your onCreate(). Once the permission is granted, no more root powers are required.

    P.S: The p.waitFor() blocks on the Superuser app, delaying your app start and potentially cause an ANR.