Androidアプリケーションを構築していて、開発モードかリリースモードかに応じて微調整できるいくつかの環境変数を維持したいと考えています。たとえば、を呼び出す必要があります。 WebサービスとURLはどちらのモードでもわずかに異なります。この設定やその他の設定を外部化して、ターゲットの展開に基づいて簡単に変更できるようにしたいと思います。
このニーズを支援するためのベストプラクティスやSDKに何かありますか?
このstackoverflow post によると、SDK Toolsバージョン17(この記事の執筆時点では19)では、開発ビルドのビルド時にtrueとなるBuildConfig.DEBUG
定数が追加されています。
次の解決策は、マニフェストファイルで、開発中は常にAndroid:debuggable=true
を設定し、アプリケーションリリース用にAndroid:debuggable=false
を設定することを前提としています。
これで、ApplicationInfo
から取得したPackageManager
のApplicationInfo.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
}
@ viktor-bresan便利なソリューションをありがとう。現在のアプリケーションのコンテキストを取得して完全に機能する例にする一般的な方法を含めた方が便利です。以下の線に沿った何か:
PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
次のコードスニペットを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
}
私はチェックアウトします isDebuggerConnected
以下のコードのようなものはどうですか...
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;
}
今日、偶然に別のアプローチに出くわしました。これは本当に簡単に思えます。Build.TAGSを見てください。アプリが開発用に作成されると、これは文字列「test-keys」に評価されます。
文字列の比較よりもはるかに簡単にはなりません。
また、Build.MODELとBuild.PRODUCTは、エミュレーターで文字列「google_sdk」に評価されます。
これが私が使用する方法です:
http://whereblogger.klaki.net/2009/10/choosing-Android-maps-api-key-at-run.html
デバッグログとマップAPIキーを切り替えるために使用します。