23

由于 Android Jelly Bean 不支持日志读取权限(根据这个 google io 2012 video and this one),我想知道有根设备(或非根设备)是否有可能绕过这个限制并能够读取日志。

我怎么做?我真的需要让应用程序成为系统应用程序,还是足够扎根?

4

4 回答 4

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 权限。

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

于 2012-09-28T15:26:38.947 回答
22

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


你不需要有根。对非系统应用程序启用 READ_LOGS 唯一需要做的就是安装 Android SDK。

基本上,您需要调用:

adb shell pm grant <pkg.name> android.permission.READ_LOGS

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

更多信息可在此google 群组线程中获得,其中包含 Dianne Hackborn 的评论。

于 2012-07-17T06:57:20.483 回答
3

我通过使用标准输出调用 logcatsu并从标准输出读取,在有根设备上解决了这个问题

... .getRuntime().exec("su -c logcat -d");
于 2013-05-14T15:00:46.807 回答
1

还有另一种无需 root 权限即可访问所有日志的方法。您可以使用远程调试。看看开源的无根 Logcat 应用程序

于 2016-07-05T02:46:29.433 回答