Различение режима разработки и настроек режима среды на Android - PullRequest
54 голосов
/ 16 ноября 2009

Я создаю приложение для Android и хотел бы сохранить несколько переменных среды, которые я могу настроить в зависимости от того, нахожусь ли я в режиме разработки или в режиме выпуска. Например, мне нужно вызвать веб-сервис, и URL будет немного отличаться в любом режиме. Я хотел бы вывести этот и другие параметры на внешний вид, чтобы их можно было легко изменить в зависимости от целевого развертывания.

Есть ли в SDK лучшие практики или что-то еще, чтобы помочь с этой потребностью?

Ответы [ 8 ]

44 голосов
/ 08 июля 2010

Следующее решение предполагает, что в файле манифеста вы всегда устанавливаете 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
}
28 голосов
/ 19 мая 2012

Согласно этому стековому потоку post , в SDK Tools версии 17 (на момент написания этой статьи у нас 19) добавляется константа BuildConfig.DEBUG, которая имеет значение true при построении сборки dev.

9 голосов
/ 18 января 2011

@ viktor-bresan Спасибо за полезное решение. Было бы более полезно, если бы вы просто включили общий способ получения контекста текущего приложения, чтобы сделать его полностью рабочим примером. Что-то вроде следующего:

PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
6 голосов
/ 09 декабря 2016

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
    }
4 голосов
/ 16 ноября 2009

Я бы проверил isDebuggerConnected

3 голосов
/ 01 декабря 2010

Как на счет кода ниже ...

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;

} 
1 голос
/ 03 декабря 2010

Сегодня я случайно натолкнулся на другой подход, который кажется очень простым ... Посмотрите на Build.TAGS, когда приложение создается для разработки, оно оценивается как "тест-ключи" строки.

Не намного проще, чем сравнение строк.

Также Build.MODEL и Build.PRODUCT оценивают строку "google_sdk" на эмуляторе!

0 голосов
/ 25 августа 2010

Вот метод, который я использую:

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

Я использую его для переключения журнала отладки и ключа API карт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...