Android: загрузка библиотеки и ее использование только для ветки разработки, а не для выпуска

Постановка проблемы: я хочу использовать библиотеку только в среде разработки, но не в выпуске (выпуск в магазине приложений). И я не хочу, чтобы эта библиотека также была встроена в выпуск apk.

Мой подход:

Итак, у меня есть такая настройка среды:

Разработка -

  1. Отлаживать
  2. Выпускать

Хранить -

  1. Отлаживать
  2. Релиз -> Это идет в магазин игр

В градиенте я добавил -

debugCompile 'com.some.library'

Который загружает эту библиотеку для Разработка — Отладка и Хранение — Отладка.

И затем я создал два класса приложений,

  1. ApplicationWithoutDebugLibrary расширяет MultiDexApplication — класс приложения, который не инициализирует библиотеку.
  2. ApplicationWithDebugLibrary расширяет ApplicationWithoutDebugLibrary — класс приложения, который инициализирует библиотеку

И я определил в gradle загрузку разных файлов приложений для разных вкусов.

productFlavors {
            Development {
                applicationId "xyzzzz"
                manifestPlaceholders = [application:"com.xyz.ApplicationWithDebugLibrary"]
            }
            store {
                applicationId "11111"
                manifestPlaceholders = [application:"com.xyz.ApplicationWithoutDebugLibrary"]
            }
}

И в манифесте я написал это:

<application
    android:name="${application}"...

Итак, для отладки он работает нормально, но когда я собираю apk Store-Release/Development-Release, он не может скомпилировать ApplicationWithDebugLibrary.java, так как я использую библиотеку, которая не скомпилирована в файле gradle для версии выпуска.

Итак, есть ли способ избежать загрузки этого класса для варианта выпуска Store или любого альтернативного решения, в котором я могу загрузить эту библиотеку только в среде разработки.


person aamitarya    schedule 04.04.2017    source источник


Ответы (1)


Итак, для отладки он работает нормально, но когда я собираю apk Store-Release/Development-Release, он не может скомпилировать ApplicationWithDebugLibrary.java, так как я использую библиотеку, которая не скомпилирована в файле gradle для версии выпуска.

По логике, нет никакого способа волшебным образом удалить библиотеку, которую использует ваш код, и при этом все остальные правильно скомпилировать, поскольку просто отсутствуют символы. Таким образом, вы должны создать «фиктивную» библиотеку с тем же API, что и ваша отладочная, но без тела методов. В качестве альтернативы вы можете обернуть свою библиотеку некоторым кодом, который позже можно будет заменить для производства с версией, которая не использует зависимости от библиотек.

Плагин Android Gradle может помочь в сборке с различными версиями зависимостей в зависимости от типа сборки:

Конфигурация компиляции используется для компиляции основного приложения. Все в нем добавляется в путь к классам компиляции, а также упаковывается в окончательный APK. Существуют и другие возможные конфигурации для добавления зависимостей:

  • скомпилировать: основное приложение
  • androidTestCompile: тестовое приложение
  • debugCompile: тип сборки отладки
  • releaseCompile: тип сборки выпуска.

документы: http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Dependencies-Android-Libraries-and-Multi-project-setup

person Marcin Orlowski    schedule 04.04.2017
comment
Как насчет динамической загрузки классов и написания скрипта в gradle, чтобы сделать то же самое. Я не знаю, возможно это или нет, я читал об этом во многих местах, просто любопытно узнать. - person aamitarya; 05.04.2017
comment
Пожалуйста, перефразируйте свой комментарий. Я понятия не имею, что вы имеете в виду на самом деле. - person Marcin Orlowski; 05.04.2017
comment
Я спрашиваю, можем ли мы сделать это, используя динамическую загрузку классов или написав скрипт в gradle для компиляции класса на основе некоторого условия? - person aamitarya; 06.04.2017
comment
Ваша единственная проблема заключается в том, что когда вы создаете для выпуска, ваш код неполный (отсутствуют библиотеки). Но опять же, вариантов сборки должно быть достаточно, чтобы решить эту проблему, и, как я уже писал, либо имейте no-op версию вашей отладочной библиотеки для выпускных сборок, чтобы все методы были доступны независимо от того, что вы создаете, либо соединяйте эту библиотеку с отдельным классом, а затем меняйте классы при сборке (опять же, со сборочными ароматами). - person Marcin Orlowski; 06.04.2017