Jelly Bean上的READ_LOGS权限(api 16)

由于Android的果冻豆不支持日志阅读权限 (据这个谷歌io 2012video,也是这一个 ),我想知道是否有可能根植设备(或无根设备)能够绕过这个限制和能够读取日志。

我怎么做? 我真的需要使应用程序是一个系统的应用程序,或者是足够的根?

Solutions Collecting From Web of "Jelly Bean上的READ_LOGS权限(api 16)"

您可以通过从您的应用程序执行pm授予命令获得根设备上的权限。 可能您必须重新启动应用程序后才能使更改生效,但是:

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。


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


你不需要有根。 您需要启用READ_LOGS到非系统应用程序的唯一方法是安装Android SDK。

基本上,你需要打电话给:

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

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

更多信息可以在这个谷歌团体的线程中得到Dianne Hackborn的评论。

我已经通过使用su调用logcat并从stdout读取来解决这个问题

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

还有另一种方式来访问所有日志而不需要root权限。 您可以使用远程debugging。 看看开源的无根Logcat应用程序 。