In C++ I would normally setup 2 builds - debug and release with each having DEBUG
and RELEASE
predefined respectively. I would then use these definitions to determine constant values, like logging enabled/disabled, server URL and etc.
Right now, in Java/Android I comment out some stuff before building release. That is not a good way, I can tell. I may forget something.
What is a common practice for ensuring nothing is forgotten when building a release version (signed) or debug version (unsigned)?
If you are running the application from Eclipse, it will always be a debug.
When you export the application (Android Tools -> Export (un)signed Application Package)
If you want to know dynamically if its release or debug, you can use BuildConfig.DEBUG (Its located in the gen folder, I don't know if this is supported by all the API levels)
Like as followed:
if (BuildConfig.DEBUG) {
Log.d(TAG, "Text");
}
If you look at the generated bytecodes you will see the following (In debug mode):
public class Sample{
private static final boolean LOG_ENABLED = true;
public static void main(String args[]){
if (BuildConfig.DEBUG){
System.out.println("Hello World");
}
}
}
Produces the following bytecodes:
public class Sample extends java.lang.Object{
public Sample();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3; //String Hello World
5: invokevirtual #4; //Method Java/io/PrintStream.println(Ljava/lang/String;)V
8: return
}
And if the BuildConfig.DEBUG is false
public class Sample extends java.lang.Object{
public Sample();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: return
}
There's no (by default) any preprocessor for Java, so no #ifdef
stuff at compile time. But if you do not mind leaving debug code in your app, then you can check if app is release or debug at runtime with this code:
Boolean release = (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE);
which checks debuggable
flag value. And said flad is automatically set to false
for release builds and true
for debug builds.
If you want to get rid of some debug code, you may try using ProGuard to strip certain classes or methods. And by default ProGuard is involved in building process for release builds only.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With