Дифференцирование отладочной и производственной сборки приложения для Android

Недавно я начал изучать разработку приложений для Android. Это также мой первый опыт работы с языком Java.

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

В iOS мы можем использовать конфигурацию сборки для связывания с библиотеками отладки только для отладочных сборников и использовать макросы для удаления частей кода, которые относятся к отладке. Это позволяет легко переключаться между отладочными и производственными сборками. В любом случае, для Android?

Пока что ближе всего я использую профили Maven для перезаписи файлов свойств, которые загружаются приложением, но для этого требуется, чтобы библиотеки отладки все еще были импортированы.


Чтобы прояснить мой вопрос, вот что я хочу сделать: я создал библиотеку, которая позволит вам просматривать базу данных SQLite в вашем браузере. Это действительно полезно для целей отладки, но я не хочу отправлять свое приложение в библиотеку.

Другая цель – использовать HockeyApp. HockeyApp предоставляет две функции: уведомление об обновлении и отчеты о сбоях. Мне нужно три разных сборки для этого:

  • Производство: отчет о сбоях вкл., Уведомление об обновлении
  • Бета: Оба
  • Отладка: обе

В <application> манифеста вы можете установить атрибут debuggable . Eclipse делает это автоматически, если вы опустите атрибут. Отладочные сборки имеют debuggable=true , хорошо экспортированные сборки имеют debuggable=false .

Это влияет на Log.d, и вы можете условно проверить код, используя следующее:

 boolean isDebuggable = (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE)); 

В дополнение к Maven одним из способов является использование инжектора зависимости, такого как кинжал

Создавая стандартные аннотации javax.inject (JSR-330), каждый класс легко тестировать. Вам не нужна куча шаблонов, чтобы обменять RpcCreditCardService на FakeCreditCardService.

Включение зависимостей не только для тестирования. Это также упрощает создание многоразовых взаимозаменяемых модулей. Вы можете использовать один и тот же AuthenticationModule во всех своих приложениях. И вы можете запустить DevLoggingModule во время разработки и ProdLoggingModule в процессе производства, чтобы получить правильное поведение в каждой ситуации.

Один из способов решить это – проверить возвращаемое значение PackageManager # getInstallerPackageName . Он возвращает null, если apk был установлен вручную через adb через веб-страницу или через службу, такую ​​как HockeyApp. На самом деле, я недавно добавил подобную проверку в наш sdk, см. Эту фиксацию .

Обратите внимание, что это решение является надежным только в том случае, если вы распространяете свое (оплачиваемое) приложение только в Google Play. В прошлый раз, когда я проверял, альтернативные магазины, такие как магазин приложений Amazon или Android, не устанавливали источник установки (его можно установить с уровня API 11, см. PackageManager # setInstallerPackageName ).

Другой вариант – проверить имя пакета во время выполнения. Для ваших бета-версий вы добавляете «.beta» к имени пакета, а затем проверяете этот суффикс для включения обновлений приложений или отладки. Вы можете сделать это, переместив базу кода в проект библиотеки и настроив два проекта приложения, которые ссылаются на этот проект библиотеки: один для приложения магазина, один для бета-приложения. Наше использование адаптируется с параметром --rename-manifest-package для изменения имени пакета бета-версий (см. Подробности здесь ).

У вас есть функция BuildConfig.DEBUG, созданная с помощью инструмента android adt

/ Ген / BuildConfig

Intereting Posts
Как передать Bluetooth-сокет другому действию с использованием интерфейса приложения ViewRootImpl: ViewPostImeInputStage processPointer 0 на OnItemClick из списка в android Экспорт неподписанного apk из проекта Gradle в Android Studio Как отправлять электронные письма с большими вложениями с помощью API-интерфейсов gmail на Android Получение размеров размеров appwidget (или обойти его) Что делать, когда – java.io.FileNotFoundException: Нет контент-провайдера? Как открыть LogCat в Eclipse (для Android Debug) Android FileObserver передает недокументированное событие 32768 Двойной эспрессо, не работающий с Robolectric Есть ли способ подавить предупреждение о низком заряде батареи на устройствах Android или отклонить всплывающее окно предупреждения? Android – невозможно открыть содержимое: файл: /// storage / emulated / 0 Android Bluetooth Bluetooth Bluetooth Low Energy Изображения не загружаются в android 5.0, используя библиотеку picasso Используйте KeyPairGeneratorSpec для уровня API Android <18? Android анимация один за другим