Risposte:
Logcollector è una buona opzione ma devi prima installarlo.
Quando voglio ottenere il file di registro da inviare per posta, di solito faccio quanto segue:
adb shell logcat > log.txtadb. Di solito inC:\Users\[your username]\AppData\Local\Android\Sdk\platform-tools\
Spero che questo codice possa aiutare qualcuno. Mi ci sono voluti 2 giorni per capire come accedere dal dispositivo, quindi filtrarlo:
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;
}
come indicato da @mehdok
aggiungere l'autorizzazione al manifest per la lettura dei registri
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.READ_LOGS" />
Vorrei usare qualcosa di questo tipo:
$adb logcat -d > logcat.txt
L'opzione -d scarica l'intero buffer circolare nel file di testo e se stai cercando un'azione / intento particolare, prova
$adb logcat -d | grep 'com.whatever.you.are.looking.for' -B 100 -A 100 > shorterlog.txt
Spero che questo ti aiuti :)
Per coloro che non sono interessati al debug o all'utilizzo di USB, adbesiste una soluzione più semplice. In Android 6 (non sono sicuro della versione precedente) c'è un'opzione sotto gli strumenti di sviluppo: Prendi il rapporto sui bug
Facendo clic su questa opzione verrà preparato un rapporto sui bug e verrà richiesto di salvarlo su Drive o di inviarlo tramite e-mail.
Ho trovato che questo è il modo più semplice per ottenere i registri. Non mi piace attivare il debug USB.
MODIFICARE:
Il registro interno è un buffer circolare in memoria. In realtà ci sono alcuni di questi buffer circolari per ciascuno di: radio, eventi, principale. L'impostazione predefinita è principale.
Per ottenere una copia di un buffer, una tecnica prevede l'esecuzione di un comando sul dispositivo e l'output come variabile stringa.
SendLog è un'app open source che fa proprio questo: http://www.l6n.org/android/sendlog.shtml
La chiave è eseguire logcatsul dispositivo nel sistema operativo incorporato. Non è così difficile come sembra, basta dare un'occhiata all'app open source nel link.
Ricevo spesso l'errore " logcat read: Invalid argument". Ho dovuto cancellare il registro, prima di leggere dal registro.
Mi piace così:
prompt> cd ~/Desktop
prompt> adb logcat -c
prompt> adb logcat | tee log.txt
Un modo semplice è creare i propri metodi di raccolta dei log o anche solo un'app di raccolta dei log esistente sul mercato.
Per le mie app ho creato una funzionalità di report che invia i registri alla mia e-mail (o anche a un altro posto - una volta ottenuto il registro puoi fare ciò che vuoi con esso).
Ecco un semplice esempio su come ottenere il file di registro da un dispositivo:
Semplice è sufficiente eseguire il comando seguente per ottenere l'output sul terminale:
adb shell logcat
So che è una vecchia domanda, ma credo che sia valido anche nel 2018.
C'è un'opzione per prendere una segnalazione di bug nascosta in Opzioni sviluppatore in ogni dispositivo Android.
NOTA: questo eliminerebbe il registro dell'intero sistema
Come abilitare le opzioni per gli sviluppatori? vedi: https://developer.android.com/studio/debug/dev-options
Cosa funziona per me:
come leggere questo? apri bugreport-1960-01-01-hh-mm-ss.txt
probabilmente vorrai cercare qualcosa del genere:
------ 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
o:
------ SYSTEM LOG (logcat -v threadtime -v printable -d *:v) ------
--------- beginning of main
Grazie a user1354692 ho potuto renderlo più semplice, con una sola riga! quello che ha commentato:
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?
Ho creato una piccola libreria (.aar) per recuperare i registri via e-mail. Puoi usarlo con account Gmail. È piuttosto semplice ma funziona. Puoi ottenere una copia da qui
Il sito è in spagnolo, ma esiste un PDF con una versione inglese della descrizione del prodotto.
Spero possa essere d'aiuto.
Due passaggi:
- Genera il registro
- Carica Gmail per inviare il registro
.
Genera il registro
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;
}Carica Gmail per inviare il registro
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);Riferimenti per # 1
~~
Per # 2 - ci sono molte risposte diverse là fuori su come caricare il file di registro da visualizzare e inviare. Infine, la soluzione qui ha funzionato in entrambi i modi:
- carica Gmail come opzione
- allega il file correttamente
Grazie mille a https://stackoverflow.com/a/22367055/2162226 per la risposta correttamente funzionante
Per prima cosa assicurati che il comando adb sia eseguibile impostando PATH su android sdk platform-tools:
export PATH=/Users/espireinfolabs/Desktop/soft/android-sdk-mac_x86/platform-tools:$PATH
quindi eseguire:
adb shell logcat > log.txt
O prima passa agli strumenti della piattaforma adb:
cd /Users/user/Android/Tools/android-sdk-macosx/platform-tools
quindi corri
./adb shell logcat > log.txt