私はAndroidアプリケーションを開発しており、開発モードかリリースモードかによって調整できるいくつかの環境変数を維持したいと考えています。たとえば、Webサービスを呼び出す必要があり、どちらのモードでもURLが少し異なります。私はこの設定や他の設定を外部化したいので、ターゲット展開に基づいて簡単に変更することができます。Androidの開発モードとリリースモードの環境設定を区別する
このニーズを支援するためのベストプラクティスまたはSDKの何かがありますか?
私はAndroidアプリケーションを開発しており、開発モードかリリースモードかによって調整できるいくつかの環境変数を維持したいと考えています。たとえば、Webサービスを呼び出す必要があり、どちらのモードでもURLが少し異なります。私はこの設定や他の設定を外部化したいので、ターゲット展開に基づいて簡単に変更することができます。Androidの開発モードとリリースモードの環境設定を区別する
このニーズを支援するためのベストプラクティスまたはSDKの何かがありますか?
このstackoverflowのpostによると、SDKツールのバージョン17では(私たちはこれを書いている時点では19にしている)のdevのビルドを構築するときに真であるBuildConfig.DEBUG
定数を追加します。
私は、次の解決策は、アプリケーションの開発とリリースのandroid:debuggable=false
ながら、マニフェストファイルには、必ずandroid:debuggable=true
を設定することを前提としていisDebuggerConnected
おかげで、以下のような変数にアクセスすることができますが、私は技術的に実行することができbuild.gradle
ファイル
buildTypes { debug { buildConfigField "Boolean", "IS_DEBUG_MODE", 'true' } release { buildConfigField "Boolean", "IS_DEBUG_MODE", 'false' } }
に次のコードスニペットを追加エミュレータはデバッガなしで開発モードにあります。 –
チェックアウトするでしょう。
PackageManager
から取得したApplicationInfo
の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
}
より最近のSDKのバージョンでは、EclipseとAntの両方がビルドの種類に応じて自動的にこれを設定するので、これは最善のアプローチと思われます。 – Zulaxia
は、ここで私が使用する方法です。
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;
}
これは、あなたの鍵をJavaでハードコーディングさせます。これは一般的な方法ではなく悪いことです。 – shkschneider
String "test-keys"を評価します。
文字列比較よりもはるかに簡単です。
また、Build.MODELとBuild.PRODUCTは、エミュレータの文字列 "google_sdk"に評価されます。
この場合、DEBUGKEYは実際には証明書全体です。代わりにhttp://stackoverflow.com/questions/6122401/android-compare-signature-of-current-package-with-debug-keystoreのメソッドを使用することをお勧めします。この方法では、単一のマシンからのデバッグキーに限定されません。 – Ralf
これは信頼できますか?テストされたキーがルートされたデバイスに設定できるようです:http://stackoverflow.com/questions/1101380/determine-if-running-on-a-rooted-device これは、このアプローチは失敗する可能性があります。 – christoff
これは信頼できません。 – shkschneider
@ viktor-bresan便利なソリューションをありがとう。現在のアプリケーションのコンテキストを取得して完全に実用的な例にする一般的な方法を追加したばかりであれば、もっと役に立ちます。以下の線に沿って何か:
PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
今、あなたは便利な一日で来るかもしれ
if (BuildConfig.IS_DEBUG_MODE) { {
//Debug mode.
} else {
//Release mode
}
これは、将来の旅行者にもっと適用される可能性が高いので、これを受け入れられた回答としてマークしてください。 –
** API 15 **、4.0.3で私のために働きます。 –
APIは問題ではなく、ビルドツールのバージョンだけです。 – yincrash