Percy

对Jelly Bean的READ_LOGS权限(API 16)

java

由于Android Jelly Bean不支持日志读取权限(根据此google io 2012视频以及该视频),因此我想知道是否有root的设备(或非root的设备)能够绕过此权限限制,并能够读取日志。

我怎么做?我是否真的需要使该应用程序成为系统应用程序,或者是否足够扎根?


阅读 354

收藏
2020-12-06

共2个答案

一尘不染

您可以通过在应用程序中执行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:Superuser应用程序上的p.waitFor()会阻塞,从而延迟了应用程序的启动并可能导致ANR。

2020-12-06
一尘不染

编辑:事实证明,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。

2020-12-06