平时我们通过usb连接手机,然后使用adb logcat -v time > d:\xx的方式获取locat信息,但是如何在APK中编程让APP自动获取logcat信息。
方法一:使用Runtime.getRuntime().exec()来执行shell命令,具体代码举例如下:
try {
ArrayList commandLine = new ArrayList();
commandLine.add( "logcat");
commandLine.add( "-d");使用该参数可以让logcat获取日志完毕后终止进程
commandLine.add( "-v");
commandLine.add( "time");
commandLine.add( "-f");如果使用commandLine.add(">");是不会写入文件,必须使用-f的方式
commandLine.add( "/sdcard/log/logcat.txt");
Process process = Runtime.getRuntime().exec( commandLine.toArray( new String[commandLine.size()]));
BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(process.getInputStream()), 1024);
String line = bufferedReader.readLine();
while ( line != null) {
log.append(line);
log.append("\n")
}
} catch ( IOException e) {
}
但是我们发现获取的只是本应用自己的logcat信息,而不像adb logcat 获取所有的log信息。查看资料得到如下信息:
android.permission.READ_LOGS:app读取日志权限,android 4.1之前版本通过申请READ_LOGS权限就可以读取其他应用的log了。但是谷歌发现这样存在安全风险,于是android 4.1以及之后版本,即使申请了READ_LOGS权限也无法读取其他应用的日志信息了。4.1版本中 Logcat的签名变为 “signature|system|development”了,这意味着只有系统签名的app或者root权限的app才能使用该权限。普通用户可以通过ADB查看所有日志。
也就是说android4.1之后不能通过以上代码方式获取logcat信息,那写这么多代码还有什么意义呢。
那就把手机ROOT了吧。
基于已经root的手机我们再执行以上命令,发现获取的log日志还是一样的,什么原因呢?
第一反应就是adb shell进去然后su一把,但是执行后还是同样的效果,分析后发现:我们程序执行的进程和adb shell进程不是同一个,也就是说程序执行时的环境并没有root,怎么才能同时执行su和logcat命令呢?
方法二:使用ShellUtils工具执行logcat命令
commnandList.add("rm -r /mnt/sdcard/bugLog/logcat.txt");如果不删除之前的logcat.txt文件,每次执行logcat命令也不会更新该文件
commnandList.add("logcat -d -v time -f /mnt/sdcard/bugLog/logcat.txt");
ShellUtils.execCommand(commnandList, true);
问题搞定!!