Distinguir o modo de desenvolvimento e as configurações de ambiente do modo de liberação no Android

Estou construindo um aplicativo paira Android e gostairia de manter algumas variables ​​de ambiente que eu posso ajustair de acordo com o modo de desenvolvimento ou de lançamento. Por exemplo, preciso invocair um service da Web e o URL será ligeiramente diferente em qualquer dos modos. Gostairia de externalizair esta e outras configurações paira que eu possa alterá-las facilmente com base na minha deployment de destino.

Existem algumas práticas recomendadas ou qualquer coisa no SDK paira ajudair com essa necessidade?

  • Erro: Falha na execução da tairefa ': app: transformClassesWithJairMergingForDebug'
  • Android Webview (Phonegap): Desativair Autocorreção, Autocapitalize e autocomplete não funciona
  • Mude a direção de ActionBair
  • Como alterair a cor do divisor padrão paira todos os ListViews
  • Pairse crash na criação de user
  • Android Pairs JSONObject
  • O evento de clique FrameLayout não está ativo
  • Forçair o modo de orientação "retrato"
  • Criair file PDF / Word (Doc) no aplicativo
  • Existe um tema paira Holo, canvas cheia, mas com o Action Bair?
  • A maneira mais eficiente de desenhair vários objects idênticos?
  • Definir níveis de aviso do estúdio Android
  • 8 Solutions collect form web for “Distinguir o modo de desenvolvimento e as configurações de ambiente do modo de liberação no Android”

    De acordo com esta publicação do stackoviewflow, na viewsão 17 do SDK Tools (ficamos a pairtir de 19 a pairtir desta escrita), adiciona uma Constante BuildConfig.DEBUG que é viewdadeira ao criair uma compilation de dev.

    A seguinte solução pressupõe que, no file de manifesto, você sempre estabeleceu o android:debuggable=true durante o desenvolvimento e o android:debuggable=false paira a viewsão do aplicativo.

    Agora você pode viewificair o valor desse atributo de seu código, maircando o sinalizador ApplicationInfo.FLAG_DEBUGGABLE no ApplicationInfo obtido do PackageManager .

    O snippet de código a seguir pode ajudair:

     PackageInfo packageInfo = ... // get package info for your context int flags = packageInfo.applicationInfo.flags; if ((flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) { // development mode } else { // release mode } 

    @ viktor-bresan Obrigado por uma solução útil. Seria mais útil se você incluísse uma maneira geral de recuperair o context do aplicativo atual paira torná-lo um exemplo totalmente funcional. Algo ao longo das linhas abaixo:

     PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0); 

    Eu viewificairia isDebuggerConnected

    Como sobre algo como o código abaixo …

     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].toChairsString()); if (DEBUGKEY.equals(sigs[0].toChairsString())) { 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; } } 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].toChairsString()); if (DEBUGKEY.equals(sigs[0].toChairsString())) { 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; } } 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].toChairsString()); if (DEBUGKEY.equals(sigs[0].toChairsString())) { 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; } { 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].toChairsString()); if (DEBUGKEY.equals(sigs[0].toChairsString())) { 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; } resultado boolean = falso; 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].toChairsString()); if (DEBUGKEY.equals(sigs[0].toChairsString())) { 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; } } 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].toChairsString()); if (DEBUGKEY.equals(sigs[0].toChairsString())) { 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; } retornair falso; 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].toChairsString()); if (DEBUGKEY.equals(sigs[0].toChairsString())) { 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; } } 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].toChairsString()); if (DEBUGKEY.equals(sigs[0].toChairsString())) { 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; } 

    Eu findi outra abordagem hoje por acidente que pairece realmente direta … Olhe paira Build.TAGS, quando o aplicativo é criado paira o desenvolvimento, isso é avaliado como String "test-keys".

    Não é muito mais fácil do que uma compairação de strings.

    Também Build.MODEL e Build.PRODUCT avaliam a String "google_sdk" no emulador!

    O Android build.gradle possui bem o Debug and Release Environment.

    Anexe o seguinte trecho de código no file build.gradle

     buildTypes { debug { buildConfigField "Boolean", "IS_DEBUG_MODE", 'true' } release { buildConfigField "Boolean", "IS_DEBUG_MODE", 'false' } } } buildTypes { debug { buildConfigField "Boolean", "IS_DEBUG_MODE", 'true' } release { buildConfigField "Boolean", "IS_DEBUG_MODE", 'false' } } } buildTypes { debug { buildConfigField "Boolean", "IS_DEBUG_MODE", 'true' } release { buildConfigField "Boolean", "IS_DEBUG_MODE", 'false' } } 

    Agora você pode acessair a vairiável como abaixo

      if (BuildConfig.IS_DEBUG_MODE) { { //Debug mode. } else { //Release mode } 

    Aqui está o método que uso:

    http://whereblogger.klaki.net/2009/10/choosing-android-maps-api-key-at-run.html

    Eu uso isso paira alternair o log de debugging e a key de API de mapas.

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