Может ли библиотека зависеть и читать ресурсы из другой библиотеки с несколькими вариантами?

Использование: 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 библиотеки, и ресурсы доступны через имя пакета, если ваш недостаток изменился, не забывайте менять каждую ссылку из другой библиотеки. Не используйте дефектный путь по другим ссылкам.

Другие вопросы по тегам