Может ли библиотека зависеть и читать ресурсы из другой библиотеки с несколькими вариантами? - PullRequest
0 голосов
/ 18 января 2019

Использование: 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.

Кто-нибудь может помочь? Спасибо

1 Ответ

0 голосов
/ 22 января 2019

Ваш запрос не осуществим. Как обычно, библиотека не использует внутренний ресурс другой библиотеки, но использует API библиотеки, и ресурсы доступны через имя пакета, если ваш недостаток изменился, не забывайте менять каждую ссылку из другой библиотеки. Не используйте путь ошибки в других ссылках.

...