Відповіді:
Logcollector - хороший варіант, але спочатку його потрібно встановити.
Коли я хочу отримати лог-файл для надсилання поштою, я зазвичай виконую наступні дії:
adb shell logcat > log.txtadb. Зазвичай вC:\Users\[your username]\AppData\Local\Android\Sdk\platform-tools\
Я сподіваюся, що цей код комусь допоможе. Мені знадобилося 2 дні, щоб зрозуміти, як увійти з пристрою, а потім відфільтрувати:
public File extractLogToFileAndWeb(){
//set a file
Date datum = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd", Locale.ITALY);
String fullName = df.format(datum)+"appLog.log";
File file = new File (Environment.getExternalStorageDirectory(), fullName);
//clears a file
if(file.exists()){
file.delete();
}
//write log to file
int pid = android.os.Process.myPid();
try {
String command = String.format("logcat -d -v threadtime *:*");
Process process = Runtime.getRuntime().exec(command);
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
StringBuilder result = new StringBuilder();
String currentLine = null;
while ((currentLine = reader.readLine()) != null) {
if (currentLine != null && currentLine.contains(String.valueOf(pid))) {
result.append(currentLine);
result.append("\n");
}
}
FileWriter out = new FileWriter(file);
out.write(result.toString());
out.close();
//Runtime.getRuntime().exec("logcat -d -v time -f "+file.getAbsolutePath());
} catch (IOException e) {
Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
}
//clear the log
try {
Runtime.getRuntime().exec("logcat -c");
} catch (IOException e) {
Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
}
return file;
}
як вказував @mehdok
додати дозвіл на маніфест для читання журналів
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.READ_LOGS" />
Для тих, хто не цікавиться налагодженням USB або їх використанням adb, є більш просте рішення. В Android 6 (не впевнений у попередній версії) в інструментах для розробників є опція: Take Bug Report
Якщо натиснути цю опцію, підготуйте звіт про помилку та запропонуйте зберегти його на диску або надіслати електронною поштою.
Я вважав, що це найпростіший спосіб отримати журнали. Мені не подобається включати налагодження через USB.
Редагувати:
Внутрішній журнал - це круговий буфер пам'яті. Насправді є кілька таких кругових буферів для кожного з: радіо, події, головне. За замовчуванням є основним.
Для отримання копії буфера одна техніка передбачає виконання команди на пристрої та отримання виводу у вигляді змінної рядка.
SendLog - це програма з відкритим кодом, яка робить саме це: http://www.l6n.org/android/sendlog.shtml
Ключ - це запустити logcatна пристрої вбудовану ОС. Це не так складно, як це звучить, просто перевірте додаток з відкритим кодом за посиланням.
Часто я отримую помилку " logcat read: Invalid argument". Мені довелося очистити журнал, перш ніж читати з журналу.
Мені так подобається:
prompt> cd ~/Desktop
prompt> adb logcat -c
prompt> adb logcat | tee log.txt
Простий спосіб - зробити власні способи збирання журналів або навіть просто існуючий додаток для збирання журналів з ринку.
Для моїх програм я створив функцію звіту, яка надсилає журнали на мій електронний лист (або навіть в інше місце - як тільки ви отримаєте журнал, ви можете робити, чи хочете ви з ним).
Ось простий приклад того, як отримати файл журналу з пристрою:
Просто запускайте таку команду, щоб отримати вихід до свого терміналу:
adb shell logcat
Я знаю, що це давнє питання, але я вважаю, що все ще діє навіть у 2018 році.
Існує можливість взяти звіт про помилки, прихований у параметрах розробника на кожному пристрої Android.
ПРИМІТКА. Це скидає весь системний журнал
Як увімкнути параметри розробника? дивіться: https://developer.android.com/studio/debug/dev-options
Що для мене працює:
як це читати? відкритий bugreport-1960-01-01-hh-mm-ss.txt
ви, мабуть, хочете шукати щось подібне:
------ SYSTEM LOG (logcat -v threadtime -v printable -d *:v) ------
--------- beginning of crash
06-13 14:37:36.542 19294 19294 E AndroidRuntime: FATAL EXCEPTION: main
або:
------ SYSTEM LOG (logcat -v threadtime -v printable -d *:v) ------
--------- beginning of main
Завдяки user1354692 я міг би зробити це простіше, маючи лише один рядок! той, хто прокоментував:
try {
File file = new File(Environment.getExternalStorageDirectory(), String.valueOf(System.currentTimeMillis()));
Runtime.getRuntime().exec("logcat -d -v time -f " + file.getAbsolutePath());}catch (IOException e){}
OnCreate?
Я створив невелику бібліотеку (.aar) для отримання журналів електронною поштою. Ви можете використовувати його з обліковими записами Gmail. Це досить просто, але працює. Ви можете отримати копію звідси
Сайт є іспанською, але є PDF-файл з англійською версією опису продукту.
Я сподіваюся, що це може допомогти.
Два кроки:
- Створіть журнал
- Завантажте Gmail, щоб надіслати журнал
.
Створіть журнал
File generateLog() {
File logFolder = new File(Environment.getExternalStorageDirectory(), "MyFolder");
if (!logFolder.exists()) {
logFolder.mkdir();
}
String filename = "myapp_log_" + new Date().getTime() + ".log";
File logFile = new File(logFolder, filename);
try {
String[] cmd = new String[] { "logcat", "-f", logFile.getAbsolutePath(), "-v", "time", "ActivityManager:W", "myapp:D" };
Runtime.getRuntime().exec(cmd);
Toaster.shortDebug("Log generated to: " + filename);
return logFile;
}
catch (IOException ioEx) {
ioEx.printStackTrace();
}
return null;
}Завантажте Gmail, щоб надіслати журнал
File logFile = generateLog();
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(logFile));
intent.setType("multipart/");
startActivity(intent);Список літератури для №1
~~
Для №2 - існує багато різних відповідей щодо того, як завантажити файл журналу для перегляду та надсилання. Нарешті, рішення насправді спрацювало обом:
- завантажте Gmail як варіант
- файл успішно додає
Велика подяка https://stackoverflow.com/a/22367055/2162226 за правильно працюючу відповідь
Спочатку переконайтеся, що команда adb виконується, встановивши PATH на платформу-інструменти для android sdk:
export PATH=/Users/espireinfolabs/Desktop/soft/android-sdk-mac_x86/platform-tools:$PATH
потім запустіть:
adb shell logcat > log.txt
АБО спочатку перейдіть до платформи-інструментів adb:
cd /Users/user/Android/Tools/android-sdk-macosx/platform-tools
потім біжи
./adb shell logcat > log.txt