Может ли библиотека зависеть и читать ресурсы из другой библиотеки с несколькими вариантами?
Использование: Android Studio 3.2.1 - Gradle 4.6
У меня есть приложение с 3 модулями:: приложение:lib1 (библиотека):lib2 (библиотека): приложение зависит от lib1 и lib2:lib 1 зависит от lib2 lib2 - это модуль, содержащий только ресурсы (папка res для изображений, строк, цветов и значения в целом, а не код Java), на которые ссылаются оба: app и: lib1
Я хочу приправить: app-модуль и: lib2-модуль с одинаковыми вкусами (для настройки приложений для моих клиентов указав разные пакеты для каждого приложения).: lib1 не имеет вкуса
Перед добавлением ароматов все работает правильно. Я добавил 1 аромат в модуль: app и модуль: lib2 под названием "client1". Я добавил в: lib2 папку "client1" в: lib2 \ src \ client1.
Gradle compile создал связанные варианты сборки для::app-client1Debug:app-client1Release:lib1-Debug:lib1-Release:lib2-client1Debug:lib2-client1Release
Я запускаю вариант отладочной сборки, и приложение было установлено правильно и успешно получает нужные ресурсы из разновидности client1 в модуле: lib2
Теперь я добавил второй вариант, то есть "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 с вариантами сборки на::app-client1Debug:lib1-Debug // Не имеет вкуса: lib2-client1Debug
и процесс Gradle Sync завершается с исключением::app:processClient1DebugResources FAILED FAILURE: сборка завершилась с исключением. • Что пошло не так: не удалось выполнить задачу ':app:processClient1DebugResources'. Не удалось связать ресурс Android. Вывод: /Users/davide/Documents/......./android/MyApp/app/build/intermediates/incremental/mergeClient1DebugResources/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/
Если я выберу варианты сборки:app-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: ресурс не найден и другие... и хотя я был прав... но.... не работает
// ОБНОВЛЕНИЕ Если я удаляю разновидности из файла:lib2 gradle и его конфигурацию вкусов зависимостей из: app и: lib1, но с поддержкой: app-модуля с двумя включенными вариантами, приложение запускается и было установлено для вариантов boh и с правильным versionNameSuffix для этого i думаю, что я что-то упускаю в конфигурации: lib1, чтобы он мог читать ресурсы с правильной версией:lib2.
Кто-нибудь может помочь? Спасибо
1 ответ
Ваш запрос не выполним. Как обычно, библиотека не использует внутренний ресурс другой библиотеки, но использует API библиотеки, и ресурсы доступны через имя пакета, если ваш недостаток изменился, не забывайте менять каждую ссылку из другой библиотеки. Не используйте дефектный путь по другим ссылкам.