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?
ЗАМЕТКА
Если вы хотите, чтобы классы 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».