Android Gradle исключает классы для Debug BuildType

Bakground

Я использую Google Play Services в своем проекте по разным причинам. Службы Google Play – это большая зависимость, которая значительно увеличивает мое время сборки. Поэтому я хотел бы отключить Google Play Services для своей версии «Debug», чтобы быстрее скомпилировать свой проект.

Что я делаю ?

Чтобы исключить сервисы Google Play во время моих отладочных сборников, я просто выполняю условную компиляцию следующим образом:

releaseCompile 'com.google.android.gms:play-services-plus:7.5.+' releaseCompile 'com.google.android.gms:play-services-ads:7.5.+' releaseCompile 'com.google.android.gms:play-services-gcm:7.5.+' 

Таким образом, службы Google Play компилируются только для версий релизов, а также не включены в сборку Debug. Это так хорошо.

Ловушка

В моем коде есть несколько классов, которые зависят от сервисов Google Play. Я могу легко абстрагировать их с помощью интерфейсов и загружать заглушки. Но проблема в том, что эти классы все еще компилируются во время сборки «Debug», хотя я не Ссылаясь на них напрямую (на самом деле я загружаю их с помощью рефлексии).

Временное решение

Чтобы игнорировать ошибки компиляции для классов, которые я не использую, я просто исключаю их из исходных наборов в тип сборки отладки следующим образом:

  debug { minifyEnabled false sourceSets { main { java { exclude '**/tracking/impl/**' exclude '**/GoogleApiClientWrapper.java' } } } } 

И проблема решена, я могу скомпилировать версию «Отладка» без сервисов Google Play, а время сборки – быстрее.

Проблема

Несмотря на то, что я указываю блок sourceSets только в стиле сборки «Отладка», я заметил, что эти классы все равно разделяются даже в типах сборки выпуска. Зачем ? Как я могу исключить эти классы ТОЛЬКО для типа сборки Debug?

ЗАМЕТКА

  • Уже настроенные правила proguard, чтобы не стирать эти классы (поскольку я использую отражение)
  • Отключенная proguard для выпуска сборки
  • Пытался определить исходные наборы в разных местах (даже в ароматах), похоже, что последний параметр sourceSet переопределяет все предыдущие.

Если вы хотите, чтобы классы Java были уникальны для какого-либо типа сборки или вкуса продукта, поместите их в источник для этого типа сборки или продукта.

Если у вас есть типичная структура проекта Gradle для Android, где-то у вас есть src/main/java/ , где есть классы Java в соответствующих каталогах на основе имени пакета. Эти классы, находящиеся в main источнике, используются для всех сборок.

Если вы хотите, чтобы классы использовались только в сборке release , создайте каталог src/release/java/ и переместите эти классы из src/main/java/ в src/release/java/ .

В сборке debug классы release игнорируются. В сборке release используются классы release .

Обратите внимание, что вы не можете использовать эту технику для замены классов в main . Таким образом, вы не можете иметь com.ivelius.awesomeapp.Foo в main и другом com.ivelius.awesomeapp.Foo в release – вы получите некоторую форму ошибки «duplicate class».

Intereting Posts
Показывать уведомление пользователю в определенное время, но оно появляется каждый раз, когда я закрываю или открываю приложение? Attr / colorError не найдена ошибка при использовании com.android.support:recyclerview-v7:26.0.0-beta2 Несколько операторов вставки android sqlite Панель инструментов ActionMode pre pre Lollipop не работает Элемент проверки JSON Java – это JSONArray или JSONObject КоординаторLayout + AppbarLayout + Viewpager не изменяет размер дочернего макета Какова наилучшая практика для разблокировки функций приложения для пользователя на Android? SSLException, связанный с отправкой товара для услуги Amazon DownloadManager загружает файлы более 2,1 ГБ Android – Загрузка, пожалуйста, подождите Как поймать нажатие клавиши «Готово» с помощью мягкой клавиатуры Android: как повернуть LinearLayout Как настроить USB-драйвер для ADB для Sony Smartwatch 3 в Windows 10 Как скопировать меньший растровый рисунок в более крупный? Преимущество использования DialogFragment над простым AlertDialog?