由于Android Jelly Bean不支持logs reading permission(根据this google io 2012 video和this one too),我想知道根设备(或非root设备)是否可行)能够绕过此限制并能够读取日志。
我该怎么做?我真的需要将应用程序变成系统应用程序,还是足够生根?
答案 0 :(得分:27)
您可以通过从应用程序执行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权限。
P.S:超级用户应用程序上的p.waitFor()阻止,延迟你的应用程序启动并可能导致ANR。
答案 1 :(得分:22)
编辑:事实证明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。
此google groups thread提供了更多信息,并附有Dianne Hackborn的评论。
答案 2 :(得分:3)
我通过使用su
调用logcat并从stdout读取
... .getRuntime().exec("su -c logcat -d");
答案 3 :(得分:0)
还有另一种方法可以访问所有日志而无需root权限。您可以使用远程调试。看一下开源rootless Logcat app。