Использование: Android Studio 3.2.1 - Gradle 4.6
У меня есть приложение с 3 модулями:: приложение: lib1 (библиотека): lib2 (библиотека)
: app зависит от lib1 и lib2: lib 1 зависит от lib2
lib2 - это модуль, содержащий только ресурсы (папка res для изображений, строк, цветов и значений в целом, а не код Java), на которые ссылаются как: app, так и: lib1
Я хочу ароматизировать: модуль приложения и: модуль lib2 с одинаковыми вкусами (для настройки приложений для моих клиентов указав разные пакеты для каждого приложения). : lib1 не имеет вкуса
Перед добавлением ароматов все работает правильно.
Я добавил 1 аромат в модуль: app и модуль: lib2 под названием «client1».
Я добавил в: lib2 папку "client1" в: lib2 \ src \ client1.
Gradle compile создал связанные варианты сборки для:
: Приложение-client1Debug
: Приложение-client1Release
: Lib1-Debug
: Lib1-релиз
: Lib2-client1Debug
: Lib2-client1Release
Я запускаю вариант отладочной сборки, и приложение было установлено правильно и успешно получает нужные ресурсы из разновидности client1 в: lib2 module
Теперь я добавил второй вариант, то есть "client2" в модули: app и: lib2, и папку в ": lib2 \ src \ client2" для ресурсов варианта для настройки второго клиента.
Я добавил productFlavors и конфигурации и относительные зависимости в файл Gradle: app и: lib1 для модуля библиотеки: lib2
APP MODULE GRADLE FILE
apply plugin: 'com.android.application'
android {
defaultConfig {
applicationId "it.test.myapp"
.
.
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
flavorDimensions "default"
productFlavors {
client1 {
dimension="default"
versionNameSuffix "-client1"
applicationIdSuffix ".client1"
}
client2 {
dimension="default"
versionNameSuffix "-client2"
applicationIdSuffix ".client2"
}
}
}
configurations {
client1DefaultDebugCompile
client1DefaultReleaseCompile
client2DefaultDebugCompile
client2DefaultReleaseCompile
}
dependencies {
// implementation project(':lib2') //before flavors
implementation project(':lib1')
client1DefaultDebugCompile project(path: ':lib2', configuration: 'client1Debug')
client1DefaultReleaseCompile project(path: ':lib2', configuration: 'client1Release')
client2DefaultDebugCompile project(path: ':lib2', configuration: 'client2Debug')
client2DefaultReleaseCompile project(path: ':lib2', configuration: 'client2Release')
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation ....
. . .
}
:lib1 MODULE GRADLE FILE
apply plugin: 'com.android.library'
android {
....some configuration
defaultConfig {
...some configuration
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
}
configurations {
client1DefaultDebugCompile
client1DefaultReleaseCompile
client2DefaultDebugCompile
client2DefaultReleaseCompile
}
dependencies {
//implementation project(':lib2') //before flavors
client1DefaultDebugCompile project(path: ':lib2', configuration: 'client1Debug')
client1DefaultReleaseCompile project(path: ':lib2', configuration: 'client1Release')
client2DefaultDebugCompile project(path: ':lib2', configuration: 'client2tDebug')
client2DefaultReleaseCompile project(path: ':lib2', configuration: 'client2Release')
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation ...
....some implementation
}
:lib2 MODULE GRADLE FILE
apply plugin: 'com.android.library'
android {
publishNonDefault true
...some config
defaultConfig {
...some config
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
flavorDimensions "default"
productFlavors {
client1 {
dimension="default"
}
client2 {
dimension="default"
}
}
}
dependencies { implementation fileTree(dir: 'libs', include: ['*.jar'])
...some implementation
}
Я ожидал, что оба модуля: app и: lib1 будут иметь правильную версию ресурсов модуля lib2.
Я синхронизирую Gradle с вариантами сборки:
: Приложение-client1Debug
: lib1-Debug // Не имеет вкуса
: Lib2-client1Debug
и процесс Gradle Sync завершается с исключением:
: app: processClient1DebugResources FAILED
FAILURE: сборка не удалась, исключение.
• Что пошло не так: не удалось выполнить задачу ': app: processClient1DebugResources'. Не удалось связать ресурс Android с выходным файлом /merged.dir/values/values.xml:2601: ошибка: ресурс color / colorPrimary (он же it.test.myapp.client1: color / colorPrimary) не найден.
и другие подобные ошибки, связывающие другие ресурсы, которые: lib1 должна взять из: lib2 client1 flavor.
Кажется, пакет lib1 не может прочитать эти ресурсы
Если я пытаюсь восстановить из меню «Build-> Rebuild Project», я получаю похожую ошибку:
: lib1: javaPreCompileDebug /Users/davide/Documents/...../android/MyApp/lib1/src/main/java/it/test/lib1/utils/Utils.java:183: ошибка: не удается найти символ textView.setTextColor (MyApplication.getInstance (). getResources (). getColor (R.color.colorPrimaryDark)); символ ^: переменная colorPrimaryDark расположение: цвет класса
....
.....
/Users/davide/Documents/......../android/MyApp/lib1/src/main/java/it/test/lib1/utils/Utils.java:228: ошибка: не удается найти символ String channelId = context.getString (R.string.default_notification_channel_id); Символ ^: переменная default_notification_channel_id расположение: строка класса
,
, .... другая похожая ошибка
,
,
,
Примечание. Некоторые входные файлы используют или отменяют устаревший API.
Примечание: Перекомпилируйте с -Xlint: не рекомендуется для деталей. 50 ошибок: lib1: compileDebugJavaWithJavac FAILED
FAILURE: сборка не удалась, исключение.
• Что пошло не так: выполнение задачи не выполнено ': lib1: compileDebugJavaWithJavac'.Compilation не удалось; см. вывод ошибки компилятора для деталей.
• Try: Запустите с параметром --stacktrace, чтобы получить трассировку стека. Запустите с параметром --info или --debug, чтобы получить больше вывода журнала. Запустите с --scan, чтобы получить полное представление.
* Получить дополнительную помощь на https://help.gradle.org
Если я выберу варианты сборки на
: Приложение-client2Debug
: lib1-Debug // Не имеет вкуса
: Lib2-client2Debug
У меня те же ошибки для клиента client2 и: lib1 не может прочитать эти ресурсы.
Может ли кто-нибудь указать мне правильное решение? Может ли библиотека иметь зависимость и читать ресурсы из другой библиотеки FLAVORED?
Я прочитал это https://android.jlelse.eu/product-flavors-for-android-library-d3b2d240fca2
и это https://proandroiddev.com/advanced-android-flavors-part-1-building-white-label-apps-on-android-ade16af23bcf
и эта Android-библиотека мультифлеймов, на которую ссылается приложение без ароматов - AAPT: ресурс не найден
и другие ... и хотя я был прав ... но .... не работает
// UPDATE
Если я удаляю разновидности из: lib2 gradle-файла и его конфигурацию вкусов зависимостей из: app и: lib1, но поддерживаю: модуль приложения с двумя включенными вариантами, приложение запускается и было установлено для вариантов boh и с правильным versionNameSuffix для этого, я думаю, что я ' Мне не хватает чего-то в конфигурации: lib1, чтобы он мог читать ресурсы из правильного вида: lib2.
Кто-нибудь может помочь? Спасибо