So entfernen Sie alle Debug-Protokollierungsaufrufe, bevor Sie die App in Google Play veröffentlichen
Laut Google muss ich "deaktivieren Sie alle Anrufe Log-Methoden in den Quellcode" vor der Veröffentlichung meiner Android app. Auszug aus Abschnitt 5 der Veröffentlichung Checkliste:
Stellen Sie sicher, dass Sie deaktivieren Sie die Protokollierung, und deaktivieren Sie die option Debuggen, bevor Sie bauen sich Ihre Anwendung für die Freigabe. Sie können deaktivieren Sie die Protokollierung, indem Sie entfernen die Anrufe zu Protokollieren Methoden in Ihre Quelldateien.
Mein open-source-Projekt ist groß und es ist ein Schmerz, um es manuell tun, jedes mal, wenn ich loslassen. Darüber hinaus entfernen Sie eine Log-Zeile ist möglicherweise schwierig, zum Beispiel:
if(condition)
Log.d(LOG_TAG, "Something");
data.load();
data.show();
Wenn ich kommentieren die Log-Zeile, dann die Bedingung gilt für die nächste Zeile, und die Chancen sind, laden() wird nicht aufgerufen. Sind solche Situationen selten genug, dass ich entscheiden kann, sollte es nicht existieren?
Dies ist auf der offiziellen Checkliste, so dass ich denke, viele Leute tun dies auf einer regelmäßigen basis.
So, wie effizient, aber sicher entfernen Sie alle Log-Zeilen?
InformationsquelleAutor der Frage Nicolas Raoul | 2010-03-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Finde ich eine weitaus einfachere Lösung ist, um zu vergessen, all die
if
prüft alle über dem Platz und nur mithilfe ProGuard, Streifen aus jedemLog.d()
oderLog.v()
- Methode aufrufen, wenn wir nennen unsere Antrelease
Ziel.So, wir haben immer die debug-info ausgegeben wird für regelmäßige builds und nicht um irgendwelche code-änderungen für release-builds. ProGuard können auch mehrere Durchläufe über den bytecode zu entfernen, die anderen unerwünschten Aussagen, leere Blöcke kann dann automatisch inline kurze Methoden gegebenenfalls.
Zum Beispiel, hier ist eine sehr grundlegende ProGuard config für Android:
So würden Sie speichern, um eine Datei, dann rufen Sie ProGuard von Ant, vorbei in Ihr nur die kompilierte JAR-und die Android-Plattform aus GLAS, die Sie verwenden.
Siehe auch die Beispiele in der ProGuard Handbuch.
Update (4,5 Jahre später): ich Heute verwendet Holz für Android-Protokollierung.
Nicht nur ist es ein bisschen schöner als die Standard -
Log
Einführung — das Protokoll-tag automatisch gesetzt wird, und es ist leicht zu log-formatierte Zeichenfolgen und Ausnahmen—, aber Sie können auch festlegen, verschiedene logging-Verhalten zur Laufzeit.In diesem Beispiel logging-Anweisungen werden nur geschrieben, um logcat in debug-builds, meiner app:
Holz eingerichtet ist, in meinem
Application
onCreate()
Methode:Dann woanders in meinem code, ich kann mich einloggen ganz einfach:
Sehen die Holz-Beispiel-app ein komplexeres Beispiel, wo alle log-Anweisungen werden gesendet, um logcat während der Entwicklung und in der Produktion, keine debug-Anweisungen protokolliert werden, aber Fehler werden stillschweigend gemeldet Crashlytics.
InformationsquelleAutor der Antwort Christopher Orr
Alle gute Antworten, aber als ich fertig war mit meiner Entwicklung, die ich nicht wollen, entweder mit if-Anweisungen, um alle Log-Aufrufe, noch wollte ich für die Verwendung von externen tools.
Also die Lösung, die ich verwende, ist zu ersetzen die android.util.Log-Klasse mit meinem eigenen Log-Klasse:
Das einzige, was ich zu tun hatte in allen Quell-Dateien zu ersetzen, die den import von android.util.Melden Sie sich mit meiner eigenen Klasse.
InformationsquelleAutor der Antwort Reiner
Ich schlage vor, dass eine statische boolean irgendwo angibt, ob oder nicht zu melden:
Dann, wo immer Sie wollen, melden Sie sich in Ihrem code, nur dazu:
Nun wenn Sie MyDebug.MELDEN Sie false, wird der compiler Streifen heraus, den gesamten code innerhalb eines solchen Schecks (da es eine statische Finale, es weiß zur compile-Zeit, der code wird nicht verwendet.)
Für größere Projekte, möchten Sie vielleicht beginnen mit booleans in einzelnen Dateien können leicht aktivieren oder deaktivieren der Protokollierung gibt es, wie gebraucht. Beispielsweise sind die verschiedenen logging-Konstanten haben wir in der Fenster-manager:
Mit dem entsprechenden code wie:
InformationsquelleAutor der Antwort hackbod
Christopher ' s Proguard-Lösung ist die beste, aber wenn aus irgendeinem Grund Sie nicht wie Proguard, hier ist ein sehr low-tech-Lösung:
Kommentar logs:
Kommentieren Protokolle:
Einschränkung ist, dass Ihre logging-Anweisungen müssen nicht erstrecken sich dabei über mehrere Zeilen.
(Diese Zeilen ausführen, die in einer UNIX-shell an der Wurzel des Projekts. Wenn Sie mit Windows arbeiten, erhalten Sie eine UNIX-Ebene oder verwenden Sie entsprechende Windows-Befehle)
InformationsquelleAutor der Antwort Nicolas Raoul
Ich möchte hinzufügen, einige Genauigkeiten über die Verwendung von Proguard mit Android Studio und gradle, da hatte ich viele Probleme zu entfernen log-Zeilen von der letzten binäre.
Um
assumenosideeffects
im Proguard funktioniert, es ist eine Voraussetzung.In Ihrem gradle-Datei, müssen Sie die Nutzung der
proguard-android-optimize.txt
als default-Datei.Eigentlich in der Standard -
proguard-android.txt
- Datei, Optimierung ist deaktiviert, mit den zwei Fahnen:Den
proguard-android-optimize.txt
Datei nicht fügen Sie diese Zeilen, so, jetztassumenosideeffects
arbeiten können.Dann, persönlich, ich benutze SLF4J, umso mehr, wenn ich entwickeln einige Bibliotheken, die an andere verteilt. Der Vorteil ist, dass standardmäßig gibt es kein Ausgang. Und wenn der integrator möchte einige log-Ausgaben, kann er verwendet Logback für Android und aktivieren der logs, also logs können in eine Datei umgeleitet oder an LogCat.
Wenn ich wirklich brauchen, um Streifen Sie die Protokolle aus, die Letzte Bibliothek, die ich dann zu meinen Proguard-Datei (nachdem er aktiviert die
proguard-android-optimize.txt
Datei natürlich):InformationsquelleAutor der Antwort Vincent Hiribarren
Habe ich LogUtils Klasse wie in der Google IO-Beispiel-Anwendung. Ich veränderte diese Anwendung spezifische DEBUG-Konstante statt der BuildConfig.DEBUGGEN da BuildConfig.DEBUG ist unzuverlässig. Dann in meiner Klasse bin ich der folgenden.
InformationsquelleAutor der Antwort JosephL
Ich würde prüfen, mit roboguice ist Protokollierung anstatt des built-in android.util.Melden Sie
Ihre Anlage automatisch deaktiviert debug-und verbose logs für release-builds.
Plus, erhalten Sie einige nette features für Sie kostenlos (z.B. anpassbare logging-Verhalten, zusätzliche Daten für jedes Protokoll und mehr)
Mit proguard könnte durchaus ein Aufwand, und ich würde nicht gehen durch die Mühe, zu konfigurieren und machen es Arbeit mit Ihrer Anwendung, es sei denn, Sie haben einen guten Grund dafür (deaktivieren der logs ist nicht eine gute)
InformationsquelleAutor der Antwort Zvi
Pro android.util.Log-bietet eine Möglichkeit zum aktivieren/deaktivieren der log:
Default die Methode isLoggable(...) den Wert false zurück, nur, nachdem Sie setprop im Gerät gefällt das:
Bedeutet es, ein Protokoll über die DEBUG-Stufe kann ausgedruckt werden. Referenz-android-doc:
So konnten wir use custom log util:
InformationsquelleAutor der Antwort Richard
Ich sehr empfehlen, den Einsatz von Holz von Jake Wharton
https://github.com/JakeWharton/timber
es löst Ihr Problem mit der Aktivierung/Deaktivierung plus Hinzugefügt tag Klasse automatisch
nur
Protokolle werden nur im debug-Version, und verwenden Sie dann
oder
drucken
"Ihre Klasse /msg" ohne specyfing der tag
InformationsquelleAutor der Antwort AndroidGecko
Bin ich Entsendung diese Lösung, und das gilt speziell für Android-Studio-Benutzer. Ich habe vor kurzem auch vor Holz-und importiert habe es erfolgreich in meine app, indem Sie Folgendes tun:
Setzen Sie die neueste version der Bibliothek in Ihrem Aufbau.gradle:
Dann im Android-Studios, gehen Sie zu Bearbeiten -> Suchen -> Ersetzen im Pfad...
Geben
Log.e(TAG,
oder aber Sie haben festgelegt, Ihre Log-Meldungen in die"Text to find"
textbox. Dann müssen Sie nur ersetzen Sie es mitTimber.e(
Klicken Sie auf Suchen und dann auf alle ersetzen.
Android Studios nun gehen Sie durch alle Ihre Dateien in Ihrem Projekt und ersetzen alle Logs mit Holz.
Das einzige problem hatte ich mit dieser Methode ist, dass gradle nicht gekommen, bis mit Millionen Fehlermeldungen hinterher, denn es kann nicht suchen Sie "Holz" in der Einfuhren für jedes java-Dateien. Klicken Sie einfach auf die Fehler-und Android-Studios wird automatisch importieren "Holz" in java. Sobald Sie getan haben, es für alle Ihre Fehler-Dateien, gradle kompilieren wird wieder.
Sie auch brauchen, um dieses Stück code in Ihre
onCreate
Methode IhrerApplication
Klasse:Dadurch wird die app die Protokollierung nur, wenn Sie im development-Modus nicht in der Produktion. Sie können auch
BuildConfig.RELEASE
für die Anmeldung im release-Modus.InformationsquelleAutor der Antwort Simon
Dies ist, was ich zu tun, auf meinem android-Projekten..
In Android Studio können wir tun, ähnliche operation, indem Sie Strg+Umschalt+F zu finden, aus dem ganzen Projekt (Befehl+Shift+F in MacOs) und Strg+Shift+R zu Ersetzen(Befehl+Umschalt+R in MacOs))
InformationsquelleAutor der Antwort Lins Louis
Wenn Sie ausführen können, ein globales ersetzen (nur einmal), und danach erhalten einigen coding-Konvention, können Sie die Muster oft in Android Rahmen.
Statt zu schreiben
haben es als
Nun proguard entfernen können Sie die StringBuilder-Objekt und alle strings und Methoden auf dem Weg, von einer optimierten release-DEX. Verwenden
proguard-android-optimize.txt
und Sie brauchen nicht zu befürchten android.util.Melden Sie in Ihremproguard-rules.pro
:Mit Android Studio gradle-plugin
BuildConfig.DEBUG
ist ziemlich zuverlässig, so dass Sie nicht brauchen zusätzliche Konstanten zur Steuerung der stripping.InformationsquelleAutor der Antwort Alex Cohn
Habe ich eine sehr einfache Lösung. Ich benutze IntelliJ für die Entwicklung, so dass die details variieren, aber die Idee gelten sollten, über alle IDE.
Ich wählen, um die Ursache meiner source-tree mit der rechten Maustaste und wählen Sie " zu tun "ersetzen". Ich dann wählen Sie " alle ersetzen "Log". mit "//Log.". Dies entfernt alle log-Anweisungen. Um Sie später wieder wiederhole ich die gleiche ersetzen, sondern diese Zeit als die " alle ersetzen "//Log." mit "Log.".
Funktioniert einfach toll für mich. Denken Sie daran, zu ersetzen case-sensitive zu vermeiden Unfälle wie "Dialog.". Für zusätzliche Sicherheit können Sie auch den ersten Schritt machen mit " Log." als Zeichenfolge suchen.
Genial.
InformationsquelleAutor der Antwort kg_sYy
Als zserge Kommentar vorgeschlagen,
seine log-Bibliothek bietet einfache aktivieren/deaktivieren log-Druck-Schalter, wie unten beschrieben.
Darüber hinaus nur eine änderung
import
Linien, und nichts ändern muss fürLog.d(...);
- Anweisung.InformationsquelleAutor der Antwort Youngjae
Habe ich verbessert auf die Lösung vor, indem Sie die Unterstützung für unterschiedliche log-levels, und durch ändern der log-Stufen automatisch, je nachdem, ob der code ausgeführt wird auf einem live-Gerät oder dem emulator.
InformationsquelleAutor der Antwort danwms
ProGuard wird es für Sie tun auf Ihrer release-Version, und jetzt die gute Nachricht aus android.com:
http://developer.android.com/tools/help/proguard.html
Den ProGuard-tool verkleinert, optimiert und verbirgt Ihren code durch entfernen von nicht verwendeten code und die Umbenennung von Klassen, Feldern und Methoden mit semantisch obskuren Namen. Das Ergebnis ist eine kleinere Größe .apk-Datei, die mehr schwer zu reverse Engineering. Da ProGuard macht Ihre Anwendung erschwert reverse Engineering ist es wichtig, dass Sie es verwenden, wenn Ihre Anwendung nutzt features, die empfindlich auf Sicherheit, wie wenn Sie die Lizenzierung Ihrer Anwendungen.
ProGuard integriert, die Android-build-system, so dass Sie nicht haben, um es aufzurufen manuell. ProGuard wird nur ausgeführt, wenn Sie bauen sich Ihre Anwendung im release-Modus, so dass Sie nicht haben, um mit obfuscated code, wenn Sie bauen sich Ihre Anwendung im debug-Modus. Mit ProGuard laufen ist völlig optional, aber dringend empfohlen.
Dieses Dokument beschreibt, wie Sie aktivieren und konfigurieren ProGuard sowie die retrace-tool zum Dekodieren verschleiert stack-traces
InformationsquelleAutor der Antwort Max Gold
Fügen Sie Folgendes zu Ihrer proguard-rules.txt Datei
InformationsquelleAutor der Antwort eranga
Ich benutze gerne Melden.d(TAG, einige string, oft ein String.format ()).
TAG ist immer der name der Klasse
Transformieren Melden.d(TAG --> Logd( im text deiner Klasse
In dieser Weise, wenn Sie bereit sind, um eine release-version, set MainClass.debug auf false!
InformationsquelleAutor der Antwort user462990
Protokolle können entfernt werden mit bash in linux und sed:
Werke für mehrzeilige logs. In dieser Lösung können Sie sicher sein, dass die logs nicht vorhanden sind, sind in der Produktion code.
InformationsquelleAutor der Antwort sylwano
Ich weiß, das ist eine alte Frage, aber warum nicht Sie ersetzen Sie alle Ihre log-Anrufe mit so etwas wie
Boolean logCallWasHere=true; //---rest von deinem log hier
Diesem Grund werden Sie wissen, wenn Sie möchten, um Sie zurück, und Sie werden nicht auf die if-Anweisung call 🙂
InformationsquelleAutor der Antwort masood elsad
den einfachsten Weg;
verwenden
DebugLog
Alle Protokolle sind deaktiviert DebugLog, wenn die app veröffentlicht wird.
https://github.com/MustafaFerhan/DebugLog
InformationsquelleAutor der Antwort Mustafa Ferhan