在果冻豆READ_LOGS许可(API 16)(READ_LOGS permission on Je

2019-06-17 10:34发布

由于Android果冻豆不支持日志读取权限 (根据这个谷歌IO 2012视频和这一个了 ),我想知道这是否是可能的解锁装置(或无根设备)能够绕过这个限制并能够读取日志。

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

Answer 1:

您可以从您的应用程序执行时准许命令获取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。



Answer 2:


编辑 :原来, adb shell pm grant只能在模拟器。 生产设备不允许shell授予和撤销可选权限。


你并不需要有根。 您需要启用READ_LOGS到非系统应用程序的唯一的事情就是安装Android SDK中。

基本上,你需要调用:

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

其中<pkg.name>是应用程序的包名。 这是可能的,因为READ_LOGS不仅是一个“系统”的权限,又是“发展”的权限(这个词在JB介绍)。 这实际上允许用户授予此权限的任何应用程序。 无需根。

更多信息,这是可用的谷歌组线程与戴安娜Hackborn的意见。



Answer 3:

我已经通过调用logcat的周围有这样一个根深蒂固的设备上su和标准输出读

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


Answer 4:

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



文章来源: READ_LOGS permission on Jelly Bean (api 16)