Fereastra Logcat din Android Studio afișează mesajele de sistem, cum ar fi atunci când apare o garbagecollection, și mesajele pe care le-ați adăugat la aplicația dvs. cu clasa Log
. Afișează mesajele în timp real și păstrează un istoric, astfel încât să puteți vizualiza mesajele mai vechi.
Pentru a afișa doar informațiile care vă interesează, puteți crea filtre, puteți modificacâte informații sunt afișate în mesaje, puteți seta niveluri de prioritate, puteți afișamesajele produse doar de codul aplicației și puteți căuta în jurnal. În mod implicit, logcatsafișează doar jurnalele de ieșire legate de cea mai recentă aplicație rulată.
Când o aplicație aruncă o excepție, logcat afișează un mesaj urmat de urmă de stivă asociată care conține legături către linia de cod.
De la Android Studio 2.2, fereastra Run afișează, de asemenea, mesajele de jurnal pentru aplicația în curs de execuție. Rețineți că puteți configura afișarea ieșirii logcat, dar nu și fereastra Run.
Veziți jurnalele aplicației dvs.
Pentru a afișa mesajele de jurnal pentru o aplicație:
- Construiți și rulați aplicația dvs. pe un dispozitiv.
- Click View > Tool Windows > Logcat (sau faceți clic pe Logcat în bara ferestrei de instrumente).
Fereastra Logcat afișează mesajele de jurnal pentru aplicația selectată, așa cum sunt selectate din listele derulante din partea de sus a ferestrei, așa cum se arată în figura 1.
Figura 1. Fereastra Logcat
În mod implicit, logcat afișează doar mesajele de jurnal pentru aplicația dvs. care rulează pe dispozitiv. Pentru a modifica această valoare implicită, consultați cum să filtrați mesajele logcat.
Bara de instrumente Logcat oferă următoarele butoane:
- Clear logcat : Faceți clic pentru a șterge jurnalul vizibil.
- Derulați până la sfârșit : Faceți clic pentru a trece la partea de jos a jurnalului și a vedea cele mai recente mesaje din jurnal. Dacă apoi faceți clic pe o linie din jurnal, vizualizarea întrerupe derularea în acel punct.
- Up the stack trace și Down the stack trace : Faceți clic pentru a naviga în sus și în jos pe urmele de stivă din jurnal, selectând numele fișierelor ulterioare (și vizualizând numerele de linie corespunzătoare în editor) care apar în excepțiile tipărite. Acesta este același comportament ca atunci când faceți clic pe un nume de fișier din jurnal.
- Use soft wraps : Faceți clic pentru a activa înfășurarea liniilor și pentru a preveni derularea orizontală (deși orice șiruri neîntreruptibile vor necesita în continuare derularea orizontală).
- Print : Faceți clic pentru a imprima mesajele logcat. După selectarea preferințelor de imprimare în fereastra de dialog care apare, puteți alege, de asemenea, să salvați într-un PDF.
- Restart : Faceți clic pentru a șterge jurnalul și a reporni logcat. Spre deosebire de butonul Clear logcat (Ștergere logcat), acesta recuperează și afișează mesajele de jurnal anterioare, deci este cel mai util dacă Logcat devine insensibil și nu doriți să pierdeți mesajele de jurnal.
- Logcat header : Faceți clic pentru a deschide fereastra de dialog Configure Logcat Header (Configurare antet Logcat), unde puteți personaliza aspectul fiecărui mesaj Logcat, cum ar fi dacă să afișați data și ora.
- Captură de ecran : Faceți clic pentru a captura o captură de ecran.
- Screen record : Faceți clic pentru a înregistra o înregistrare video a dispozitivului (pentru maximum 3 minute).
Scrierea mesajelor de jurnal
Clasa Log
vă permite să creați mesaje de jurnal care apar în logcat. În general, ar trebui să folosiți următoarele metode de logare,enumerate în ordine de la cea mai mare la cea mai mică prioritate (sau, de la cea mai mică la cea mai abundentă):
-
Log.e(String, String)
(error) -
Log.w(String, String)
(warning) -
Log.i(String, String)
(information) -
Log.d(String, String)
(debug) -
Log.v(String, String)
(verbose)
Vezi descrierea clasei Log
pentru o listă mai completă de opțiuni.
Nu ar trebui să compilați niciodată jurnalele verbose în aplicația dumneavoastră, cu excepția cazului în timpuldezvoltării. Jurnalele de depanare sunt compilate, dar sunt eliminate în timpul execuției, în timp ce jurnalele de eroare, de avertizare și de informații sunt întotdeauna păstrate.
Pentru fiecare metodă de jurnal, primul parametru trebuie să fie o etichetă unică, iar cel de-al doilea parametru este mesajul. Eticheta unui mesaj de jurnal de sistem este un șir scurt care indică componenta de sistemde la care provine mesajul (de exemplu, ActivityManager
). Eticheta dvs. poate fi orice șir de caractere pe care îl considerați util, cum ar fi numele clasei curente.
O bună convenție este să declarați o constantă TAG
în clasa dvs. pentru a o utiliza în primul parametru. De exemplu, ați putea crea un mesaj de jurnal de informații după cum urmează:
Kotlin
private const val TAG = "MyActivity"...Log.i(TAG, "MyClass.getView() — get item number $position")
Java
private static final String TAG = "MyActivity";...Log.i(TAG, "MyClass.getView() — get item number " + position);
Rețineți: Numele etichetelor mai mari de 23 de caractere sunt trunchiate în ieșirea logcat.
Formatul mesajului logcat
Fiecare mesaj de jurnal Android are o etichetă și o prioritate asociate cu el. Eticheta unui mesaj de jurnal de sistem este un șir scurt care indică componenta de sistem de la care provine mesajul (de exemplu, ActivityManager
). O etichetă definită de utilizator poate fi orice șir de caractere pe care îl considerați util, cum ar fi numele clasei curente (eticheta recomandată). O definiți într-un apel de metodă Log
, de exemplu:
Kotlin
Log.d(tag, message)
Java
Log.d(tag, message);
Prioritatea este una dintre următoarele valori:
- V: Verbose (cea mai mică prioritate)
- D: Debug
- I: Info
- W: Warning
- E: Error
- A: Assert
Formatul mesajelor de jurnal este:
date time PID-TID/package priority/tag: message
De exemplu, următorul mesaj de jurnal are o prioritate de V
și o etichetă de AuthZen
:
12-10 13:02:50.071 1901-4229/com.google.android.gms V/AuthZen: Handling delegate intent.
PID reprezintă identificatorul procesului, iar TID este identificatorul firului de execuție; acestea pot fi identice în cazul în care există un singur fir de execuție.
Setați nivelul de jurnal
Puteți controla câte mesaje apar în logcat prin setarea nivelului de jurnal. Puteți afișa toate mesajele sau doar mesajele care indică cele mai grave condiții.
Rețineți că logcat continuă să colecteze toate mesajele indiferent de setarea nivelului de jurnal. Setarea determină doar ceea ce afișează logcat.
În meniul Log level, selectați una dintre următoarele valori:
- Verbose: Afișează toate mesajele din jurnal (valoarea implicită).
- Debug (Depanare): Afișează mesajele din jurnalul de depanare care sunt utile numai în timpul dezvoltării, precum și nivelurile de mesaje mai mici din această listă.
- Info: Afișează mesajele de jurnal așteptate pentru utilizarea obișnuită, precum și nivelurile de mesaje mai mici din această listă.
- Warn: Afișează problemele posibile care nu sunt încă erori, precum și nivelurile de mesaje mai mici din această listă.
- Error: Afișează problemele care au provocat erori, precum și nivelul de mesaj mai jos în această listă.
- Assert: Afișează problemele care dezvoltatorul se așteaptă să nu se întâmple niciodată.
Search logcat messages
Pentru a căuta mesajele afișate în prezent în logcat:
- Selectați opțional Regex dacă doriți să utilizați un model de căutare cu expresie regulată.
- Tastați o secvență de caractere în câmpul de căutare .
Afișajul ieșirii logcat se modifică în consecință.
- Presați Enter pentru a stoca șirul de căutare în meniu în timpul acestei sesiuni.
- Pentru a repeta o căutare, alegeți-o din meniul de căutare. Selectați sau deselectați Regex după cum este necesar (setarea nu este memorată).
Filtrează mesajele din logcat
O modalitate de a reduce ieșirea din jurnal la un nivel ușor de gestionat este de a o restricționa prin utilizarea unui filtru.
Notă: Filtrul se aplică întregului istoric logcat, nu doar mesajelor afișate în prezent în logcat. Asigurați-vă că celelalte opțiuni de afișare sunt setate corespunzător, astfel încât să puteți vedea ieșirea filtrului pe care doriți să o examinați.
Pentru a defini și aplica un filtru:
- În meniul filter, selectați o opțiune de filtrare:
- Afișați numai aplicația selectată: Afișează numai mesajele produse de codul aplicației (implicit). Logcat filtrează mesajele de jurnal utilizând PID-ul aplicației active.
- No Filters (Fără filtre): Nu aplică niciun filtru. Logcat afișează toate mesajele de jurnal de pe dispozitiv, indiferent de procesul selectat.
- Edit Filter Configuration (Editare configurare filtre): Creează sau modifică un filtru personalizat. De exemplu, ați putea crea un filtru pentru a vizualiza mesajele de jurnal de la două aplicații în același timp.
După ce ați definit filtrele, le puteți, de asemenea, selecta în meniu. Pentru a le elimina din meniu, ștergeți-le.
- Dacă ați selectat Editare configurare filtru, creați sau modificați un filtru:
- Specificați parametrii filtrului în fereastra de dialog Create New Logcat Filter:
- Filter Name (Nume filtru): Introduceți numele unui filtru pe care doriți să-l definiți sau selectați-l în panoul din stânga pentru a modifica un filtru existent. Numele poate conține numai caractere minuscule, caractere de subliniere și cifre.
- Log Tag (Etichetă jurnal): Specificați opțional o etichetă. Pentru mai multe informații, consultați Formatul mesajului logcat.
- Log Message (Mesaj de jurnal): Specificați opțional textul mesajului de jurnal. Pentru mai multe informații, a se vedea logcat Message Format.
- Package Name (Numele pachetului): Specificați opțional un nume de pachet. Pentru mai multe informații, a se vedea logcat Message Format.
- PID: Specificați în mod opțional un ID de proces. Pentru mai multe informații, consultați Logcat Message Format.
- Log Level: Selectați opțional un nivel de jurnal. Pentru mai multe informații, consultați Set the Log Level.
- Regex: Selectați această opțiune pentru a utiliza sintaxa expresiilor regulate pentru acel parametru.
- Faceți clic pe + pentru a adăuga definiția filtrului în panoul din stânga.
Pentru a elimina un filtru, selectați-l în panoul din stânga și faceți clic pe -.
- Când ați terminat, faceți clic pe OK.
- Specificați parametrii filtrului în fereastra de dialog Create New Logcat Filter:
Dacă nu credeți că vedeți mesajele de jurnal pe care le doriți, încercați să selectațiNu filtre și să căutați anumite mesaje de jurnal.
Citește mesajele de colectare a gunoiului
Când apare un eveniment de colectare a gunoiului, uneori acestea sunt tipărite în logcat.
Pentru mai multe detalii despre memoria aplicației dumneavoastră, utilizațiMemory Profiler.
Mesaje de jurnal Dalvik
În Dalvik (dar nu și în ART), fiecare GC tipărește următoarele informații în logcat:
D/dalvikvm(PID): GC_Reason Amount_freed, Heap_stats, External_memory_stats, Pause_time
Exemplu:
D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/9991K, external 4703K/5261K, paused 2ms+2ms
GC Reason Ce a declanșat GC și ce fel de colectare este. Motivele care pot apăreainclud:GC_CONCURRENT
Un GC concurent care eliberează memorie pe măsură ce heap-ul începe să se umple.GC_FOR_MALLOC
Un GC a fost cauzat deoarece aplicația dvs. a încercat să aloce memorie când heap-ul era deja plin, astfel încât sistemul a trebuit să oprească aplicația dvs. și să recupereze memoria.GC_HPROF_DUMP_HEAP
Un GC care se produce atunci când solicitați crearea unui fișier HPROF pentru a vă analiza heap-ul.GC_EXPLICIT
Un GC explicit, cum ar fi atunci când apelațigc()
(pe care ar trebui să evitați să îl apelați și, în schimb, să aveți încredere că GC se va executa atunci când este necesar).GC_EXTERNAL_ALLOC
Acest lucru se întâmplă numai la nivelul API 10 și inferior (versiunile mai noi alocă totul în Dalvikheap). Un GC pentru memoria alocată din exterior (cum ar fi datele pixelilor stocate în memoria innativă sau tampoanele de octeți NIO). Amount freed (Cantitatea eliberată) Cantitatea de memorie recuperată din acest GC. Heap stats Procentul liber din heap și (numărul de obiecte active)/(dimensiunea totală a heap-ului). External memory stats Memorie externă Memorie alocată extern la nivelul API 10 și inferior (cantitatea de memorie alocată) / (limita la care va avea loc colectarea). Timp de pauză Heap-uri mai mari vor avea timpi de pauză mai mari. Timpii de pauză concomitenți arată două pauze: una la începutul colectării și alta aproape de sfârșit.
În timp ce aceste mesaje de jurnal se acumulează, urmăriți creșterile în statisticile heap (valoarea3571K/9991K
în exemplul de mai sus). Dacă această valoare continuă să crească, este posibil să aveți o scurgere de memorie.
Mesaje de jurnalART
În comparație cu Dalvik, ART nu înregistrează mesaje pentru GC care nu au fost solicitate în mod explicit. GC-urile sunt tipărite doar atunci când sunt considerate lente. Mai exact, dacă pauza GC depășește 5ms sau dacă durata GC depășește 100ms. Dacă aplicația nu se află într-o stare de pauză perceptibilă (cum ar fi atunci când aplicația se află în fundal, unde utilizatorul nu poate percepe o pauză GC), atunci niciunul dintre GC-urile sale nu este considerat lent. GC-urile explicite sunt întotdeauna consemnate.
ART include următoarele informații în mesajele sale de jurnal de colectare a gunoiului:
I/art: GC_Reason GC_Name Objects_freed(Size_freed) AllocSpace Objects, Large_objects_freed(Large_object_size_freed) Heap_stats LOS objects, Pause_time(s)
Exemplu:
I/art : Explicit concurrent mark sweep GC freed 104710(7MB) AllocSpace objects, 21(416KB) LOS objects, 33% free, 25MB/38MB, paused 1.230ms total 67.216ms
GC Reason Ce a declanșat GC-ul și ce tip de colectare este. Motivele care pot apăreainclud:Concurrent
Un GC concurent care nu suspendă firele aplicației. Acest GC se execută într-un fir de fundalși nu împiedică alocările.Alloc
GC a fost inițiat deoarece aplicația dumneavoastră a încercat să aloce memorie când heap-ul era deja plin. În acest caz, colectarea de gunoi a avut loc în firul de alocare.Explicit
Colectarea gunoiului a fost solicitată în mod explicit de către o aplicație, de exemplu, prin apelareagc()
saugc()
. La fel ca în Dalvik, în ART, cea mai bună practică este să aveți încredere în GC și să evitați, dacă este posibil, să solicitați GC explicite.GC explicite sunt descurajate deoarece acestea blochează firul de alocare și irosesc în mod inutil ciclurile CPU. GC-urile explicite ar putea, de asemenea, să provoace jank (bâlbâială, tremurături sau opriri ale aplicației) dacă fac ca alte fire să fie preemptate.NativeAlloc
Colectarea a fost cauzată de presiunea de memorie nativă din alocări native, cum ar fi Bitmaps sau obiecte de alocareRenderScript.CollectorTransition
Colectarea a fost cauzată de o tranziție de heap; aceasta este cauzată de schimbarea strategiei GC în timpul execuției (cum ar fi atunci când aplicația trece de la o stare sensibilă la pauză la alta). Tranzițiile colectorului constau în copierea tuturor obiectelor dintr-un spațiu susținut de o listă liberă într-un spațiu cu pointer de cuceriri (sau invers).
Acest lucru apare numai pe un dispozitiv cu memorie RAM redusă înainte de Android 8.0când o aplicație schimbă stările de proces de la o stare perceptibilă de pauză (cum ar fi atunci când aplicația este în prim-plan, unde utilizatorul poate percepe o pauză GC) la o stare neperceptibilă de pauză (sau invers.
HomogeneousSpaceCompact
Compactarea spațială omogenă este o compactare de la un spațiu cu listă liberă la un spațiu cu listă liberă, care de obicei are loc atunci când o aplicație este mutată într-o stare de proces imperceptibilă de pauză. Principalele motive pentru a face acest lucru sunt reducerea utilizării RAM și defragmentarea heap-ului.
DisableMovingGc
Acesta nu este un motiv GC real, ci o notă că colectarea a fost blocată din cauza utilizării funcțieiGetPrimitiveArrayCritical. în timp ce are loc compactarea concomitentă a heap-ului. În general, utilizarea luiGetPrimitiveArrayCritical este puternic descurajată din cauza restricțiilor sale privind deplasarea colectorilor.HeapTrim
Acesta nu este un motiv GC, ci o notă că colectarea a fost blocată până la terminarea unei garnituri de heap. GC Name ART are diverse GC-uri diferite care pot fi rulate.Concurrent mark sweep (CMS)
Un colector al întregului heap care eliberează colectează toate spațiile altele decât spațiul imaginii.Concurrent partial mark sweep
Un colector de heap în mare parte întreg care colectează toate spațiile în afară de spațiile imagine și zigot.Concurrent sticky mark sweep
Un colector generațional care poate elibera numai obiectele alocate de la ultimul GC. Acest colector de gunoaie este rulat mai des decât o curățare completă sau parțială a marcajului, deoarece este mai rapid și are pauze mai mici.Marksweep + semispace
Un GC necompetitiv, cu copiere, utilizat pentru tranzițiile de heap, precum și pentru compactarea omogenă a spațiilor (pentru defragmentarea heap-ului). Obiecte eliberate Numărul de obiecte care au fost recuperate în urma acestui GC din spațiul fără obiecte mari. Dimensiune eliberată Numărul de octeți care au fost recuperați de acest GC din spațiul obiectelor care nu este mare. Obiecte mari eliberate Numărul de obiecte din spațiul de obiecte mari care au fost recuperate din această colecție de gunoi. Large object size freed (Dimensiunea obiectelor mari eliberate) Numărul de octeți din spațiul obiectelor mari care au fost recuperați din această colecție de gunoaie. Statisticile Heap Procentul liber și (numărul de obiecte active)/(dimensiunea totală a heap-ului). Timpii de pauză În general, timpii de pauză sunt proporționali cu numărul de referințe la obiecte care au fost modificate în timpul funcționării GC. În prezent, GC-urile ART CMS au doar o singură pauză, aproape de sfârșitul GC-ului.GC-urile în mișcare au o pauză lungă care durează cea mai mare parte a duratei GC.
Dacă vedeți o cantitate mare de GC-uri în logcat, căutați creșteri în statisticile heap (valoarea25MB/38MB
în exemplul de mai sus). Dacă această valoare continuă să crească și nu pare niciodată să se micșoreze, este posibil să aveți o scurgere de memorie. Alternativ, dacă vedeți GC care au ca motiv „Alloc”, atunci deja operați aproape de capacitatea heap-ului și vă puteți aștepta la excepțiiOOM în viitorul apropiat.