Ответ 1
В соответствии с этим stackoverflow post, в SDK Tools версии 17 (мы на 19 как этой записи) добавляет константу BuildConfig.DEBUG
, которая истинна при создании сборки dev.
Я создаю приложение для Android и хочу поддерживать несколько переменных окружения, которые я могу настроить в зависимости от того, находится ли я в режиме разработки или режиме выпуска. Например, мне нужно вызвать веб-службу, и URL-адрес будет немного отличаться в любом режиме. Я хотел бы экстернализировать эту и другие настройки, чтобы я мог легко их изменить на основе моего целевого развертывания.
Есть ли какие-либо рекомендации или что-либо в SDK для помощи в этой необходимости?
В соответствии с этим 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;
}
Добавьте следующий фрагмент кода в файл 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
}
Сегодня я случайно столкнулся с другим методом, который кажется действительно прямым. Посмотрите на Build.TAGS, когда приложение создано для разработки, это оценивается в "тестовых ключах" String.
Не намного легче, чем сравнение строк.
Также Build.MODEL и Build.PRODUCT оценивают строку "google_sdk" на эмуляторе!
Здесь используется метод, который я использую:
http://whereblogger.klaki.net/2009/10/choosing-android-maps-api-key-at-run.html
Я использую его для переключения журнала отладки и ключа API карт.