Jelly Bean的READ_LOGS权限(api 16)

时间:2012-07-12 22:26:53

标签: android logging root android-4.2-jelly-bean

由于Android Jelly Bean不支持logs reading permission(根据this google io 2012 videothis one too),我想知道根设备(或非root设备)是否可行)能够绕过此限制并能够读取日志。

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

4 个答案:

答案 0 :(得分: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!");

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

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

答案 1 :(得分:22)


编辑:事实证明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中引入)。这实际上允许用户将此权限授予任何应用程序。不需要root。

google groups thread提供了更多信息,并附有Dianne Hackborn的评论。

答案 2 :(得分:3)

我通过使用su调用logcat并从stdout读取

,在root设备上解决了这个问题
... .getRuntime().exec("su -c logcat -d");

答案 3 :(得分:0)

还有另一种方法可以访问所有日志而无需root权限。您可以使用远程调试。看一下开源rootless Logcat app