Различение режима разработки и режима выпуска настройки среды на Android
Я создаю приложение для Android и хотел бы поддерживать несколько переменных среды, которые я могу настроить в зависимости от того, нахожусь ли я в режиме разработки или в режиме выпуска. Например, мне нужно вызвать веб-службу и URL-адрес будет отличаться в любом режиме. Я хотел бы экстернализировать эти и другие настройки, чтобы я мог легко изменить их в зависимости от моего целевого развертывания.
есть ли какие-либо рекомендации или что-нибудь в SDK, чтобы помочь с этой потребностью?
8 ответов:
согласно этому stackoverflow post, в SDK Tools версии 17 (мы находимся на 19 на момент написания этой статьи) добавляет
BuildConfig.DEBUG
константа, которая является истинной при построении сборки dev.
следующее решение предполагает, что в файле манифеста вы всегда устанавливаете
android:debuggable=true
при разработке иandroid:debuggable=false
для выпуска приложений.теперь вы можете проверить значение этого атрибута из кода путем проверки
ApplicationInfo.FLAG_DEBUGGABLE
флагApplicationInfo
полученные отPackageManager
.следующий фрагмент кода может помочь:
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);
Я бы проверил 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; }
Android build.gradle имеет ручки отладки и выпуска среды хорошо.
добавьте следующий фрагмент кода в
build.gradle
filebuildTypes { debug { buildConfigField "Boolean", "IS_DEBUG_MODE", 'true' } release { buildConfigField "Boolean", "IS_DEBUG_MODE", 'false' } }
теперь вы можете получить доступ к переменной, как показано ниже
if (BuildConfig.IS_DEBUG_MODE) { { //Debug mode. } else { //Release mode }
сегодня я случайно наткнулся на другой подход,который кажется действительно прямым.. Посмотрите на билд.Теги, когда приложение создается для разработки, это оценивается в строку "test-keys".
не становится намного проще, чем сравнение строк.
Тоже Строят.Модель и сборка.Продукт оценить в строку "google_sdk"на эмуляторе!
вот метод, который я использую:
http://whereblogger.klaki.net/2009/10/choosing-android-maps-api-key-at-run.html
Я использую его для переключения журнала отладки и ключа API Карт.