Loggen mit Android [] (Loggen mit Android), Lektion, Seite 723400
https://www.purl.org/stefan_ram/pub/loggen_android (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
Android-Entwicklung

Das Logbuch (Aufzeichnungen) unter Android 

Um einen Text mit einem Android -Programm auszugebene, kann das gewohnte »java.lang.System.out.println« nicht  ohne weiteres verwendet werden. Statt dessen sind Aufrufe des Logbuch-Systems nötig, wie sie in dem folgenden Beispielprogramm gezeigt werden.

MainActivity.java
package com.example;

public final class MainActivity extends android.app.Activity
{ @java.lang.Override public final void onCreate
( final android.os.Bundle bundle )
{ super.onCreate( bundle ); android.util.Log.i( "com.example", "hello, world" ); }}
Konsole
I/com.example( 2847): hello, world

Die Kommandodatei macht das Logbuch dann mit »@START /B "" %SHELL% logcat -s AndroidRuntime:V com.example:V« für uns sichtbar. Dieses Kommando verlangt mit »"com.example:V"«,daß alle Logbuch-Aufrufe mit »com.example« angezeigt werden sollen und mit »"AndroidRuntime:V"«, daß alle Meldungen der Laufzeitumgebung angezeigt werden sollen.

Damit die Anzeige von der Skript-Datei »50_run.cmd« angezeigt wird, muß das erste Argument eines Logbuch-Aufrufs also wörtlich »com.example« lauten. (Es ist nicht möglich, noch etwas dahinterzuschreiben.)

So können während der Entwicklung eines Programms Informationen für die Entwickler ausgegeben werden.

(Eventuell sieht man auch noch Ausgaben von anderen Programmen.)

Weil das Löschen früherer Logbucheinträge nicht immer gelingt, kann es sein, daß auch ältere Logbucheinträge ausgegeben werden. Diese stehen weiter oben. Die Ausgaben können einem Programmlauf dann an Hand ihrer Uhrzeit zugeordnet werden.

Die folgende Schleife zeigt, daß die Kommandodatei auch nach Programmstart erfolgte Logbucheinträge noch sichtbar macht.

MainActivity.java
package com.example;

public final class MainActivity extends android.app.Activity
{ private static final void println( final java.lang.Object object )
{ android.util.Log.i
( "com.example", java.lang.String.valueOf( object )); } private static final void sleep( final int duration )
{ try{ java.lang.Thread.sleep( duration ); }
catch( final java.lang.Exception exception ) {} } @java.lang.Override public final void onCreate
( final android.os.Bundle bundle )
{ super.onCreate( bundle ); for( int i = 0;; ++i )
{ println( i ); sleep( 1000 ); }}}
log
[ 03-12 11:46:31.140  4993: 4993 I/com.example ]
0 [ 03-12 11:46:32.150 4993: 4993 I/com.example ]
1 [ 03-12 11:46:33.160 4993: 4993 I/com.example ]
2 [ 03-12 11:46:34.170 4993: 4993 I/com.example ]
3
und so weiter …

Falls die Konsole nicht mehr benötigt wird, um solche Ausgaben zu lesen, kann sie geschlossen werden. Das Programm auf dem Emulator läuft dann trotzdem weiter. Insbesondere sollte das Konsolenfenster vor dem Start des nächsten Programms wieder geschlossen werden, da mehrere gleichzeitig geöffnete Konsolenfester zu früheren Programmen unübersichtlich wären.

Es ist nicht nötig, sich Sorgen darüber zu machen, daß das Logbuch zu viel Speicher beanspruchen könnte, denn ältere Einträge werden nach einer Weile automatisch gelöscht.

Laufzeitfehler

Das folgende Programm zeigt, daß auch eine Division durch 0 vom Skript angezeigt wird.

MainActivity.java
package com.example;

public final class MainActivity extends android.app.Activity
{ @java.lang.Override public final void onCreate
( final android.os.Bundle bundle )
{ super.onCreate( bundle ); java.lang.System.out.println( 1/0 ); }}
log
java.lang.ArithmeticException: divide by zero

Das folgende Programm zeigt, daß auch Speichermangel vom Skript angezeigt wird.

MainActivity.java
package com.example;

public final class MainActivity extends android.app.Activity
{ @java.lang.Override public final void onCreate
( final android.os.Bundle bundle )
{ super.onCreate( bundle ); final java.util.List< java.lang.Integer > list
= new java.util.ArrayList< java.lang.Integer >();
while( true )list.add( 1 ); }}
log
java.lang.OutOfMemoryError

Das folgende Programm zeigt, daß auch ein falsches Paket als Laufzeitfehler erkennbar wird.

MainActivity.java
package com.exemple;

public final class MainActivity extends android.app.Activity
{ @java.lang.Override public final void onCreate
( final android.os.Bundle bundle )
{ super.onCreate( bundle ); android.util.Log.i( "com.example", "hello, world" ); }}
log
java.lang.ClassNotFoundException: Didn't find class "com.example.MainActivity"

Problemhinweise

Das Programm »logcat« zur Ausgabe der Logbuch-Einträge muß recht früh gestartet werden. Wenn man es erst nach  dem Start der App starten, dann erscheinen die ersten Ausgaben der App manchmal nicht, weil das Programm »logcat« dann noch nicht richtig läuft. Das Skript »50_run.cmd« startet »logcat« deswegen schon vor  dem Start der App.

Leider werden Ausgabe von »logcat« anscheinend öfters verschluckt und erscheinen nicht auf der Ausgabe, insbesondere, wenn diese auf eine Konsole ausgegeben werden. Um dies zu verhindern, hat es sich als günstig erwiesen, zwischen mehreren Ausgaben eine kleine zeitliche Verzögerung (wie oben mit der Methode »sleep«) einzubauen.

Außerdem führen einige Kombinationen von Optionen und Argumenten des Programms »logcat« hier dazu, daß erwünschte Ausgaben nicht erscheinen. Der folgende Aufruf zeigt derzeit (2016) alle Meldungen mit dem Etikett »AndroidRuntime« und alle Meldungen mit dem Etikett »com.example« wie erwünscht an. Bei davon abweichenden Kombinationen sollte vor Gebrauch getestet werden, ob auch tatsächlich alle erwünschten Ausgaben erscheinen.

Aufruf von »logcat«
logcat -s AndroidRuntime:V com.example:V

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram723400 stefan_ram:723400 Loggen mit Android Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd723400, slrprddef723400, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/loggen_android