我读了其他帖子,无法弄清楚“技巧”。
我查看了Log Collector,但无法使用单独的APK。我基本上使用相同的方法,并且我一直没有得到任何关于流程输入流的信息。
我在清单中有READ_LOGS。
在我的默认活动中,我能够获取日志,但如果我将逻辑移动到另一个活动或使用asynctask,则不会返回任何输出。
此代码来自我的默认活动...内联,我将其转储到日志
try {
Process process = Runtime.getRuntime().exec("logcat -d");
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
StringBuilder log=new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) {
log.append(line);
}
Log.d(LOGTAG, "Logcat: " +log.toString());
} catch (IOException e) {}
如果我将它包装在asynctask中或只是在另一个活动中内联它,它将不返回任何内容
ArrayList<String> commandLine = new ArrayList<String>();
//terminate on completion and suppress everything except the filter
commandLine.add("logcat -d -s");
...
//replace asynctask with inline (could not get log in asynctask)
showProgressDialog(getString(R.string.acquiring_log_progress_dialog_message));
final StringBuilder log = new StringBuilder();
BufferedReader bufferedReader = null;
try{
Process process = Runtime.getRuntime().exec(commandLine.toArray(new String[0]));
bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = bufferedReader.readLine()) != null){
log.append(line);
log.append(MangoApp.LINE_SEPARATOR);
}
sendIntent.putExtra(Intent.EXTRA_TEXT, log.toString());
startActivity(Intent.createChooser(sendIntent, getString(R.string.chooser_title)));
dismissProgressDialog();
dismissMainDialog();
finish();
}
catch (IOException e){
dismissProgressDialog();
showErrorDialog(getString(R.string.failed_to_get_log_message));
Log.e(LOGTAG, "Log collection failed: ", e);//$NON-NLS-1$
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException ignore) {}
}
}
有人能发现差异还是解释魔法?我很确定命令行在第二个版本中是正确的,所以我的头脑。我在模拟器上使用2.1 SDK 7.
由于
答案 0 :(得分:6)
希望这会有所帮助,您不必自己创建文件只需执行以下命令,即可获取错误信息。
Runtime.getRuntime().exec("logcat -v time -r 100 -f /sdcard/log.txt *:E");
Logcat参数选项:
-r <size in kilobytes> -> for specifying the size of file
-f <filename> -> file to which you want to write the logs.
答案 1 :(得分:2)
你可以在没有ArrayList的情况下试一试。只需传递命令String 我已通过以下方式实现它(没有ArrayList)。它对我有用。
String baseCommand = "logcat -v time";
baseCommand += " MyApp:I "; // Info for my app
baseCommand += " *:S "; // Silence others
ServicesController.logReaderProcess = Runtime.getRuntime().exec(baseCommand);