2009-11-16 16 views
52

私はAndroidアプリケーションを開発しており、開発モードかリリースモードかによって調整できるいくつかの環境変数を維持したいと考えています。たとえば、Webサービスを呼び出す必要があり、どちらのモードでもURLが少し異なります。私はこの設定や他の設定を外部化したいので、ターゲット展開に基づいて簡単に変更することができます。Androidの開発モードとリリースモードの環境設定を区別する

このニーズを支援するためのベストプラクティスまたはSDKの何かがありますか?

答えて

28

このstackoverflowのpostによると、SDKツールのバージョン17では(私たちはこれを書いている時点では19にしている)のdevのビルドを構築するときに真であるBuildConfig.DEBUG定数を追加します。

+2

これは、将来の旅行者にもっと適用される可能性が高いので、これを受け入れられた回答としてマークしてください。 –

+0

** API 15 **、4.0.3で私のために働きます。 –

+1

APIは問題ではなく、ビルドツールのバージョンだけです。 – yincrash

3

私は、次の解決策は、アプリケーションの開発とリリースのandroid:debuggable=falseながら、マニフェストファイルには、必ずandroid:debuggable=trueを設定することを前提としていisDebuggerConnected

+1

おかげで、以下のような変数にアクセスすることができますが、私は技術的に実行することができbuild.gradleファイル

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

に次のコードスニペットを追加エミュレータはデバッガなしで開発モードにあります。 –

43

チェックアウトするでしょう。

PackageManagerから取得したApplicationInfoApplicationInfo.FLAG_DEBUGGABLEフラグをチェックすることで、この属性の値をコードから確認できます。

次のコードスニペットは、助けることができる:

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

より最近のSDKのバージョンでは、EclipseとAntの両方がビルドの種類に応じて自動的にこれを設定するので、これは最善のアプローチと思われます。 – Zulaxia

0

は、ここで私が使用する方法です。

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

私は、デバッグログとマップのAPIキーを切り替えるためにそれを使用します。アプリは開発のためにこれを作成したとき、私は、Build.TAGSを見て...本当にまっすぐ進むようだ事故で、今日別のアプローチに出くわしたどのように以下のコードのようなものについて...

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

これは、あなたの鍵をJavaでハードコーディングさせます。これは一般的な方法ではなく悪いことです。 – shkschneider

3

String "test-keys"を評価します。

文字列比較よりもはるかに簡単です。

また、Build.MODELとBuild.PRODUCTは、エミュレータの文字列 "google_sdk"に評価されます。

+0

この場合、DEBUGKEYは実際には証明書全体です。代わりにhttp://stackoverflow.com/questions/6122401/android-compare-signature-of-current-package-with-debug-keystoreのメソッドを使用することをお勧めします。この方法では、単一のマシンからのデバッグキーに限定されません。 – Ralf

1

+0

これは信頼できますか?テストされたキーがルートされたデバイスに設定できるようです:http://stackoverflow.com/questions/1101380/determine-if-running-on-a-rooted-device これは、このアプローチは失敗する可能性があります。 – christoff

+0

これは信頼できません。 – shkschneider

9

@ viktor-bresan便利なソリューションをありがとう。現在のアプリケーションのコンテキストを取得して完全に実用的な例にする一般的な方法を追加したばかりであれば、もっと役に立ちます。以下の線に沿って何か:

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

Android build.gradleには、ハンドルとデバッグリリース環境があります。

今、あなたは便利な一日で来るかもしれ

if (BuildConfig.IS_DEBUG_MODE) { { 
     //Debug mode. 
    } else { 
     //Release mode 
    } 
関連する問題