【发布时间】:2012-03-17 15:19:45
【问题描述】:
我正在尝试编写一个应用程序来读取 adb logcat 创建的日志。按照link1 和link2 上的代码,我有以下代码:
try {
Process process = Runtime.getRuntime().exec("logcat");
System.out.println("Process : " + process); // shows process id
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
System.out.println("Buffered reader : " + bufferedReader.readLine());
StringBuilder log = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) {
log.append(line);
}
TextView tv = (TextView) findViewById(R.id.textView1);
tv.setText(log.toString());
} catch (IOException e) {
}
为了测试缓冲阅读器正在阅读什么,我放了一个 println,但我收到一条消息“无法绑定 tcp:5038”。上面的代码不读取任何日志。我也尝试过使用“logcat *:V”,但我没有得到最低优先级的日志。
我给了我的应用权限:android.permission.READ_LOGS。
我正在 Android 模拟器上测试我的代码。
谁能指出我做错了什么。
感谢您的帮助。
编辑:
我尝试了“logcat -d”,得到了一行日志。在代码中,可以观察到提供了一个 try/catch 块; 当我从应用程序中删除权限 READ_LOGS 时,不会引发异常,并且 bufferReader 只会打印 null(通常当应用程序找不到所需的权限时,它会引发异常)。 这种行为的原因是什么?
EDIT2:
我尝试了 Log.d(TAG, log.toString()) 并得到了不止一行文本。有人可以解释上一次编辑的最后一个问题:当我删除所需的权限时,为什么应用程序没有引发异常?
【问题讨论】:
-
应该是 "logcat -d" afaik。但是您可能会收到 ANR,因为它不会停止读取日志。您需要在后台线程、AsyncTask 或类似的东西中移动读数。编辑:算了,没有 ANR。
-
@zapl 我已经编辑了问题。
-
您的 TextView 可以显示多于 1 行 (
android:singleLine) 吗?您也可以在执行tv.setText(log.toString());后尝试执行Log.d("TAG", log.toString());以验证它没有显示错误。还是有例外?如果是这样,请将其添加到您的问题中。 -
@zapl 当我使用 Log.d("TAG", log.toString());您能否也解释一下第二部分:当我从应用程序中删除权限时,为什么它不引发异常并简单地将日志作为 null 返回给缓冲区读取器?
-
似乎Runtime#exec() 不会在命令无法执行的情况下抛出异常。
BufferedReader没有什么可以读取的
标签: android logging android-logcat