Использование ароматов сборки-структурирование исходных папок и сборка.gradle правильно
обратите внимание: ответ отредактирован после ответа Ксавье
Я пытаюсь использовать разные Build Flavors для одного и того же проекта приложения в Android Studio. Тем не менее, мне кажется, что у меня ужасное время, чтобы настроить его для правильной работы.
действия:
- создайте новый проект Android Studio с именем 'Test'.
открыть сборки.gradle* и добавил следующие строки:
productFlavors {
flavor1 {
packageName 'com.android.studio.test.flavor1'
}
flavor2 {
packageName 'com.android.studio.test.flavor2'
}
}
- после перезагрузки Android Studio, я теперь вижу 4 варианта сборки в разделе варианты сборки. Это означает, что мы были успешны в создании вкусов продукта до сих пор. **
создал новую исходную папку для flavor1, однако, я не уверен, если я делаю это правильный путь. Вот как я это сделал:
- имейте в виду, что мое имя пакета для этого проекта:
com.foo.test
- право нажмите на кнопку
srcпапка, для flavor1, я фактически создал отдельные папки в проводнике, таким образом, что структураsrc/flavor1/java/com/foo/test/MainActivity.java. - выше работал хорошо, так как папка "java" находится в синий, т. е. язь знает свое активное исходный каталог. Кроме того, пакет был создан автоматически. Несмотря на это, я получаю предупреждение о найденном дубликате класса. посмотреть скриншот здесь.
- для flavor2, я попытался создать пакет вручную, но папка " src "для flavor2, похоже, не находится в синем цвете, и поэтому параметры отличаются при щелчке правой кнопкой мыши, а "новый пакет" недоступен для меня. смотрите изображение здесь.
- обратите внимание, что для flavor1 я также создал каталог "res", который становится синим, но, несмотря на это, не предлагает возможности создания файла ресурсов Android или каталога ресурсов Andorid, если я хочу использовать разные ресурсы для разных вкусов.
- имейте в виду, что мое имя пакета для этого проекта:
Я делаю что-то неправильно? Или я что-то упустил? Дайте мне знать, если вам нужна дополнительная информация.
*мой проект, кажется два построить.файлы gradle. Один расположен в корне папки проекта (GradleTest), этот пуст. Второй, расположенный в корне подпапки GradleTest, также помеченный как 'GradleTest' (GradleTest-GradleTest), это тот, который уже имел код при открытии; поэтому это тот, который я отредактированный.
** Я проверил настройки gradle и, видимо,использовать Автоимпорт был уже включен. несмотря на это, внесение изменений в построении.gradle file не обновлять автоматически варианты построения. Примечание: Я также попытался использовать Build-Rebuild Project и / или Build - Make Project, no-go. Мне все еще нужно закрыть проект и снова открыть, чтобы изменения вступили в силу.
6 ответов:
Если вы попали в Настройки Studio, в разделе Gradle, вы можете включить автоматический импорт для вашего проекта (мы включим это по умолчанию позже). Это позволит студии повторно импортировать вашу сборку.gradle всякий раз, когда вы редактируете его.
создание вкусов не означает, что вы собираетесь использовать пользовательский код для них, поэтому мы не создаем папки. Вам нужно создать их самостоятельно.
Если вы посмотрите на мой IO talk вы увидите, как мы смешиваем вместе значения из ароматизаторов и типа сборки для создания варианта.
для Java-кодом:
src/main/java src/flavor1/java src/debug/javaвсе 3 используются для создания одного выхода. Это означает, что они не могут определить один и тот же класс.
Если вы хотите иметь другую версию того же класса в два аромата, нужно создать его в ароматах.
src/flavor1/java/com/foo/A.java src/flavor2/java/com/foo/A.javaи тогда ваш код в src / main / java может сделать
import com.foo.Aв зависимости от выбранного вкуса, правильную версию из COM.foo.А используется.
Это также означает, что обе версии A должны иметь один и тот же API (по крайней мере, когда речь заходит об API, используемом классами в src/main/java/...
редактировать, чтобы соответствовать пересмотренному вопросу
кроме того, важно поместить один и тот же класс A только в исходные папки, которые являются взаимоисключающими. В этом случае src/flavor1/java и src/flavor2/java никогда не выбираются вместе, но main и flavor1 являются.
Если вы хотите предоставьте другую версию действия в другом вкусе не помещайте его в src/main/java.
обратите внимание, что если у вас было 3 аромата и вы хотели только пользовательский для flavor1, в то время как flavor2 и flavor3 разделяли одну и ту же активность, вы можете создать общие исходные папки для этих двух других действий. У вас есть полная гибкость в создании новых исходных папок и настройка источников для их использования.
на другие ваши пункты:
Это нормально, что 2-й исходная папка аромата не синяя. Вам нужно переключиться на 2-й вкус, чтобы включить его, а затем вы сможете создавать пакеты и классы внутри. До тех пор Studio не считает его исходной папкой. Мы надеемся улучшить это в будущем, чтобы IDE знала об этих неактивные исходные папки.
Я думаю, что это также нормально, что вы не можете создавать файлы ресурсов в папке res. Система меню не была обновлена, чтобы иметь дело со всеми этими дополнительными ресурсами папки. Это придет позже.
"вкус продукта" на Android
меня иногда спрашивали о том, как работать с разными хостами, значками или даже именами пакетов, отключая разные версии одного и того же приложения.
есть много причин, чтобы сделать это и один простой способ пойти: вкус продукта.
вы можете определить на свой строить.gradle script такие вещи я уже описывал раньше.
ароматы продукта Часть этого статья написана думая о вкусах продукта, так, что они? Что касается документации по Android:
вкус продукта определяет настроенную версию сборки приложения проектом. Один проект может иметь различные вкусы, которые изменяют созданное приложение.
как вы можете их определить? Вы должны написать на своей сборке.gradle какие ароматы вы хотите определить:
productFlavors { ... devel { ... } prod { ... } }теперь у нас будет два разных вкуса нашего приложения. Вы можете проверить на Андроид студия в разделе построить варианты
построить варианты
несколько имен пакета
Что делать, если вы хотите установить на свой телефон приложение с государственного развития и для государственного производства. Как вы знаете, вы можете установить только одно приложение с тем же именем пакета (если вы попытаетесь установить новый APK с тем же именем, что и на вашем телефоне, он попытается обновить он.)
единственное, что вам нужно сделать, это определить его на каждого из ваших вкусов продукта:
android { productFlavors { devel { applicationId "zuul.com.android.devel" } prod { applicationId "zuul.com.android" } } }отправить запросы на несколько хостов в зависимости от вкуса Как и раньше, вы должны включить некоторые параметры в поле конфигурации вкуса продукта.
android { productFlavors { devel { applicationId "zuul.com.android.devel" buildConfigField 'String', 'HOST', '"http://192.168.1.34:3000"' } prod { applicationId "zuul.com.android" buildConfigField 'String', 'HOST', '"http://api.zuul.com"' } } }в качестве примера мы попытаемся показать вам, как вы можете интегрировать это с Retrofit для отправки запроса на соответствующий сервер без обработки того сервера, на который вы указываете, и на основе вкуса. В этом деле это отрывок из приложения Zuul android:
public class RetrofitModule { public ZuulService getRestAdapter() { RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint(BuildConfig.HOST) .setLogLevel(RestAdapter.LogLevel.FULL) .build(); return restAdapter.create(ZuulService.class); } }как вы можете видеть, Вам просто нужно использовать BuildConfigclass для доступа к переменной, которую вы только что определили.
любая переменная, доступная через ваш код Переменная HOST-это не единственная переменная, которую вы можете предоставить в своем коде. Вы можете сделать это с тем, что вы хотите:
prod { applicationId "zuul.com.android" buildConfigField 'String', 'HOST', '"http://api.zuul.com"' buildConfigField 'String', 'FLAVOR', '"prod"' buildConfigField "boolean", "REPORT_CRASHES", "true" }вы можете получить к ним доступ следующим образом:
BuildConfig.HOST BuildConfig.FLAVOR BuildConfig.REPORT_CRASHESразличные иконки на вкус Если вы хотите иметь разные значки на вкус, так что вы можете визуально определить, какой из них вы открываете (вы могли бы сделать это по имени тоже... Но он не мог поместиться в пространстве!), вам просто нужно определить новые структуры каталогов для каждого из ароматов.
в Примере, который я только что использовал, есть два вкуса: devel и prod. Затем мы могли бы определить две новые структуры каталогов, чтобы мы могли определить ресурсы, которые мы хотим:
структура
это работает с другими типами ресурсов, таких как
strings.xml, integers.xml, arrays.xmlи т. д.Настройка Параметров Подписывания
чтобы вручную настроить конфигурации подписи для вашего типа сборки выпуска с помощью конфигураций сборки Gradle:
1.Создайте хранилище ключей. Хранилище ключей-это двоичный файл, содержащий набор закрытых ключей. Вы должны хранить свое хранилище ключей в надежном и безопасном месте. 2.Создайте закрытый ключ. Закрытый ключ представляет сущность, которая должна быть идентифицирована с приложением, например лицо или компанию. 3.Добавить подписание конфигурации в сборку уровня модуля.файл gradle:
android { ... defaultConfig {...} signingConfigs { release { storeFile file("myreleasekey.keystore") storePassword "password" keyAlias "MyReleaseKey" keyPassword "password" } } buildTypes { release { ... signingConfig signingConfigs.release } }}
создать подписанный APK:
чтобы создать подписанный APK, выберите построить > создать подписанный APK из главного меню. Пакет в app / build/apk / app-release.apk теперь подписан с вашим ключом выпуска.
кажется, вам нужно перезагрузите свой проект после добавления новых вкусов в
build.gradle. После этого вы увидите 4 варианта сборки в представлении "варианты сборки" (доступ к нему осуществляется с левого края окна).что касается дополнительных исходных каталогов, кажется, вам нужно создать их вручную:
src/flavor1/javaиsrc/flavor2/java. Вы увидите, что изменение вкуса в представлении "варианты сборки" изменит в настоящее время активные исходные каталоги (каталог синий, когда это active source directory)наконец, "gradle создаст новые исходные наборы для ваших новых вкусов" означает, что gradle создаст объекты
android.sourceSets.flavor1иandroid.sourceSets.flavor2и вы можете использовать их в построении.сценарий gradle. Но эти объекты создаются динамически, поэтому вы не видите их вbuild.gradle(Я предлагаю вам прочитать это:http://www.gradle.org/docs/current/userguide/tutorial_using_tasks.html особенно 6.6: это объясняет создание динамической задачи. Скрипт gradle-это классный скрипт, поэтому я предлагаю вам тоже ознакомиться с groovy)
У меня была такая же проблема, когда я перенес свой проект в Gradle. Проблема заключалась в том, что сборка не нашла нужную папку ресурсов. Я исправил это, добавив это под элементом android в сборке.Gradle в:
sourceSets { main { res.srcDirs = ['myProject/res'] } }
что-то важное и заблокировало меня на некоторое время, так это то, что имя аромата, которое должно соответствовать пакету, в отличие от пакета, определенного внутри определения аромата в gradle. Например:
src/flavor1/java/com/foo/A.javaбудет соответствовать
productFlavors { flavor1 { packageName 'com.android.studio.test.foobar' } }но
src/foobar/java/com/foo/A.javaне будет использоваться для сборки flavor1.
в gradle:
для типов сборки вам нужно только:
buildTypes { release{ //proguard, signing etc. } debug { //development } } }а затем для ароматов вы добавляете те, которые вам нужны
productFlavors { pro { applicationIdSuffix '.paid' buildConfigField 'boolean', 'PRO', 'true' } free { applicationIdSuffix '.free' buildConfigField 'boolean', 'PRO', 'false' } }
Comments