56

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

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

4

8 に答える 8

44

android:debuggable=true次の解決策は、マニフェストファイルで、開発中およびandroid:debuggable=falseアプリケーションリリース用に常に設定することを前提としています。

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

次のコードスニペットが役立つ可能性があります。

PackageInfo packageInfo = ... // get package info for your context
int flags = packageInfo.applicationInfo.flags; 
if ((flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
    // development mode
} else {
    // release mode
}
于 2010-07-08T14:10:42.770 に答える
32

このstackoverflowの投稿によると、SDK Toolsバージョン17(この記事の執筆時点では19)では、BuildConfig.DEBUG開発ビルドをビルドするときに真となる定数が追加されています。

于 2012-05-19T04:31:32.177 に答える
9

@viktor-bresan便利なソリューションをありがとう。現在のアプリケーションのコンテキストを取得して完全に機能する例にする一般的な方法を含めた方が便利です。以下の線に沿った何か:

PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
于 2011-01-18T01:02:47.010 に答える
8

Androidのbuild.gradleには、デバッグ環境とリリース環境をうまく処理できます。

次のコードスニペットをbuild.gradleファイルに追加します

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

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

これで、次のように変数にアクセスできます

    if (BuildConfig.IS_DEBUG_MODE) { {
        //Debug mode.
    } else {
        //Release mode
    }
于 2016-12-09T04:37:40.340 に答える
4

isDebuggerConnectedをチェックします

于 2009-11-16T17:44:00.043 に答える
3

以下のコードのようなものはどうですか...

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;

} 
于 2010-12-01T02:41:16.140 に答える
1

今日、偶然に別のアプローチに出くわしました。これは本当に簡単に思えます。Build.TAGSを見てください。アプリが開発用に作成されると、これは文字列「テストキー」に評価されます。

文字列の比較よりもはるかに簡単にはなりません。

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

于 2010-12-03T01:54:52.707 に答える
0

私が使用する方法は次のとおりです。

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

デバッグログとマップAPIキーを切り替えるために使用します。

于 2010-08-25T16:23:12.407 に答える