¿Cuándo ADT establece BuildConfig.DEBUG en falso?

110

En la versión más reciente de ADT (r17) se agregó una constante generada BuildConfig.DEBUGque se establece de acuerdo con el tipo de compilación. El problema que tengo es que nunca se establece en falso, esperaba que cambiara al hacer "Herramientas de Android -> Exportar paquete de aplicación firmado", pero no es así para mí.

Entonces, ¿cómo cambio el tipo de construcción?

Se agregó una función que le permite ejecutar código solo en modo de depuración. Las compilaciones ahora generan una clase llamada BuildConfig que contiene una constante DEBUG que se establece automáticamente de acuerdo con su tipo de compilación. Puede verificar la constante (BuildConfig.DEBUG) en su código para ejecutar funciones de solo depuración

smith324
fuente
2
BuildConfig.java es generado automáticamente por las herramientas de compilación de Android y se coloca en la carpeta gen. El APK firmado debe tener BuildConfig.DEBUG = false. No debería ser un problema para ti. No debería tener que tocar manualmente ese archivo ...
IgorGanapolsky
1
Si usa gradle para lanzar, esta bandera es 100% confiable. Entonces, cuando haces un ./gradlew assembleDebug es verdadero y cuando haces ensamblarRelease es falso.
slott

Respuestas:

56

Actualmente, puede obtener el comportamiento correcto desactivando "Construir automáticamente", limpiando el proyecto y luego exportando a través de "Herramientas de Android -> Exportar paquete de aplicación firmado". Cuando ejecuta la aplicación BuildConfig.DEBUGdebe ser falsa.

smith324
fuente
roto también. Lo que tiene la consecuencia de mostrar todos los mensajes Log.d que deben omitirse con esta bandera. PD. ¿Dónde presentar el informe de errores?
tomi
el mío siempre es falso, incluso cuando se
depura
39

Con Eclipse , siempre desactivo la opción "Construir automáticamente" antes de exportar la aplicación en el lanzamiento. Luego limpio el proyecto y exporto. De lo contrario, comienza a compilar en modo de depuración y, a continuación, el valor de BuildConfig.DEBUG puede ser incorrecto.

Con Android Studio , simplemente agrego mi propia variable personalizada en build.gradle:

buildTypes {
    debug {
        buildConfigField "Boolean", "DEBUG_MODE", "true"
    }
    release {
        buildConfigField "Boolean", "DEBUG_MODE", "false"
    }
}

Cuando construyo el proyecto, BuildConfig.java se genera de la siguiente manera:

public final class BuildConfig {
  // Fields from build type: debug
  public static final Boolean DEBUG_MODE = true;
}

Luego, en mi código puedo usar:

if (BuildConfig.DEBUG_MODE) {
    // do something
}

Recomiendo limpiar después de cambiar la versión de depuración / liberación.

Arnaud SmartFun
fuente
1
Esta solución es la mejor si usa proguard porque generará una constante con un valor literal, por lo que su código de depuración se eliminará por completo del binario en el modo de lanzamiento.
Victor Laerte
33

No funciona correctamente:

Problema 27940 : BuildConfig.DEBUG es "true" para el paquete de aplicación exportado

Es decepcionante que a veces publiquen funciones con errores.

Randy Sugianto 'Yuku'
fuente
9
Vaya al enlace al problema mencionado anteriormente y marquelo con una estrella si desea que se solucione.
Guy
11

Funciona, pero tenga en cuenta que el archivo de código nunca cambia, incluso al exportar el archivo firmado. El proceso de exportación cambia el valor de esta variable a falso, lo que podría darle la falsa impresión de que no está funcionando. Probé esto con declaraciones de registro como

if (com.mypackage.BuildConfig.DEBUG)
            Log.d(TAG, location.getProvider() + " location changed");

Al realizar las pruebas, mis declaraciones de registro ya no producen ningún resultado.

pbhowmick
fuente
1
¿Qué hiciste exactamente?
pbhowmick
2
Cambié las instancias de BuildConfig.DEBUG a com.mypackage.BuildConfig.DEBUG, luego volví a ejecutar la aplicación ... y seguía siendo verdadera todo el tiempo. Quizás entendí mal tu sugerencia.
Chris Rae
1
Lo que estoy diciendo es que el código NO cambiará. Sin embargo, com.mypackage.BuildConfig.DEBUG se configurará en False post compilación. Pruebe una declaración de registro de prueba como la anterior (elija una cadena arbitraria para registrar), realice la exportación y luego ejecútela. Vea si adb muestra la declaración de registro. Voy a apostar a que adb no informará esa declaración de registro, lo que significa que DEUBUG se ha establecido en falso.
pbhowmick
1
No estoy seguro de saber a qué te refieres con "el código" ... sin embargo, diré que hacer una limpieza antes de exportar el APK (como se sugiere en la respuesta aceptada) hizo tanto BuildConfig.DEBUG como com.mypackage.BuildConfig .DEBUG informe falso como se esperaba.
Chris Rae
Lo tienes. Ese es el comportamiento esperado.
pbhowmick
10

Compruebe si imports, a veces, BuildConfig se importa de cualquier clase de biblioteca sin querer. Por ejemplo:

import io.fabric.sdk.android.BuildConfig;

En este caso, BuildConfig.DEBUG siempre devolverá falso ;

import com.yourpackagename.BuildConfig;

En este caso, BuildConfig.DEBUG devolverá su variante de compilación real .

ps Solo copio este de mi respuesta aquí: BuildConfig.DEBUG siempre es falso al construir proyectos de biblioteca con gradle

Gent Berani
fuente
1
Sí, para mí fue importado accidentalmente android.support.compat. Supongo que esa es otra razón para definir su propio campo con un nombre diferente.
arekolek
5

De Preparándose para el lanzamiento :

Desactivar el registro y la depuración

Asegúrese de desactivar el registro y deshabilitar la opción de depuración antes de crear su aplicación para su lanzamiento. Puede desactivar el registro eliminando las llamadas a los métodos de registro en sus archivos de origen. Puede deshabilitar la depuración eliminando el atributo android: debuggable de la etiqueta en su archivo de manifiesto, o configurando el atributo android: debuggable como falso en su archivo de manifiesto. Además, elimine los archivos de registro o los archivos de prueba estáticos que se crearon en su proyecto.

Además, debe eliminar todas las llamadas de seguimiento de depuración que agregó a su código, como las llamadas al método startMethodTracing () y stopMethodTracing ().

Más información sigue el enlace.

pedro
fuente
1
Pensé que este proceso ahora ocurre automáticamente en el momento de la compilación: developer.android.com/tools/sdk/tools-notes.html
IgorGanapolsky
Provoca un error en tiempo de compilación: «Evite codificar el modo de depuración; dejarlo fuera permite depurar y liberar compilaciones para asignar una automáticamente »
Nikita Bosik
5

La solucion para mi:

  1. Proyecto -> Construir automáticamente
  2. Proyecto -> Limpiar
  3. Proyecto -> Construir
  4. Aplicación de Android Project Export

Es trabajo en r20

e.shishkin
fuente
1
Esto funcionó para mí en este momento (usando el último ADT, supongo). Quizás la limpieza lo arregló, no estoy seguro.
Jonny
3

Me gustaría proponer una solución alternativa simple si usa proguard durante la exportación de APK.

Proguard proporciona una forma de eliminar llamadas a funciones específicas en el modo de liberación. Cualquier llamada para depurar registros se puede eliminar con la siguiente configuración en proguard-project.txt.

# Remove debug logs
-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
}

Y la optimización se instala project.properties.

proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt

Con esto, no necesita preocuparse por ningún cálculo de cadena innecesario que pase al registro de depuración al que señaló @Jeremyfa. Los cálculos simplemente se eliminan en la versión de versión.

Entonces, la solución para BuildConfig.DEBUG usa la misma característica de proguard como sigue.

public class DebugConfig {

    private static boolean debug = false;

    static {
        setDebug(); // This line will be removed by proguard in release.
    }

    private static void setDebug() {
        debug = true;
    }

    public static boolean isDebug() {
        return debug;
    }
}

Y después de instalarse proguard-project.txt.

-assumenosideeffects class com.neofect.rapael.client.DebugConfig {
    private static *** setDebug();
}

Preferiría usar esto a deshabilitar la Build Automaticallyopción, porque esto no depende de la configuración IDE individual del constructor, sino que se mantiene como un archivo comprometido que se comparte entre los desarrolladores.

neo.kim
fuente
1

No funciona correctamente, según tengo entendido ( problema de Android 22241 )

Tuve algunos problemas en un proyecto (trabajando con Eclipse), esa constante no estaba configurada como verdadera al exportar un APK firmado de mi proyecto :(

Aunque me encantaría escuchar que funciona

Vincent Mimoun-Prat
fuente
1
Debería haberse solucionado en r17, está marcado como tal en el rastreador de errores.
smith324
1
En realidad, las librerías no se compilan en modo de lanzamiento en ADT al exportar (funciona en Ant). He actualizado code.google.com/p/android/issues/detail?id=27940
Xavier Ducrohet
1
@Xav, gracias por investigarlo, dejaré de enviarte spam, lo prometo. En realidad, era el proyecto principal con el que estaba teniendo problemas (no miré la biblioteca dependiente). Si puedo crear un caso de prueba concreto, lo publicaré en el rastreador de errores bajo el mismo problema.
smith324
1

una buena forma es crear tu propia clase:

public class Log {

public static void d(String message) {
    if (BuildConfig.DEBUG)
        android.util.Log.d(
            "[" + (new Exception().getStackTrace()[1].getClassName()) + "]",
            "{" + (new Exception().getStackTrace()[1].getMethodName()) + "} "
            + message
        );
}

}
Bouchehboun Saad
fuente
12
El problema con este método es que, en caso de que DEBUG sea falso, Java seguirá calculando cada String para pasarlo a su clase personalizada. El if (DEBUG) Log.d (...) es menos elegante pero más eficiente.
Jeremyfa
0

He visto un comportamiento extraño que tiene que ver con cuando los valores en BuildConfig se establecen en sus valores finales. Esto puede tener algo que ver con su problema.

La explicación simple es que los valores predeterminados se establecen inicialmente antes de que se ejecute Proguard, luego, después de que se ejecute Proguard, el archivo BuildConfig se regenera con los valores adecuados. Sin embargo, Proguard ya ha optimizado su código en este punto y tiene problemas.

Aquí hay un error que creé contra Gradle. https://code.google.com/p/android/issues/detail?id=182449

CUENTO
fuente