55 votes

Distinguer les paramètres d'environnement en mode de développement et en mode de lancement sur Android

Je construis une application Android et souhaite conserver quelques variables d'environnement que je peux modifier en fonction du mode de développement ou de publication. Par exemple, j'ai besoin d'appeler un service Web et l'URL sera légèrement différente dans les deux modes. J'aimerais externaliser ce paramètre et d'autres paramètres afin de pouvoir les modifier facilement en fonction de mon déploiement cible.

Existe-t-il des meilleures pratiques ou quelque chose dans le SDK pour répondre à ce besoin?

Merci

44voto

Viktor Brešan Points 2458

La solution suivante suppose que, dans le fichier manifeste, vous définissez toujours android:debuggable=true lors du développement et android:debuggable=false pour la version de l'application.

Vous pouvez maintenant vérifier la valeur de cet attribut à partir de votre code en cochant l'indicateur ApplicationInfo.FLAG_DEBUGGABLE dans les ApplicationInfo obtenus à partir de PackageManager .

L'extrait de code suivant pourrait aider:

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

29voto

yincrash Points 2344

Selon cette stackoverflow post , dans SDK Tools version 17 (nous sommes le 19 de cette écriture) ajoute un BuildConfig.DEBUG constante qui est vrai lors de la construction d' une construction dev.

9voto

Eron Villarreal Points 587

@ viktor-bresan Merci pour cette solution utile. Il serait plus utile de simplement inclure un moyen général de récupérer le contexte de l'application en cours pour en faire un exemple pleinement fonctionnel. Quelque chose du genre:

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

4voto

Joseph Points 18099

Je voudrais vérifier isDebuggerConnected

3voto

Jeff S Points 1815

Que diriez-vous de quelque chose comme le code ci-dessous ...

 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;

} 
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X