Подтвердить что ты не робот

Отличительные особенности режима разработки и режима среды выпуска на Android

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

Есть ли какие-либо рекомендации или что-либо в SDK для помощи в этой необходимости?

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);

Ответ 5

Как о чем-то вроде кода ниже...

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;

} 

Ответ 6

Android build.gradle хорошо работает с Debug и Release Environment.

Добавьте следующий фрагмент кода в файл 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
    }

Ответ 7

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

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

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