Naplók írása és megtekintése a Logcat segítségével

A Logcat ablak az Android Studio-ban megjeleníti a rendszerüzeneteket, például amikor garbagecollection történik, valamint az alkalmazáshoz a Log osztállyal hozzáadott üzeneteket. Az üzeneteket valós időben jeleníti meg, és előzményeket tárol, így a régebbi üzeneteket is megtekintheti.

Az érdeklődésre számot tartó információk megjelenítéséhez szűrőket hozhat létre, módosíthatja, hogy mennyi információ jelenjen meg az üzenetekben, prioritási szinteket állíthat be, csak az alkalmazás kódja által előállított üzeneteket jelenítheti meg, és kereshet a naplóban. Alapértelmezés szerint a logcats csak a legutóbb futtatott alkalmazással kapcsolatos naplókimenetet jeleníti meg.

Ha egy alkalmazás kivételt dob, a logcat megjelenít egy üzenetet, amelyet a kapcsolódó stack trace követ, amely a kódsorra mutató hivatkozásokat tartalmaz.

Az Android Studio 2.2 óta a Run ablak az aktuálisan futó alkalmazás naplóüzeneteit is megjeleníti. Vegye figyelembe, hogy a logcat kimenet megjelenítését konfigurálhatja, de a Runablakot nem.

Az alkalmazás naplóinak megtekintése

Az alkalmazás naplóüzeneteinek megjelenítése:

  1. Építse meg és futtassa az alkalmazást egy eszközön.
  2. Kattintson a Nézet > Eszközablakok > Logcat (vagy kattintson a Logcat gombra az eszközablak sávjában).

A Logcat ablak a kiválasztott alkalmazás naplóüzeneteit mutatja, az ablak tetején található legördülő listákból kiválasztva, ahogy az az 1. ábrán látható.

1. ábra. Logcat ablak

Alapértelmezés szerint a logcat csak az eszközön futó alkalmazás naplóüzeneteit jeleníti meg. Ennek az alapértelmezésnek a megváltoztatásához lásd a logcat üzenetek szűrése.

A Logcat eszköztár a következő gombokat tartalmazza:

  1. Clear logcat : Kattintson erre a gombra a látható napló törléséhez.
  2. Lapozzon a végére : Erre a gombra kattintva a napló aljára ugorhat, és megtekintheti a legutóbbi naplóüzeneteket. Ha ezután a napló egy sorára kattint, a nézet megszakítja a görgetést az adott ponton.
  3. Felfelé a veremkövetés és Lefelé a veremkövetés : Kattintson a gombra a naplóban a veremnyomok felfelé és lefelé történő navigálásához, kiválasztva az egymást követő fájlneveket (és megtekintve a megfelelő sorszámokat a szerkesztőben), amelyek a nyomtatott kivételekben jelennek meg. Ez ugyanaz a viselkedés, mint amikor a naplóban egy fájlnévre kattint.
  4. Soft wraps használata : Kattintson erre a gombra a sortörés engedélyezéséhez és a vízszintes görgetés megakadályozásához (bár a nem törhető karakterláncok továbbra is vízszintes görgetést igényelnek).
  5. Nyomtatás : Kattintson erre a gombra a logcat üzenetek kinyomtatásához. Miután a megjelenő párbeszédpanelen kiválasztotta a nyomtatási beállításokat, választhatja a PDF-be mentést is.
  6. Újraindítás : Kattintson erre a gombra a napló törléséhez és a logcat újraindításához. A Clear logcat gombbal ellentétben ez visszaállítja és megjeleníti a korábbi naplóüzeneteket, így leginkább akkor hasznos, ha a Logcat nem reagál, és nem szeretné elveszíteni a naplóüzeneteket.
  7. Logcat fejléc : Erre a gombra kattintva megnyílik a Configure Logcat Header párbeszédpanel, ahol testre szabhatja az egyes logcat üzenetek megjelenését, például azt, hogy megjelenjen-e a dátum és az idő.
  8. Screen capture : Kattintson erre a gombra a képernyőkép készítéséhez.
  9. Képernyőfelvétel : Kattintson a gombra, ha videót szeretne rögzíteni az eszközről (legfeljebb 3 percig).

Naplóüzenetek írása

A Log osztály lehetővé teszi a logcatben megjelenő naplóüzenetek létrehozását. Általában a következő naplózási módszereket érdemes használni, a legmagasabb prioritástól a legalacsonyabb prioritásig (vagy a legkevésbé bőbeszédűtől a legbővebbig) terjedő sorrendben:

  • 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)

A lehetőségek teljesebb listáját lásd a Log osztály leírásában.

Soha nem szabad verbose naplókat fordítania az alkalmazásába, kivéve a fejlesztés során. A hibakeresési naplók be vannak fordítva, de futáskor eltávolításra kerülnek, míg a hiba,figyelmeztetés és info naplók mindig megmaradnak.

Minden naplózási módszer első paramétere egy egyedi címke kell, hogy legyen, a második paraméter pedig az üzenet. A rendszer naplóüzenetének címkéje egy rövid karakterlánc, amely azt a rendszerkomponenst jelzi, ahonnan az üzenet származik (például ActivityManager). A tag lehet bármilyen hasznosnak ítélt karakterlánc, például az aktuális osztály neve.

A jó konvenció az, ha az osztályban deklarálunk egy TAG állandót, amelyet az első paraméterben használunk. Például létrehozhat egy információs naplóüzenetet a következőképpen:

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);

Figyelem: A 23 karakternél hosszabb címkék nevei a logcat kimeneténél le lesznek vágva.

Logcat üzenetformátum

Minden Android naplóüzenethez tartozik egy címke és egy prioritás. A rendszer naplóüzenetének címkéje egy rövid karakterlánc, amely azt a rendszerkomponenst jelzi, ahonnan az üzenet származik (például ActivityManager). A felhasználó által definiált tag lehet bármilyen hasznosnak ítélt karakterlánc, például az aktuális osztály neve (az ajánlott tag). Egy Log metódushívásban definiálja, például:

Kotlin

Log.d(tag, message)

Java

Log.d(tag, message);

A prioritás a következő értékek egyike:

  • V: Verbose (legalacsonyabb prioritás)
  • D: Debug
  • I: Info
  • W: Warning
  • E: Error
  • A: Assert

A naplóüzenet formátuma:

date time PID-TID/package priority/tag: message

Például a következő naplóüzenet prioritása V és címkéje AuthZen:

12-10 13:02:50.071 1901-4229/com.google.android.gms V/AuthZen: Handling delegate intent.

A PID a folyamatazonosító, a TID pedig a szálazonosító; ezek azonosak lehetnek, ha csak egy szál van.

Naplózási szint beállítása

A naplózási szint beállításával szabályozhatja, hogy hány üzenet jelenjen meg a logcatben. Megjelenítheti az összes üzenetet, vagy csak a legsúlyosabb állapotokat jelző üzeneteket.

Ne feledje, hogy a logcat a naplószint beállításától függetlenül továbbra is minden üzenetet összegyűjt. A beállítás csak azt határozza meg, hogy a logcat mit jelenítsen meg.

A Naplózási szint menüben válassza ki a következő értékek egyikét:

  • Verbose: Az összes naplóüzenet megjelenítése (alapértelmezett).
  • Debug: A hibakeresési naplóüzenetek megjelenítése, amelyek csak a fejlesztés során hasznosak, valamint a listában lejjebb található üzenetszintek.
  • Info: A rendszeres használat során várható naplóüzenetek, valamint az ebben a listában alacsonyabb szintű üzenetek megjelenítése.
  • Warn: A lehetséges problémák megjelenítése, amelyek még nem hibák, valamint az ebben a listában alacsonyabb üzenetszintek.
  • Hiba: Olyan problémák megjelenítése, amelyek hibát okoztak, valamint az ebben a listában alacsonyabb üzenetszintek.
  • Assert: Olyan problémák megjelenítése, amelyek a fejlesztő elvárása szerint soha nem fordulhatnak elő.

Logcat üzenetek keresése

A logcatben jelenleg megjelenített üzenetek keresése:

  1. Előre választhatja a Regex lehetőséget, ha reguláris kifejezéses keresési mintát szeretne használni.
  2. Írjon be egy karaktersorozatot a keresőmezőbe .

    A logcat kimeneti kijelzője ennek megfelelően változik.

  3. Nyomja meg az Entert a keresési karakterlánc tárolásához a menüben ebben a munkamenetben.
  4. A keresés megismétléséhez válassza ki a keresés menüből. Válassza ki vagy szüntesse meg a Regex jelölést szükség szerint (a beállítás nem marad meg a memóriában).

Logcat üzenetek szűrése

A napló kimenetének kezelhető szintre csökkentésének egyik módja, ha szűrővel korlátozza azt.

Megjegyzés: A szűrő a teljes logcat előzményekre vonatkozik, nem csak a logcat-ben jelenleg megjelenő üzenetekre. Győződjön meg róla, hogy az egyéb megjelenítési beállítások megfelelően vannak beállítva, hogy láthassa a szűrő által vizsgálni kívánt kimenetet.

Szűrő definiálása és alkalmazása:

  1. A szűrő menüben válasszon ki egy szűrési lehetőséget:
    • Csak a kiválasztott alkalmazás megjelenítése: Csak az alkalmazás kódja által előállított üzenetek megjelenítése (alapértelmezett). A Logcat az aktív alkalmazás PID-je alapján szűri a naplóüzeneteket.
    • Nincsenek szűrők: Nem alkalmaz szűrőket. A Logcat megjeleníti az eszköz összes naplóüzenetét, függetlenül attól, hogy melyik folyamatot választotta ki.
    • Szűrőkonfiguráció szerkesztése: Egyéni szűrő létrehozása vagy módosítása. Létrehozhat például olyan szűrőt, amely egyszerre két alkalmazás naplóüzeneteit jeleníti meg.

    A szűrők definiálása után a menüben is kiválaszthatja őket. A menüből való eltávolításukhoz törölje őket.

  2. Ha a Szűrőkonfiguráció szerkesztése lehetőséget választotta, hozzon létre vagy módosítson egy szűrőt:
    1. Adja meg a szűrő paramétereit az Új Logcat szűrő létrehozása párbeszédpanelen:
      • Szűrő neve: Írja be a definiálni kívánt szűrő nevét, vagy válassza ki a bal oldali ablaktáblában egy meglévő szűrő módosításához. A név csak kisbetűket, aláhúzásokat és számjegyeket tartalmazhat.
      • Naplócímke: Opcionálisan megadhat egy címkét. További információért lásd: logcat üzenetformátum.
      • Naplóüzenet: Választhatóan adja meg a naplóüzenet szövegét. További információért lásd: logcat Message Format.
      • Csomag neve: Opcionálisan megadhatja a csomag nevét. További információért lásd: logcat Message Format.
      • PID: Opcionálisan megadhatja a folyamat azonosítóját. További információért lásd: logcat Message Format.
      • Naplózási szint: Opcionálisan megadhatja a naplózási szintet. További információért lásd: Naplószint beállítása.
      • Regex: Válassza ezt az opciót, ha az adott paraméterhez reguláris kifejezés szintaxist szeretne használni.
    2. Kattintson a + gombra a szűrődefiníció bal oldali ablaktáblához való hozzáadásához.

      A szűrő eltávolításához jelölje ki a bal oldali ablaktáblában, majd kattintson a – gombra.

    3. Ha végzett, kattintson az OK gombra.

Ha úgy gondolja, hogy nem látja a kívánt naplóüzeneteket, próbálja meg aNem szűrők kiválasztását és az adott naplóüzenetek keresését.

Semétgyűjtési üzenetek olvasása

Néha, amikor szemétgyűjtési esemény történik, ezek kiíródnak a logcat-be.

Az alkalmazás memóriájának részletesebb megismeréséhez használja aMemory Profiler-t.

Dalvik naplóüzenetek

A Dalvikben (de nem az ART-ben) minden GC a következő információkat nyomtatja ki a logcat-be:

D/dalvikvm(PID): GC_Reason Amount_freed, Heap_stats, External_memory_stats, Pause_time

Példa:

D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/9991K, external 4703K/5261K, paused 2ms+2ms

GC oka Mi váltotta ki a GC-t és milyen típusú gyűjtésről van szó. A megjelenő okok a következők lehetnek:GC_CONCURRENTEgyidejű GC, amely memóriát szabadít fel, amikor a heap kezd megtelni.GC_FOR_MALLOCA GC-t az okozta, hogy az alkalmazás memóriát próbált kiosztani, amikor a heap már tele volt, így a rendszernek le kellett állítania az alkalmazást és visszaszerezni a memóriát.GC_HPROF_DUMP_HEAPGC, amely akkor keletkezett, amikor HPROF fájl létrehozását kérte a heap elemzésére.GC_EXPLICITEgy explicit GC, például amikor meghívja agc()-t (amit kerülnie kell, és inkább bízzon a GC-ben, hogy lefut, amikor szükséges).GC_EXTERNAL_ALLOCEz csak a 10-es és alacsonyabb API szinten történik (az újabb verziók mindent a Dalvikheapben allokálnak). A GC a külsőleg allokált memóriához (például a pixeladatok tárolt innatív memóriához vagy a NIO bájtpufferekhez). Amount freed Az ebből a GC-ből visszanyert memória mennyisége. Heap-statisztikák A heap szabad százalékos aránya és (az élő objektumok száma)/(a teljes heap mérete). Külső memória statisztikák Külsőleg kiosztott memória a 10-es vagy alacsonyabb API-szinten (a kiosztott memória mennyisége) / (határérték, amelynél a gyűjtés megtörténik). Szünetidő A nagyobb halmok nagyobb szünetidővel rendelkeznek. Az egyidejű szünetidők két szünetet mutatnak: egyet a gyűjtés kezdetén, egyet pedig a végén.

Amíg ezek a naplóüzenetek gyűlnek, figyeljünk a halomstatisztikák növekedésére (a fenti példában a3571K/9991K érték). Ha ez az érték tovább növekszik, akkor lehet, hogy memóriaszivárgás van.

ART naplóüzenetek

A Dalvikkal ellentétben az ART nem naplózza a nem kifejezetten kért GC-ket. A GC-ket csak akkor nyomtatja ki, ha lassúnak ítélik őket. Pontosabban, ha a GC szünet meghaladja az 5ms-t vagya GC időtartama meghaladja a 100ms-t. Ha az alkalmazás nincs szünetet érzékelhető állapotban (például amikor az alkalmazás a háttérben van, ahol a felhasználó nem érzékelheti a GC-szünetet), akkor egyik GC sem minősül lassúnak. Az explicit GC-k mindig naplózásra kerülnek.

AART a következő információkat tartalmazza a szemétgyűjtési naplóüzenetekben:

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)

Példa:

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 oka Mi váltotta ki a GC-t és milyen típusú gyűjtésről van szó. A megjelenő okok a következők lehetnek:ConcurrentEgyidejű GC, amely nem függeszti fel az alkalmazás szálait. Ez a GC egy háttérszálban fut és nem akadályozza meg a kiosztásokat.AllocA GC azért indult, mert az alkalmazás memóriát próbált kiosztani, amikor a heap már tele volt. Ebben az esetben a szemétgyűjtés a kiosztó szálban történt.ExplicitA szemétgyűjtést kifejezetten egy alkalmazás kérte, például agc()vagygc()hívásával. A Dalvikhoz hasonlóan az ART-ben is az a legjobb gyakorlat, hogy bízzunk a GC-ben, és lehetőség szerint kerüljük az explicit GC-kérést.Az explicit GC-ket nem javasoljuk, mert blokkolják az allokáló szálat, és szükségtelenül pazarolják a CPU-ciklusokat. Az explicit GC-k jank-et is okozhatnak (dadogás, rázkódás vagy leállás az alkalmazásban), ha más szálaknak előnyt jelentenek.NativeAllocA gyűjtést a natív allokációk, például a Bitmaps vagy aRenderScript allokációs objektumok által okozott natív memórianyomás okozta.CollectorTransitionA gyűjtést egy heap átmenet okozta; ezt a GC-stratégia futási időben történő megváltoztatása okozza (például amikor az alkalmazás szünetérzékeny állapotok között változik). A gyűjtőátmenetek abból állnak, hogy az összes objektumot egy szabadlistával támogatott térből egy bump pointer térbe (vagy fordítva) másolják.

Ez csak az Android 8 előtti alacsony RAM-ú eszközön fordul elő.0mikor egy alkalmazás folyamatállapotot változtat egy szünetérzékelhető állapotból (például amikor az alkalmazás előtérben van, ahol a felhasználó érzékelheti a GC szünetet) egy nem szünetérzékelhető állapotba (vagy fordítva).

HomogeneousSpaceCompactA homogén térsűrítés szabadlistás térről szabadlistás térre történő tömörítés, ami általában akkor történik, amikor egy alkalmazás szünetérzékelhetetlen folyamatállapotba kerül. Ennek fő okai a RAM-használat csökkentése és a halom defragmentálása.DisableMovingGcEz nem egy valódi GC ok, hanem egy megjegyzés, hogy a gyűjtés blokkolva volt aGetPrimitiveArrayCritical használata miatt. miközben párhuzamos heap tömörítés történik. Általában aGetPrimitiveArrayCritical használata erősen nem javasolt a gyűjtők mozgatására vonatkozó korlátozások miatt.HeapTrimEz nem GC ok, hanem egy megjegyzés, hogy a gyűjtés blokkolva volt, amíg egy halomtömörítés befejeződött. GC Name Az ART-nek különböző GC-jei vannak, amelyek lefuthatnak.Concurrent mark sweep (CMS)A teljes heap gyűjtő, amely felszabadítja a képterületen kívüli összes helyet összegyűjti.Concurrent partial mark sweepEgy többnyire teljes heap gyűjtő, amely az image és a zygote tereken kívül minden más teret összegyűjt.Concurrent sticky mark sweepEgy generációs gyűjtő, amely csak az utolsó GC óta allokált objektumokat tudja felszabadítani. Ezt a szemétgyűjtőt gyakrabban futtatjuk, mint a teljes vagy részleges jelöléssöprést, mivel gyorsabb és kisebb szünetekkel jár.Marksweep + semispaceEgy nem egyidejű, másoló GC, amelyet a halom átmenetekre, valamint homogén térkompakcióra (a halom defragmentálására) használnak. Objects freed Azoknak az objektumoknak a száma, amelyeket ez a GC visszaszerzett a nem nagyobjektum-térből. Size freed Azon bájtok száma, amelyeket ebből a GC-ből a nem nagy objektumtérből visszanyertek. Large objects freed A nagy objektumtartományban lévő objektumok száma, amelyeket ebből a szemétgyűjteményből visszaszereztek. Large object size freed A nagy objektumtartományban lévő bájtok száma, amelyeket ebből a garbagecollectionből visszanyertek. Heap-statisztikák Szabad és (élő objektumok száma)/(teljes heapméret) százalékos aránya. Szünetidők Általában a szünetidők arányosak a GC futása közben módosított objektumreferenciák számával. Jelenleg az ART CMS GC-knek csak egy szünete van, a GC vége felé.A mozgó GC-knek hosszú szünete van, amely a GC időtartamának nagy részében tart.

Ha nagy mennyiségű GC-t lát a logcatben, keresse a heap-statisztikák növekedését (a fenti példában a25MB/38MB értéket). Ha ez az érték folyamatosan növekszik, és nem tűnik úgy, hogy csökkenne, akkor memóriaszivárgás lehet. Alternatívaként, ha “Alloc” okból GC-t lát, akkor már a heap kapacitásának közelében dolgozik, és a közeljövőbenOOM kivételekre számíthat.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.