Android gradle разрешение многопроектных зависимостей - PullRequest
0 голосов
/ 02 июля 2018

В моем проекте Android у меня есть задача скопировать зависимости сборки во внешний каталог, как показано ниже:

task copyBuildDependencies(type: Copy) {
    delete "$buildDir/dependencies"
    afterEvaluate {
        from configurations.releaseCompileClasspath
        into "$buildDir/dependencies"

        doLast {
            FileTree files = fileTree("$buildDir/dependencies")
            files.forEach { file ->
                if (file.isFile() && file.name.endsWith(".aar")) {
                    copy {
                        from zipTree(file).matching { include "*.jar" }
                        into "$buildDir/dependencies"
                        eachFile {
                            it.path = it.path.replace(it.name, "${file.name}-${it.name}")
                        }
                    }
                }
            }
        }
    }
}

У меня нормальные зависимости с проектными зависимостями:

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    ...
    implementation 'com.google.guava:guava:11.0.2'
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:0.22.5'
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:0.22.5'
    // Note: These are Android Library projects
    implementation project(':genericutils')
    implementation project(':module2')
    ...
}

Когда я запускаю задачу copyBuildDependencies, я получаю следующую ошибку:

Executing task 'copyBuildDependencies'...

Executing tasks: [copyBuildDependencies]

Configuration on demand is an incubating feature.

FAILURE: Build failed with an exception.

* What went wrong:
Could not determine the dependencies of task ':BiometricInterfaceLib:copyBuildDependencies'.
> Could not resolve all task dependencies for configuration ':BiometricInterfaceLib:releaseCompileClasspath'.
> More than one variant of project :genericutils matches the consumer attributes:
    - Configuration ':genericutils:releaseApiElements' variant android-aidl:
        - Found artifactType 'android-aidl' but wasn't required.
        - Required com.android.build.api.attributes.BuildTypeAttr 'release' and found compatible value 'release'.
        - Found com.android.build.api.attributes.VariantAttr 'release' but wasn't required.
        - Required com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' and found compatible value 'Aar'.
        - Required org.gradle.usage 'java-api' and found compatible value 'java-api'.
    - Configuration ':genericutils:releaseApiElements' variant android-classes:
        - Found artifactType 'android-classes' but wasn't required.
        - Required com.android.build.api.attributes.BuildTypeAttr 'release' and found compatible value 'release'.
        - Found com.android.build.api.attributes.VariantAttr 'release' but wasn't required.
        - Required com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' and found compatible value 'Aar'.
        - Required org.gradle.usage 'java-api' and found compatible value 'java-api'.
    - Configuration ':genericutils:releaseApiElements' variant android-manifest:
        - Found artifactType 'android-manifest' but wasn't required.
        - Required com.android.build.api.attributes.BuildTypeAttr 'release' and found compatible value 'release'.
        - Found com.android.build.api.attributes.VariantAttr 'release' but wasn't required.
        - Required com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' and found compatible value 'Aar'.
        - Required org.gradle.usage 'java-api' and found compatible value 'java-api'.
    - Configuration ':genericutils:releaseApiElements' variant android-renderscript:
        - Found artifactType 'android-renderscript' but wasn't required.
        - Required com.android.build.api.attributes.BuildTypeAttr 'release' and found compatible value 'release'.
        - Found com.android.build.api.attributes.VariantAttr 'release' but wasn't required.
        - Required com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' and found compatible value 'Aar'.
        - Required org.gradle.usage 'java-api' and found compatible value 'java-api'.
    - Configuration ':genericutils:releaseApiElements' variant jar:
        - Found artifactType 'jar' but wasn't required.
        - Required com.android.build.api.attributes.BuildTypeAttr 'release' and found compatible value 'release'.
        - Found com.android.build.api.attributes.VariantAttr 'release' but wasn't required.
        - Required com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' and found compatible value 'Aar'.
        - Required org.gradle.usage 'java-api' and found compatible value 'java-api'.
> More than one variant of project :module2 matches the consumer attributes:
    - Configuration ':module2:releaseApiElements' variant android-aidl:
        - Found artifactType 'android-aidl' but wasn't required.
        - Required com.android.build.api.attributes.BuildTypeAttr 'release' and found compatible value 'release'.
        - Found com.android.build.api.attributes.VariantAttr 'release' but wasn't required.
        - Required com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' and found compatible value 'Aar'.
        - Required org.gradle.usage 'java-api' and found compatible value 'java-api'.
    - Configuration ':module2:releaseApiElements' variant android-classes:
        - Found artifactType 'android-classes' but wasn't required.
        - Required com.android.build.api.attributes.BuildTypeAttr 'release' and found compatible value 'release'.
        - Found com.android.build.api.attributes.VariantAttr 'release' but wasn't required.
        - Required com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' and found compatible value 'Aar'.
        - Required org.gradle.usage 'java-api' and found compatible value 'java-api'.
    - Configuration ':module2:releaseApiElements' variant android-manifest:
        - Found artifactType 'android-manifest' but wasn't required.
        - Required com.android.build.api.attributes.BuildTypeAttr 'release' and found compatible value 'release'.
        - Found com.android.build.api.attributes.VariantAttr 'release' but wasn't required.
        - Required com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' and found compatible value 'Aar'.
        - Required org.gradle.usage 'java-api' and found compatible value 'java-api'.
    - Configuration ':module2:releaseApiElements' variant android-renderscript:
        - Found artifactType 'android-renderscript' but wasn't required.
        - Required com.android.build.api.attributes.BuildTypeAttr 'release' and found compatible value 'release'.
        - Found com.android.build.api.attributes.VariantAttr 'release' but wasn't required.
        - Required com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' and found compatible value 'Aar'.
        - Required org.gradle.usage 'java-api' and found compatible value 'java-api'.
    - Configuration ':module2:releaseApiElements' variant jar:
        - Found artifactType 'jar' but wasn't required.
        - Required com.android.build.api.attributes.BuildTypeAttr 'release' and found compatible value 'release'.
        - Found com.android.build.api.attributes.VariantAttr 'release' but wasn't required.
        - Required com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' and found compatible value 'Aar'.
        - Required org.gradle.usage 'java-api' and found compatible value 'java-api'.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 2s
16:39:07: Task execution finished 'copyBuildDependencies'.

Я могу использовать опцию исключения модуля на configurations.releaseCompileClasspath, но тогда задача assembleRelease не выполняется, поскольку она не может найти зависимости.

Редактировать: я создал пример проекта, чтобы помочь показать результат, который мне нужен, и проблему, с которой я столкнулся: https://gitlab.com/crunchy234/android-gradle-dependencies-export

--- Редактировать 2 ---

Причина, по которой вам нужна зависимость библиотечного модуля, а не Jar для библиотеки, заключается в том, что можно создать библиотеку Xamarin Bindings.

Итак, что требуется для привязок Xamarin - это AAR для библиотеки (mastermodule в случае примера кода) и все Jar для зависимостей библиотек. Например:

mastermodule/build/dependencies/
├── animated-vector-drawable-28.0.0-alpha3.aar-classes.jar
├── annotations-13.0.jar
...
├── collections-28.0.0-alpha3.jar
├── common-1.1.1.jar
├── coordinatorlayout-28.0.0-alpha3.aar-classes.jar
...
etc

1 Ответ

0 голосов
/ 02 июля 2018

Если я правильно понимаю

  1. Ваш проект является проектом библиотеки Android.
  2. Ваша задача копирования пытается скопировать все фляги внутри библиотеки AAR.
  3. переименуйте классы. Jar.

Вероятно, ниже, что вы хотите. Добавьте это в build.gradle в root проекте.

// Add this into the build.gradle under **root** project.
// Add the modules that you want to exclude from having this copyXXXJar task.
def modulesExcluded = [
        'app',
        'mastermodulewantedoutput'
]

subprojects { prj ->

    // Skip excluded modules
    if (modulesExcluded.contains(prj.name)) {
        prj.afterEvaluate {
            tasks['preBuild'].dependsOn(copyModuleJars)
        }
        return
    }

    prj.afterEvaluate {

        /**
         * Dynamically create task "copyXXXJar" according to build variant of each library module.
         */
        android.libraryVariants.all { variant ->

            def capitalizedVariantName = variant.name.capitalize()
            def variantName = variant.flavorName
            if (!variantName || variantName == "") {
                variantName = variant.buildType.name
            } else {
                variantName += "-${variant.buildType.name}"
            }
            //================================================================================
            // Define build/copy variant jar and copy to dependencies
            //================================================================================
            def copyJarTask = project.tasks.create("copy${capitalizedVariantName}Jar", Copy) {
                group "Copy Jar"
                description "Rename the classes.jar to ${project.name}-${variantName}.jar and copy it into dist folder."


                def fromDirModule = "$buildDir/outputs/aar/${project.name}-${variantName}.aar"
                def intoDirModule = "$rootDir/dependencies/$variant.buildType.name"
                from(zipTree(fromDirModule))
                into(intoDirModule)
                include('*.jar')
                include('libs/*.jar')
                rename('classes.jar', "${project.name}-${variantName}.jar")

                dependsOn "assemble${capitalizedVariantName}"
            }
            copyModuleJars.dependsOn(copyJarTask)
        }
    }
}

// Task to copy all the modules' jars. It can be run with command [ ./gradlew copyModuleJars ]
task copyModuleJars {
    group = 'Copy Jar'
    description = 'Copy the classes.jar from each module.'
} 

Запустите команду ниже для проверки

./gradlew copyModuleJars

Надеюсь, это поможет.

--------- Отредактировано ----------

Я проверил ваш проект gitlab. Похоже, вам нужна только банка внутри .aar. Я хотел бы сказать, что это может вызвать некоторые проблемы, потому что вы удаляете связанные файлы res, файл aidl, assets и R.txt и т. Д., Которые считаются необходимыми частями библиотеки .aar. Например, одна из ваших зависимостей aar appcompat-v7-28.0.0-alpha3 на самом деле будет иметь разметку ниже, когда вы ее распакуете, NOT ONLY classes.jar . appcompat-v7-28.0.0-alpha3 contents

Кроме того, вы можете просто изменить массив modulesExcluded , как я редактировал выше. А проверку состояния " hasProperty () " можно удалить.

Вывод будет в " $ rootDir / dependencies ". Примерно так:

  • отладки
    • genericutils-debug.jar
    • mastermodule-debug.jar
  • релиз
    • genericutils-release.jar
    • mastermodule-release.jar

Эти файлы создаются из вашего собственного исходного кода, то есть из ваших genericutils и mastermodule источников. Если переходные зависимости библиотеки имеют формат " .jar ", они перейдут в " libs / " из .aar , если они находятся в " .aar"формат, я не думаю, что вы можете просто выбрать его classes.jar , но лишить его связанных и необходимых частей, если у вас нет особых требований, а эти недостающие части не вопрос с вашим проектом.

-------- Отредактировано 2 ---------

В случае, если вы заботитесь только об исходном коде и не используете какие-либо ресурсы (res, R.txt, aidl, jni и т. Д.) Внутри логики кода, например, вероятно, ваш genericutils модуль будет таким случаем, тогда вы можете просто взять только classes.jar. Это не вызовет никаких проблем, если вы используете его как обычную библиотеку Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...