2009-11-16 11 views
52

Sto costruendo un'applicazione Android e vorrei mantenere alcune variabili d'ambiente che posso modificare a seconda che sia in modalità sviluppo o modalità di rilascio. Ad esempio, ho bisogno di invocare un servizio web e l'URL sarà leggermente diverso in entrambe le modalità. Mi piacerebbe esternalizzare questa e altre impostazioni così posso cambiarle facilmente in base alla mia distribuzione di destinazione.Distinzione modalità di sviluppo e impostazioni dell'ambiente modalità di rilascio su Android

Ci sono delle buone pratiche o qualcosa nell'SDK per aiutare con questa necessità?

risposta

28

Secondo questo StackOverflow post, in SDK Tools versione 17 (siamo in 19 stesura di questo documento) aggiunge una costante BuildConfig.DEBUG che è vero quando si costruisce una build dev.

+2

Contrassegnare questo come risposta accettata ora perché sarà probabilmente più applicabile ai futuri viaggiatori –

+0

Funziona per me in ** API 15 **, 4.0.3. –

+1

L'API non ha importanza, solo la versione degli strumenti di compilazione. – yincrash

3

avrei fatto il check out isDebuggerConnected

+1

Grazie, che può tornare utile un giorno, ma posso tecnicamente essere in esecuzione del emulatore in modalità di sviluppo con un debugger allegato. –

43

La seguente soluzione presuppone che nel file manifesto impostare sempre android:debuggable=true durante lo sviluppo e android:debuggable=false per il rilascio delle applicazioni.

Ora è possibile controllare il valore di questo attributo dal codice controllando il flag ApplicationInfo.FLAG_DEBUGGABLE nello ApplicationInfo ottenuto da PackageManager.

Il seguente frammento di codice potrebbe aiutare:

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

A partire dalle versioni SDK più recenti questo sembrerebbe l'approccio migliore, poiché sia ​​Eclipse che Ant lo impostano automaticamente in base al tipo di build. – Zulaxia

3

ne dite di qualcosa come il codice qui sotto ...

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; 

} 
+0

Il DEBUGKEY in questo caso è in realtà l'intero certificato. Raccomando invece di usare il metodo in http://stackoverflow.com/questions/6122401/android-compare-signature-of-current-package-with-debug-keystore. In questo modo, non sei limitato alla chiave di debug da una singola macchina. – Ralf

1

mi sono imbattuto in un altro approccio oggi un caso che sembra davvero semplice .. Guarda Build.TAGS, quando viene creato l'applicazione per lo sviluppo questo valuta la stringa "test-keys".

Non è molto più semplice di un confronto di stringhe.

Anche Build.MODEL e Build.PRODUCT valutano la stringa "google_sdk" sull'emulatore!

+0

È affidabile? Sembra che le chiavi di prova possano essere impostate per i dispositivi rooted: http://stackoverflow.com/questions/1101380/determine-if-running-on-a-rooted-device Questo mi fa pensare che potrebbero esserci altri casi in cui questo approccio potrebbe fallire. – christoff

+0

No, questo non è affidabile. – shkschneider

9

@ viktor-bresan Grazie per una soluzione utile. Sarebbe più utile se tu inserissi semplicemente un modo generale per recuperare il contesto dell'applicazione corrente per renderlo un esempio pienamente funzionante. Qualcosa sulla falsariga del sottostante:

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

Android build.gradle gestisce correttamente l'ambiente di debug e rilascio.

aggiungere il seguente frammento di codice in build.gradle file di

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

    release { 
     buildConfigField "Boolean", "IS_DEBUG_MODE", 'false' 
    } 
} 

Ora è possibile accedere alla variabile come qui di seguito

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