In C ++ würde ich normalerweise zwei Builds einrichten - debuggen und release mit jeweils DEBUG
und RELEASE
vordefiniert. Ich würde dann diese Definitionen verwenden, um konstante Werte zu bestimmen, wie die Protokollierung aktiviert / deaktiviert, Server-URL und etc.
Im Moment, in Java / Android, kommentiere ich einige Sachen, bevor ich die Veröffentlichung mache. Das ist kein guter Weg, kann ich sagen. Ich kann etwas vergessen.
Wie kann man sicherstellen, dass beim Erstellen einer Release-Version (signiert) oder einer Debug-Version (unsigniert) nichts vergessen wird?
Es gibt keinen (standardmäßig) Präprozessor für Java, also keine #ifdef
sachen zur Kompilierzeit. Aber wenn es Ihnen nichts ausmacht, Debug-Code in Ihrer App zu belassen, können Sie mit diesem Code überprüfen, ob die App zur Laufzeit released oder debuggt:
überprüft debuggable
Flag-Wert. Und flad wird automatisch auf false
für Release-Builds und true
für Debug-Builds gesetzt.
Wenn Sie Debug-Code loswerden wollen, können Sie ProGuard verwenden, um bestimmte Klassen oder Methoden zu entfernen. Und standardmäßig ist ProGuard nur für Release Builds am Erstellungsprozess beteiligt.
Wenn Sie die Anwendung von Eclipse ausführen, wird es immer ein Debug sein.
Wenn Sie die Anwendung exportieren (Android Tools - & (nicht) signiertes Anwendungspaket exportieren)
Wenn Sie dynamisch wissen wollen, ob es freigegeben oder debuggt, können Sie BuildConfig.DEBUG verwenden (Es befindet sich im gen-Ordner, ich weiß nicht, ob dies von allen API-Ebenen unterstützt wird)
Wie folgt:
%Vor%Wenn Sie sich die generierten Bytecodes ansehen, sehen Sie Folgendes (im Debug-Modus):
%Vor%Erzeugt die folgenden Bytecodes:
%Vor%Und wenn BuildConfig.DEBUG falsch ist
%Vor%Normalerweise erstelle ich eine separate Protokollklasse, in der ich eine statische DEBUG-Variable festlege. Alles, was ich vor dem Erstellen eines Produktions-Builds brauche, ist, diese DEBUG-Variable auf false zu setzen.
%Vor%Für die Protokollierung -
%Vor%Ich hatte das gleiche Problem wie jedes Mal, wenn ich das Projekt als Android-Anwendung lief es im Debugger-Modus zu öffnen, aber dann wurde das Problem gelöst.
- Wenn Sie in Eclipse arbeiten, müssen Sie die Java EE-Perspektive verwenden - Wählen Sie stattdessen nur Java-Perspektive.
- Löschen Sie Ihre App. -Installieren Sie die App vom Gerät. - Starten Sie Ihr Gerät neu (Einfach so, dass kein Cache gespeichert wird) - Führen Sie Ihre App aus.
Der Debugger-Modus wird diesmal nicht angezeigt. Kopiere die im Ordner bin generierte apk und probiere sie auch auf anderen Geräten aus
Ich habe einen Weg gefunden, eine Preprocessing-Direktive anständig nachzubilden:
In meiner Gradle buildTypes
definiere ich:
Dann mache ich in meinem Code folgendes:
%Vor%und bei Bedarf natürlich:
%Vor% Beide Blöcke sind in der debug
APK vorhanden, aber beim Erstellen einer release
-Version ist Proguard clever genug, um zu bestimmen, dass der debug
-Block entfernt werden kann, wie von ihm abhängig ist a if (false)
(wird auch aus dem resultierenden Code entfernt).
Wenn Sie einige Debug-spezifische Klassen vom Block debug
aufrufen und nur von dort, werden sie aus dem resultierenden APK entfernt, da sie als unbenutzt betrachtet werden . Dies ist auch ein interessanter Punkt : Ihr Code kann nicht so getempert werden, dass er diesen Code verwendet.
Ich könnte das alles feststellen, indem ich meine dump
, mapping
und usage
Proguard Ausgabedateien überprüfe.