Intereting Posts
Уведомление о брандмауэре Android запускает новое приложение, хотя оно уже запущено. Как синхронизировать запуск приложения со значком приложения и уведомлением staus bar? История просмотра WebView без перенаправления Использование SyncAdapter без создания учетной записи Android: Как совместить Spannable.setSpan с String.format? CheckBox дважды меняет значение Как вы можете получить адрес электронной почты пользователя Android? Импортировать проект eclipse в студию Android – ошибка «этот проект относится к рабочему пространству Eclipse …» Исключение ValueRequired При использовании Simple-XML-Framework Объяснение метода getPixels для растрового изображения в Android Есть неустранимые ошибки, которые необходимо исправить сначала Смотрите результаты logcat через Wi-Fi? Framework7 внутри страниц веб-просмотра не загружается Android: оттенок с использованием DrawableCompat Android – очистка истории при навигации между действиями Не удалось выполнить регистрацию в Google Cloud Messaging

Release-Debug Builds для Android-приложений

В C ++ я бы обычно настраивал 2 сборки – отлаживал и выпускал, каждый из которых имел предопределенные DEBUG и RELEASE соответственно. Затем я использовал эти определения для определения постоянных значений, таких как включение / отключение регистрации, URL-адрес сервера и т. Д.

Прямо сейчас, в Java / Android, я комментирую некоторые вещи перед выпуском. Я не могу сказать. Я могу кое-что забыть.

Что такое обычная практика для обеспечения того, чтобы ничего не забывалось при создании версии (подписанной) или отладочной версии (без знака)?

Solutions Collecting From Web of "Release-Debug Builds для Android-приложений"

Нет (по умолчанию) любого препроцессора для Java, поэтому во время компиляции нет #ifdef . Но если вы не возражаете оставить код отладки в своем приложении, то вы можете проверить, будет ли приложение выпущено или отлажено во время выполнения с помощью этого кода:

 Boolean release = (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE); 

debuggable проверяет значение debuggable флага. И указанный флэг автоматически устанавливается в false для релизов и имеет значение true для отладочной сборки.

Если вы хотите избавиться от некоторого кода отладки, вы можете попробовать использовать ProGuard для разделения определенных классов или методов. И по умолчанию ProGuard участвует только в создании процесса для выпуска версий.

Если вы запускаете приложение из Eclipse, он всегда будет отлаживать.

При экспорте приложения (Android Tools -> Export (un) подписанный пакет приложений)

Если вы хотите узнать динамически, если его релиз или отладка, вы можете использовать BuildConfig.DEBUG (его расположение в папке gen, я не знаю, поддерживается ли это всеми уровнями API)

Как и следовало:

 if (BuildConfig.DEBUG) { Log.d(TAG, "Text"); } 

Если вы посмотрите на сгенерированные байт-коды, вы увидите следующее (в режиме отладки):

 public class Sample{ private static final boolean LOG_ENABLED = true; public static void main(String args[]){ if (BuildConfig.DEBUG){ System.out.println("Hello World"); } } } 

Производит следующие байткоды:

 public class Sample extends java.lang.Object{ public Sample(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3; //String Hello World 5: invokevirtual #4; //Method Java/io/PrintStream.println(Ljava/lang/String;)V 8: return } 

И если BuildConfig.DEBUG является ложным

 public class Sample extends java.lang.Object{ public Sample(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: return } 

Обычно я создаю отдельный класс журнала, где я устанавливаю старую переменную DEBUG. Теперь все, что мне нужно сделать, прежде чем создавать сборку сборки, это установить для переменной DEBUG значение false.

 public class Log { public final static String LOGTAG = "APP NAME"; public static final boolean DEBUG = true; public static void v(String msg) { android.util.Log.v(LOGTAG, msg); } public static void e(String msg) { android.util.Log.e(LOGTAG, msg); } public static void d(String msg) { android.util.Log.d(LOGTAG, msg); } } 

Для регистрации –

 if(Log.DEBUG) Log.v("In some function x. Doing y."); 

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

-Если вы работаете в eclipse, вы должны использовать перспективу Java EE. Вместо этого просто выберите перспективу Java.

-Используйте приложение. -установить приложение с устройства. -Установите свое устройство (просто так, чтобы кеш не был сохранен). Запустите приложение.

На этот раз режим отладки не появится. Скопируйте apk, сгенерированный в папку bin, и попробуйте его на других устройствах.

Я нашел способ прилично подражать директиве предварительной обработки:

В моем Gradle buildTypes я определяю:

 release { buildConfigField "boolean", "isDebug", "false" ... } debug { buildConfigField "boolean", "isDebug", "true" ... } 

Затем в моем коде я делаю следующее:

 if (BuildConfig.isDebug) { ... do debug stuff ... } 

И, при необходимости, конечно:

 else { ... do release stuff ... } 

Оба блока присутствуют в debug APK, но при создании версии release Proguard достаточно умен, чтобы определить, что блок debug можно удалить, поскольку он зависит от if (false) (который также удаляется из полученного кода).

Если вы вызываете некоторые отладочные классы из блока debug и только оттуда, они будут удалены из полученного APK, поскольку они считаются неиспользованными , и это также интересный момент: ваш код не может быть отпущен так, как он будет использоваться Это код.

Я мог бы определить все это, проверив мои файлы dump , mapping и usage Proguard.