Jelly Bean的READ_LOGS权限(api 16)

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

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

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

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

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。


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


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

基本上,你需要打电话:

 adb shell pm grant  android.permission.READ_LOGS 

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

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

通过使用su调用logcat并从stdout读取,我已经在root设备上解决了这个问题

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

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