Jelly Bean的READ_LOGS权限(api 16)

and*_*per 22 logging android root android-4.2-jelly-bean

由于Android Jelly Bean不支持日志读取权限(根据此谷歌io 2012视频视频),我想知道root设备(或非root设备)是否可以绕过这个限制并能够读取日志.

我怎么做?我真的需要将应用程序变成系统应用程序,还是足够生根?

ge0*_*0rg 27

您可以通过从应用程序执行pm grant命令来获取root设备的权限.可能您必须在此之后重新启动应用程序才能使更改生效:

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!");
Run Code Online (Sandbox Code Playgroud)

应该从onCreate()调用此代码.授予权限后,不再需要root权限.

PS:超级用户应用程序上的p.waitFor()阻止,延迟您的应用程序启动并可能导致ANR.

  • 这种方法_requires_ root.如果你运行`pm grant ...`而没有`su`,你将得到以下输出:`不允许操作:java.lang.SecurityException:用户100xx和当前进程都没有android.permission.GRANT_REVOKE_PERMISSIONS.GRANT_REVOKE_PERMISSIONS是也是系统级的,所以你不能在清单中要求它. (2认同)

ina*_*ruk 22


编辑:事实证明,adb shell pm grant只适用于模拟器.生产设备不允许shell授予和撤消可选权限.


你不需要root.将READ_LOGS启用到非系统应用程序所需的唯一方法是安装Android SDK.

基本上,你需要打电话:

adb shell pm grant <pkg.name> android.permission.READ_LOGS
Run Code Online (Sandbox Code Playgroud)

<pkg.name>您的应用程序的包名称在哪里.这是可能的,因为READ_LOGS不仅是"系统"权限,而且是"开发"权限(这个术语在JB中引入).这实际上允许用户将此权限授予任何应用程序.不需要root.

有关更多信息,请参阅此谷歌团队主题,其中包含Dianne Hackborn的评论.