A Logcat — egy Android SDK eszköz a rendszerüzenetek és alkalmazásnaplók valós idejű megtekintéséhez, amely ADB-n vagy az Android Studio beépített konzolján keresztül érhető el. A Android Developers szerint a Logcat összegyűjti az összes rendszerfolyamat üzeneteit, fontossági szintek és címkék szerint szűri őket, és lehetővé teszi a fejlesztő számára a hibák diagnosztizálását, a kód végrehajtásának nyomon követését és a teljesítmény elemzését. Logcat — az Android-alkalmazások hibakeresésének fő információforrása.
Főbb pontok
Logcat — az Android rendszerpuffere, amelybe az összes folyamat (beleértve a Linux kernelt, a system_server-t és az alkalmazásokat) meghatározott formátumú üzeneteket ír. A logcat eszköz, amely az Android SDK részét képezi, beolvassa ezt a puffert és valós időben jeleníti meg az üzeneteket. Az Android 4.1 (API 16) óta a Logcat-hoz való hozzáférés korlátozott: az alkalmazások csak saját naplóikat olvashatják, a rendszernaplók pedig ADB-n keresztül debug hozzáféréssel érhetők el.
Minden Logcat üzenet öt mezőt tartalmaz: dátum és idő, PID (folyamatazonosító), TID (szálazonosító), naplózási szint és címke. A formátum rögzített és minden Android-verzióban azonos. Ez lehetővé teszi a grep, awk és sed eszközök használatát a naplók szűrésére CI/CD folyamatokban IDE-függőség nélkül.
A naplók egy rögzített méretű körpufferben tárolódnak: 256 KB a main, 256 KB a system és 256 KB az events számára (Android 5+). A puffer túlcsordulásakor a régi üzenetek törlődnek. A fejlesztő megváltoztathatja a puffer méretét a PROP logcat.size segítségével vagy az eszköz fejlesztői beállításaiban.
Hat szint határozza meg az üzenet fontosságát. Az Android a többi platformhoz hasonló szabványos szinteket használ, de saját konstansnevekkel a Log osztályban. A megfelelő szint kiválasztása segít a naplók hatékony szűrésében és megakadályozza, hogy a kritikus üzenetek elvesszenek a másodlagosak között.
| Szint | Konstans | Rendeltetés | Alapértelmezésben látható |
|---|---|---|---|
| VERBOSE | Log.v | Maximálisan részletes hibakeresési információ | Nem |
| DEBUG | Log.d | Hibakeresési üzenetek a fejlesztő számára | Nem |
| INFO | Log.i | Tájékoztató üzenetek az alkalmazás működéséről | Igen |
| WARN | Log.w | Figyelmeztetések lehetséges problémákról | Igen |
| ERROR | Log.e | Kritikus hibák és kivételek | Igen |
| ASSERT | Log.wtf | Olyan hibák, amelyek elvileg nem fordulhatnak elő | Igen |
Címke (tag) — legfeljebb 23 karakterből álló sztring, amely azonosítja az üzenet forrását. Javasolt az osztály vagy modul nevének használata címkeként: MainActivity, AuthManager, NetworkModule. Ez lehetővé teszi a naplók szűrését az alkalmazás egy adott összetevője szerint. A csapat egységessége érdekében létrehozhatók címkekonstansok egy külön fájlban, vagy használható a Timber könyvtár, amely automatikusan beállítja a címkét az osztály neve alapján.
Kezeletlen kivétel esetén az Android maga írja a Logcat-ba a teljes stack trace-t az osztály, metódus, kódsor és hívási lánc feltüntetésével. Az összeomlási napló tartalmazza a kivétel típusát (NullPointerException, RuntimeException), az üzenetet és a hívások sorrendjét az összeomlás pontjától az alkalmazás belépési pontjáig. A felhasználói eszközökről származó összeomlási naplók elemzéséhez a Firebase Crashlytics használatos, amely szinkronizálja a stack trace-t az obfuszkációs térképpel (mapping.txt Android esetén).
Az Android Studio grafikus Logcat felületet biztosít, amely a View → Tool Windows → Logcat (Alt + 6) menüponton keresztül érhető el. A Logcat ablak valós időben frissül, megjeleníti a csatlakoztatott eszköz összes üzenetét, és lehetővé teszi rugalmas szűrők konfigurálását a szükséges információk általános folyamból való kiemeléséhez.
A Log Level legördülő lista a minimális szint szerint szűri az üzeneteket: válassza a WARN lehetőséget, hogy csak a figyelmeztetéseket és hibákat lássa, elrejtve a VERBOSE, DEBUG és INFO szinteket. A Search mező lehetővé teszi a keresést üzenetszöveg vagy címke alapján — támogatja a regex-et, ami kényelmes a minták szerinti üzenetkereséshez.
Saved Filters — a Logcat erőteljes funkciója az Android Studio-ban. Létrehozhat olyan szűrőt, amely csak az alkalmazása címkéjével (tag:MyApp) és WARN+ szinttel rendelkező üzeneteket jeleníti meg. A szűrők a munkamenetek között megmaradnak, és a legördülő listából érhetők el. Több modulos projektekhez hozzon létre külön szűrőt minden modulhoz.
# Példa kifejezés az alkalmazásnaplók szűrésére
tag:"MyApp" level:WARN # Csak WARN+ a MyApp számára
package:"com.mycompany" # A csomag összes naplója
-tag:"okhttp" # OkHttp naplók kizárása
A Logcat naplók exportálhatók szöveges fájlba a Save to File ikon segítségével. Ez hasznos a Jira jegyekhez való csatoláshoz vagy hosszú munkamenetek elemzéséhez. Az exportált napló bármely szövegszerkesztőben megnyitható, és grep alkalmazható a minták keresésére. Formázott megjelenítéshez használja a logcat-color eszközt.
ADB logcat — a Logcat konzolos változata, amely az Android Debug Bridge-en keresztül érhető el. Fő előnye, hogy futtatható CI-kiszolgálókon, automatizálási szkriptekben és Android Studio nélküli eszközökön. Az ADB logcat ugyanazokat a szűrőket támogatja, mint a GUI, de a parancssor rugalmasságával.
Az adb logcat parancs argumentumok nélkül a teljes puffert jeleníti meg valós időben. A leállításhoz használja a Ctrl+C billentyűkombinációt. A -c kapcsoló törli a puffert a rögzítés megkezdése előtt — ez akkor hasznos, ha az aktuális teszt naplóit el kell különíteni a korábbi üzenetektől. A -b kapcsoló kiválasztja a puffer típusát: main, system, events, crash (Android 12+).
# Puffer törlése és naplózás indítása MyApp címkével
adb logcat -c
adb logcat MyApp:D *:S
# Naplók mentése fájlba
adb logcat -d > logcat_dump.txt
# Szűrés a folyamat PID-je szerint
adb logcat --pid=12345
Az ADB unix eszközökkel való kombinációja maximális rugalmasságot biztosít. Például a "*:S TAG:D" szűrő csak a TAG címkével rendelkező, DEBUG szintű és magasabb üzeneteket jeleníti meg, az összes többit elrejtve. Csak Exception megtekintéséhez használja a grep -i exception parancsot. A hibagyakoriság elemzéséhez alkalmazza a sort | uniq -c parancsot a címke oszlopon.
CI-kiszolgálókon a Logcat-ot az UI tesztek futtatása során történő diagnosztikai adatok gyűjtésére használják. Tipikus folyamat: a tesztek elindítása előtt a puffer törlődik, a tesztek végrehajtása után a naplók dumpja build-összetevőként kerül mentésre. Ha egy teszt sikertelen, a naplók alapján meghatározható, hogy a hibát ANR, kezeletlen kivétel vagy hálózati időtúllépés okozta-e.
Az android.util.Log osztály — a beépített API az üzenetek Logcat-ba írásához. A Log.v, Log.d, Log.i, Log.w, Log.e és Log.wtf egy címkét (sztring) és egy üzenetet (sztring) vagy üzenetet + Throwable-t fogad. Az üzenetek formázásához használja a String.format vagy Kotlin String templates módszert — kerülje a sztringek összefűzését, ami extra objektumokat hoz létre a heap-en.
Timber — Jake Wharton népszerű könyvtára, amely kiküszöböli a beépített Log API hiányosságait. A Timber automatikusan beállítja a címkét a naplózást meghívó osztály neve alapján, és nem igényli a címke átadását minden egyes hívásnál. A Timber támogatja a feltételes naplózást is: Release buildben a Timber.v és Timber.d hívások egyetlen sorral kikapcsolhatók az Application.onCreate-ban.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Beépített Log API
Log.d("MainActivity", "onCreate called")
// Timber — automatikus címke az osztály neve alapján
Timber.d("onCreate called")
}
private fun loadData() {
try {
val result = fetchFromNetwork()
Timber.i("Data loaded: $result")
} catch (e: IOException) {
Timber.e(e, "Failed to load data")
}
}
}
Release buildben ajánlott kikapcsolni a VERBOSE és DEBUG naplókat a Logcat puffer terhelésének csökkentése és az érzékeny információk kiszivárgásának megakadályozása érdekében. A Timber ezt a feladatot a PlantingTree-n keresztül oldja meg: a Debug flavorban DebugTree (mindent naplóz), a Release-ben CrashReportingTree (csak ERROR-t naplóz a Crashlytics-en keresztül) kerül ültetésre. A beépített Log API nem támogatja a feltételes naplózást — a fejlesztőnek minden hívást be kell csomagolnia if (BuildConfig.DEBUG) blokkba.
Gyakran Ismételt Kérdések
Használja az adb logcat -c parancsot a teszt futtatása előtt. Alternatívaként az Android Studio-ban kattintson a Clear Logcat gombra (kuka) a Logcat ablakban. A törlés nem befolyásolja más folyamatok rendszerpuffereit, csak az aktuális kapcsolatot.
Hajtsa végre az adb logcat -G 2M parancsot a puffer 2 MB-ra növeléséhez. A maximális méret az eszköztől függ: Android 10+ esetén akár 16 MB is elérhető. A változás az eszköz újraindításáig marad meg. Állandó beállításhoz használja a build.prop fájlt a device tree-ben.
Lehetséges okok: az alkalmazás Release módban fut (a Timber.v/d naplók ki vannak kapcsolva), a Logcat szűrő elrejti a szükséges szintet, vagy rossz eszközhöz csatlakozott. Ellenőrizze azt is, hogy az Android Studio-ban az alkalmazás folyamat van kiválasztva, nem a system_process.
Keresse meg a sort FATAL EXCEPTION szöveggel, amely alatt a teljes stack trace található. Az első sor tartalmazza a kivétel típusát és az üzenetet, a következő sorok a hívási láncot a fájl és kódsor megjelölésével. Használja a grep "FATAL EXCEPTION" parancsot a gyors kereséshez az összes napló között.
ANR (Application Not Responding) — olyan helyzet, amikor a fő szál (UI thread) több mint 5 másodpercre blokkolva van. A Logcat-ban az ANR ActivityManager címkével és "ANR in ..." szöveggel jelenik meg, az összes szál stack trace-jével együtt. Használja a tag:ActivityManager level:ERROR szűrőt.
Összefoglaló
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is