由于 Android Jelly Bean 不支持日志读取权限(根据这个 google io 2012 video and this one),我想知道有根设备(或非根设备)是否有可能绕过这个限制并能够读取日志。
我怎么做?我真的需要让应用程序成为系统应用程序,还是足够扎根?
由于 Android Jelly Bean 不支持日志读取权限(根据这个 google io 2012 video and this one),我想知道有根设备(或非根设备)是否有可能绕过这个限制并能够读取日志。
我怎么做?我真的需要让应用程序成为系统应用程序,还是足够扎根?
您可以通过在您的应用程序中执行 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。
编辑:事实证明,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 的评论。
我通过使用标准输出调用 logcatsu
并从标准输出读取,在有根设备上解决了这个问题
... .getRuntime().exec("su -c logcat -d");
还有另一种无需 root 权限即可访问所有日志的方法。您可以使用远程调试。看看开源的无根 Logcat 应用程序。