1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

Bedingtes Kompilieren

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Bobert, 03.03.2011.

  1. Bobert, 03.03.2011 #1
    Bobert

    Bobert Threadstarter Erfahrener Benutzer

    Beiträge:
    161
    Erhaltene Danke:
    15
    Registriert seit:
    21.11.2010
    Phone:
    Nexus S
    Hallo,

    in der Release Version sollten alle Log.[irgenwas] gelöscht werden Punkt 5.4

    Ich kenne es so (von C, C++ und C#) das man "#ifdef release " benutzt. Dieses "Bedingtes Kompilieren" gibt es in Java nicht! Oder?

    Wie macht Ihr das in euren Projekten wenn Ihr eine Release Version fertig macht, löscht Ihr per Hand alle LOG. oder etwa so wie hier beschrieben. Oder kennt Ihr eine weite Möglichkeit, wie man das machen SOLLTE.

    Best Practices :love:, kein Workaround :thumbdn:.

    Gruß Bobert
     
  2. maniac103, 03.03.2011 #2
    maniac103

    maniac103 Android-Lexikon

    Beiträge:
    1,237
    Erhaltene Danke:
    1,157
    Registriert seit:
    24.01.2011
    Richtig, da kein Präprozessor vorhanden ist.

    Ich mache das immer so:

    Code:
    public class MyActivity extends Activity {
        private static final boolean D = true; // bei Release auf false setzen
        private static final String TAG = "MyApp";
    
        private void someMethod() {
            if (D) Log.d(TAG, "Foo");
        }
    }
    
    In den AOSP-Sourcen wird's ähnlich gemacht.
    Ich würde übrigens nicht alle Log-Aufrufe rausmachen / abschalten, sondern nur Log.d und Log.v.
     
    Bobert bedankt sich.
  3. Bobert, 03.03.2011 #3
    Bobert

    Bobert Threadstarter Erfahrener Benutzer

    Beiträge:
    161
    Erhaltene Danke:
    15
    Registriert seit:
    21.11.2010
    Phone:
    Nexus S
    Hallo,

    kann man das nicht an Zentraler stelle ablegen, sonst müsste ich ja jede Klasse / Activity diesen Eintrag ändern wen ich die Release Version erstelle!?

    Ich dachte mir das dieser Eintrag ja in die AndroidManifest.xml gehört, dort sind alle Meta Daten der App. Hier habe ich aber nichts auf die schnelle gefunden ob man das "darf". Spontan würde ich follgendes schreiben,
    Code:
    <application android:release=["true" | "false"] ... >
    
    bekommt dann Android "Schluckauf"?

    Oder Oder Google brachte mir auch kein brauchbares Ergebnis. Jemand eine Gute Idee?

    Gruß Bobert
     
    Zuletzt bearbeitet: 03.03.2011
  4. BenOtto, 03.03.2011 #4
    BenOtto

    BenOtto Android-Hilfe.de Mitglied

    Beiträge:
    141
    Erhaltene Danke:
    15
    Registriert seit:
    30.08.2010
    Ich halte es für sinnvoll solch eine Einstellung in der abgeleiteten Application zu halten.

    Code:
    public class MyApp extends Application {
      public static final String DEBUG = "MyApp";
      public static final boolean RELEASE = false;
    }
    
     
    Bobert bedankt sich.
  5. Bobert, 03.03.2011 #5
    Bobert

    Bobert Threadstarter Erfahrener Benutzer

    Beiträge:
    161
    Erhaltene Danke:
    15
    Registriert seit:
    21.11.2010
    Phone:
    Nexus S
    Hallo,

    danke euch damit kann ich gut leben. Zusammengefasst müsste es also so aussehen.

    MyActivity.java
    Code:
    public class MyActivity extends Activity {
    ...
        private void someMethode() {
            if (MyApp.RELEASE) Log.d(MyApp.TAG, "Foo");
        }
    }
    MyApp.java
    Code:
    import android.app.Application;
    
    public class MyApp extends Application{
        public static final String TAG = "MyApp";
        public static final boolean RELEASE = false;    
    }
    Wo ich nochmals nachfragen muss, in Punkt 5.4 wird gesagt
    Das meint alle, warum würdest Du @maniac103
    Gruß Bobert
     
  6. maniac103, 03.03.2011 #6
    maniac103

    maniac103 Android-Lexikon

    Beiträge:
    1,237
    Erhaltene Danke:
    1,157
    Registriert seit:
    24.01.2011
    Das sollte wohl ein if (!MyApp.RELEASE) sein ;)

    Naja, Log.i, Log.w, Log.e und Log.wtf (LOL) nimmt man doch nur für wichtige Informationen (Exception-Logging etc.), die hilfreich sein können, wenn mal jemand ein Problem mit deiner App hat. Deswegen würde ich die drin lassen.

    Ich würde auch nur Log.v rauscompilieren und Log.d von einer Preference-gesteuerten Variable abhängig machen. Wenn es ein Problem gibt, schaltet der Benutzer deiner App das Flag an und du hast ausführliche Debug-Informationen. Das wird z.B. in K9-Mail so gemacht. Default dabei ist natürlich 'Debug-Logging aus'.
     
  7. BenOtto, 03.03.2011 #7
    BenOtto

    BenOtto Android-Hilfe.de Mitglied

    Beiträge:
    141
    Erhaltene Danke:
    15
    Registriert seit:
    30.08.2010
    Auch eine gute Alternative!
     
  8. Bobert, 03.03.2011 #8
    Bobert

    Bobert Threadstarter Erfahrener Benutzer

    Beiträge:
    161
    Erhaltene Danke:
    15
    Registriert seit:
    21.11.2010
    Phone:
    Nexus S
    Hallo,

    Jep :thumbup:
    Log.wtf() ein Schelm wer böses dabei denkt. Heist aber wirklich "What a Terrible Failure" :biggrin:

    Hier wird gesagt "Verbose should never be compiled into an application except during development." hört sich für mich, implizit an das die anderen Meldungen drin bleiben sollen. Wenn ich die Log...() Meldungen in der Entwicklung beim benutzen des Emulator habe, bekomme ich diese Log...() in LogCat angezeigt, wo aber gehen die hin wenn ich die App ausliefere habe, wo kann ich die Meldungen auf dem Gerät finden?

    Gruß Bobert
     
  9. funcoder, 03.03.2011 #9
    funcoder

    funcoder Erfahrener Benutzer

    Beiträge:
    218
    Erhaltene Danke:
    38
    Registriert seit:
    15.08.2009
    Also ich habe einfach eine extra Methode erstellt:

    private void Log(String text){
    if(showLog)
    Log.d("123","456");
    }

    Und dann natürlich immer diese Log Methode aufrufen. Lässt sich sicherlich mit den verschiedenen Log Typen tunen.

    Vorteil ist, dass der Code nicht unschön wird mit tausenden Abfragen ob die Debug Ausgaben angezeigt werden sollen oder nicht.
     
  10. BenOtto, 03.03.2011 #10
    BenOtto

    BenOtto Android-Hilfe.de Mitglied

    Beiträge:
    141
    Erhaltene Danke:
    15
    Registriert seit:
    30.08.2010
    Ja, sowas ist auch denkbar. Am besten auch als statische Methode innerhalb der Application-Klasse.
     
  11. BenOtto, 03.03.2011 #11
    BenOtto

    BenOtto Android-Hilfe.de Mitglied

    Beiträge:
    141
    Erhaltene Danke:
    15
    Registriert seit:
    30.08.2010
    Die landen in einem Log-File. Dieses lässt sich dann auch von jedem auslesen. Wenn du also einen Fehler loggst, dann bringt dich das weiter, weil du über den Crash-Report eines Benutzers herausfinden kannst was genau los war.
     
  12. Bobert, 03.03.2011 #12
    Bobert

    Bobert Threadstarter Erfahrener Benutzer

    Beiträge:
    161
    Erhaltene Danke:
    15
    Registriert seit:
    21.11.2010
    Phone:
    Nexus S
    Ok, ist ja Linux aber ich finde kein /var/log Verzeichnis, auch finde ich die Log.Files nicht, im App Verzeichnis?

    Gruß Bobert
     
  13. maniac103, 03.03.2011 #13
    maniac103

    maniac103 Android-Lexikon

    Beiträge:
    1,237
    Erhaltene Danke:
    1,157
    Registriert seit:
    24.01.2011
    Dafür hast du dann aber auch Overhead durch einen zusätzlichen Funktionsaufruf pro Logzeile...den wirft (AFAIK) der Android-Compiler leider nicht raus...
     
  14. maniac103, 03.03.2011 #14
    maniac103

    maniac103 Android-Lexikon

    Beiträge:
    1,237
    Erhaltene Danke:
    1,157
    Registriert seit:
    24.01.2011
    USB-Kabel anschließen und 'adb logcat' aufrufen ;)
    Oder halt aLogcat aus dem Market installieren.
     
  15. Bobert, 04.03.2011 #15
    Bobert

    Bobert Threadstarter Erfahrener Benutzer

    Beiträge:
    161
    Erhaltene Danke:
    15
    Registriert seit:
    21.11.2010
    Phone:
    Nexus S
    Ja danke Dir, hatte die Hoffnung das es einfacher geht. Sicherlich keine Möglichkeit für eine Ausgelieferte App, aber Gut zu wissen. Auf jeden Fall hat mir dieser Thread und Ihr :thumbsup: viel geholfen.

    Gruß Bobert
     
  16. DieGoldeneMitte, 05.03.2011 #16
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    Ich bin gegen die Logfunktion.

    Das mit der Funktion Log mag zwar etwas einfacher lesbar sein, hat aber den Nachteil, dass das Argument IMMER ausgewertet wird.
     

Diese Seite empfehlen