studio - Distinguir el modo de desarrollo y la configuración del entorno del modo de lanzamiento en Android
programacion android pdf 2018 (8)
Estoy construyendo una aplicación de Android y me gustaría mantener algunas variables de entorno que puedo modificar dependiendo de si estoy en modo de desarrollo o en modo de lanzamiento. Por ejemplo, necesito invocar un servicio web y la URL será ligeramente diferente en cualquier modo. Me gustaría externalizar esta y otras configuraciones para poder cambiarlas fácilmente en función de mi implementación de destino.
¿Existen mejores prácticas o algo en el SDK para ayudar con esta necesidad?
Android build.gradle maneja bien el entorno de depuración y liberación.
Añada el siguiente fragmento de código en el archivo build.gradle
buildTypes {
debug {
buildConfigField "Boolean", "IS_DEBUG_MODE", ''true''
}
release {
buildConfigField "Boolean", "IS_DEBUG_MODE", ''false''
}
}
Ahora puedes acceder a la variable como a continuación
if (BuildConfig.IS_DEBUG_MODE) { {
//Debug mode.
} else {
//Release mode
}
¿Qué tal algo así como el código de abajo ...
public void onCreate Bundle b ) {
super.onCreate(savedInstanceState);
if ( signedWithDebugKey(this,this.getClass()) ) {
blah blah blah
}
blah
blah
blah
}
static final String DEBUGKEY =
"get the debug key from logcat after calling the function below once from the emulator";
public static boolean signedWithDebugKey(Context context, Class<?> cls)
{
boolean result = false;
try {
ComponentName comp = new ComponentName(context, cls);
PackageInfo pinfo = context.getPackageManager().getPackageInfo(comp.getPackageName(),PackageManager.GET_SIGNATURES);
Signature sigs[] = pinfo.signatures;
for ( int i = 0; i < sigs.length;i++)
Log.d(TAG,sigs[i].toCharsString());
if (DEBUGKEY.equals(sigs[0].toCharsString())) {
result = true;
Log.d(TAG,"package has been signed with the debug key");
} else {
Log.d(TAG,"package signed with a key other than the debug key");
}
} catch (android.content.pm.PackageManager.NameNotFoundException e) {
return false;
}
return result;
}
@ viktor-bresan Gracias por una solución útil. Sería más útil si solo incluyeras una forma general de recuperar el contexto de la aplicación actual para que sea un ejemplo totalmente funcional. Algo en la línea del siguiente:
PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
Este es el método que uso:
http://whereblogger.klaki.net/2009/10/choosing-android-maps-api-key-at-run.html
Lo uso para alternar el registro de depuración y la clave de la API de mapas.
La siguiente solución asume que en el archivo de manifiesto siempre establece android:debuggable=true
mientras desarrolla y android:debuggable=false
para el lanzamiento de la aplicación.
Ahora puede verificar el valor de este atributo desde su código marcando el indicador ApplicationInfo.FLAG_DEBUGGABLE
en la ApplicationInfo
obtenida de PackageManager
.
El siguiente fragmento de código podría ayudar:
PackageInfo packageInfo = ... // get package info for your context
int flags = packageInfo.applicationInfo.flags;
if ((flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
// development mode
} else {
// release mode
}
Me encontré con otro enfoque hoy por accidente que parece realmente sencillo. Mira Build.TAGS, cuando la aplicación se crea para desarrollo, se evalúa como "claves de prueba" de String.
No es mucho más fácil que una comparación de cuerdas.
¡También Build.MODEL y Build.PRODUCT evalúan a la Cadena "google_sdk" en el emulador!
De acuerdo con esta post , en SDK Tools versión 17 (estamos en 19 en el momento de escribir esto) agrega una constante BuildConfig.DEBUG
que es verdadera al construir una compilación de desarrollo.