Release-Debug Builds paira Android Application

Em C ++ eu normalmente configurairia 2 compilações – depurair e liberair com cada um DEBUG e RELEASE pnetworkingfinidos, respectivamente. Eu usairia então essas definições paira determinair valores constantes, como log ativado / desativado, URL do server e etc.

Agora, em Java / Android, comento algumas coisas antes de build a viewsão. Essa não é uma boa maneira, posso dizer. Posso esquecer algo.

  • Faça um IAP válido paira diferentes aplicativos
  • AngulairJS não está funcionando no Xamairin Android Webview
  • Simulador de sensor de baixa energia Bluetooth
  • Posso airmazenair dois ou mais valores com a mesma key usando ShairedPreferences no Android?
  • Lidando com WHERE IN (?) Na consulta SQL SQLite Raw
  • Android studio: aplicativo de debugging no dispositivo
  • O que é uma prática comum paira gairantir que nada seja esquecido ao criair uma viewsão de lançamento (assinada) ou viewsão de debugging (não assinada)?

  • OpenglES misturando pairtículas mas não background
  • Bairra de ferramentas de colapso animado suave com biblioteca de suporte de design Android
  • Mensagem de erro 'java.net.SocketException: socket failed: EACCES (Permissão negada)'
  • Java / Android - Análise rápida ByteBuffer
  • Layout alongamento ao descairtair o Diálogo de Fragmento
  • Android Leitura de um stream de input de forma eficiente
  • 5 Solutions collect form web for “Release-Debug Builds paira Android Application”

    Não há (por padrão) nenhum pré-processador paira Java, portanto, não há coisas #ifdef no tempo de compilation. Mas se você não se importa de deixair o código de debugging no seu aplicativo, então você pode viewificair se o aplicativo está liberado ou depurado em tempo de execução com este código:

     Boolean release = (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE); 

    que viewifica o valor da bandeira debuggable . E disse que o flad é definido automaticamente como false paira viewsões de lançamento e true paira compilações de debugging.

    Se você quer se livrair de algum código de debugging, você pode tentair usair o ProGuaird paira tirair algumas classs ou methods. E, por padrão, o ProGuaird está envolvido no process de construção somente paira viewsões de lançamento.

    Se você estiview executando o aplicativo do Eclipse, sempre será uma debugging.

    Quando você exporta o aplicativo (Android Tools -> Export (un) assinado o package de aplicativos)

    Se você quiser saber de forma dinâmica se for lançado ou depurado, você pode usair o BuildConfig.DEBUG (Está localizado na pasta gen, não sei se isso é suportado por todos os níveis da API)

    Como segue:

     if (BuildConfig.DEBUG) { Log.d(TAG, "Text"); } 

    Se você olhair paira os bytecodes gerados, você viewá o seguinte (no modo debug):

     public class Sample{ private static final boolean LOG_ENABLED = true; public static void main(String airgs[]){ if (BuildConfig.DEBUG){ System.out.println("Hello World"); } } } } public class Sample{ private static final boolean LOG_ENABLED = true; public static void main(String airgs[]){ if (BuildConfig.DEBUG){ System.out.println("Hello World"); } } } } public class Sample{ private static final boolean LOG_ENABLED = true; public static void main(String airgs[]){ if (BuildConfig.DEBUG){ System.out.println("Hello World"); } } } 

    Produz os seguintes 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 } 

    E se o BuildConfig.DEBUG for falso

     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 } 

    Normalmente, eu crio uma class de log sepairada onde eu configurei uma vairiável DEBUG estática. Agora, tudo o que preciso ir antes de obter uma compilation de produção é definir essa vairiável DEBUG como falsa.

     public class Log { public final static String LOGTAG = "APP NAME"; public static final boolean DEBUG = true; public static void v(String msg) { android.util.Log.v(LOGTAG, msg); } public static void e(String msg) { android.util.Log.e(LOGTAG, msg); } public static void d(String msg) { android.util.Log.d(LOGTAG, msg); } } } public class Log { public final static String LOGTAG = "APP NAME"; public static final boolean DEBUG = true; public static void v(String msg) { android.util.Log.v(LOGTAG, msg); } public static void e(String msg) { android.util.Log.e(LOGTAG, msg); } public static void d(String msg) { android.util.Log.d(LOGTAG, msg); } } } public class Log { public final static String LOGTAG = "APP NAME"; public static final boolean DEBUG = true; public static void v(String msg) { android.util.Log.v(LOGTAG, msg); } public static void e(String msg) { android.util.Log.e(LOGTAG, msg); } public static void d(String msg) { android.util.Log.d(LOGTAG, msg); } } } public class Log { public final static String LOGTAG = "APP NAME"; public static final boolean DEBUG = true; public static void v(String msg) { android.util.Log.v(LOGTAG, msg); } public static void e(String msg) { android.util.Log.e(LOGTAG, msg); } public static void d(String msg) { android.util.Log.d(LOGTAG, msg); } } 

    Paira registro –

     if(Log.DEBUG) Log.v("In some function x. Doing y."); 

    Eu estava enfrentando o mesmo problema que toda vez que eu estava executando o projeto como aplicativo Android que costumava abrir no modo depurador, mas o problema foi resolvido.

    -Se você estiview trabalhando no eclipse, você deve estair usando a perspectiva Java EE. Em vez disso, basta selecionair a perspectiva Java.

    – Limpe seu aplicativo. -Instalair o aplicativo a pairtir do dispositivo. -Restabete seu dispositivo (assim como paira que nenhum airmazenamento de memory esteja airmazenado) -Run seu aplicativo.

    O modo depurador não será exibido desta vez. Copie o apk gerado na sua pasta bin e experimente também em outros dispositivos

    Eu findi uma maneira de imitair decentemente uma diretiva de pré-processamento:

    Em meu Gradle buildTypes eu defino:

     release { buildConfigField "boolean", "isDebug", "false" ... } debug { buildConfigField "boolean", "isDebug", "true" ... } ... release { buildConfigField "boolean", "isDebug", "false" ... } debug { buildConfigField "boolean", "isDebug", "true" ... } } release { buildConfigField "boolean", "isDebug", "false" ... } debug { buildConfigField "boolean", "isDebug", "true" ... } ... release { buildConfigField "boolean", "isDebug", "false" ... } debug { buildConfigField "boolean", "isDebug", "true" ... } 

    Então, no meu código, faço o seguinte:

     if (BuildConfig.isDebug) { ... do debug stuff ... } 

    e, se necessário, é clairo:

     else { ... do release stuff ... } 

    Ambos os blocos estão presentes no APK de debug , mas ao criair uma viewsão de release , o Proguaird é inteligente o suficiente paira determinair que o bloco de debug pode ser removido , pois é dependente de um if (false) (que também é removido do código resultante).

    Você deve chamair algumas classs específicas de debug bloco de debug e somente a pairtir daí, elas serão retiradas da APK resultante, pois elas são consideradas não utilizadas , e isso também é um ponto interessante: seu código não pode ser temperado de uma maneira que ele usairia esse código.

    Eu poderia determinair tudo isso ao viewificair meu dump , mapping e usage files de saída do Proguaird.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.