android - 使用 aar 库导致在 Gradle 4.x 中使用 api 缺少依赖项

标签 android module android-gradle-plugin aar

当我使用 *.aar 文件而不是使用 Gradle 4.x 的模块并遵循 docu 构建应用程序时关于 implementsapi,我希望使用 api 包含的 aar 文件包含所有依赖项,但它没有。

当你做的时候

git clone https://github.com/hannesa2/aar_dependency
./gradlew clean assembleDebug

表示

dependencies {
    api project(':mylibrary')

它正常工作。

但是当我使用 lib-module 的 insted 时,之前生成的 *.aar 文件作为依赖项

 dependencies {
    api 'com.example.my.mylibrary:mylibrary-debug@aar'

(在 demo app 中)

git checkout with_aar
./gradlew clean assembleDebug

我遇到了这个

Task :app:transformClassesWithDesugarForDebug Exception in thread "main" java.lang.TypeNotPresentException: Type io.reactivex.ObservableTransformer not present at sun.invoke.util.BytecodeDescriptor.parseSig(BytecodeDescriptor.java:85) at sun.invoke.util.BytecodeDescriptor.parseMethod(BytecodeDescriptor.java:63) at sun.invoke.util.BytecodeDescriptor.parseMethod(BytecodeDescriptor.java:41) at java.lang.invoke.MethodType.fromMethodDescriptorString(MethodType.java:1067) at com.google.devtools.build.android.desugar.LambdaDesugaring$InvokedynamicRewriter.visitInvokeDynamicInsn(LambdaDesugaring.java:399) at org.objectweb.asm.MethodVisitor.visitInvokeDynamicInsn(Unknown Source) at org.objectweb.asm.MethodVisitor.visitInvokeDynamicInsn(Unknown Source)

因为我通常会在将 aar Artifact 上传到我们公司的 Maven Nexus 时遇到这个问题,所以我创建了这个 demo-repo以准确显示问题所在。在演示应用程序或使用 Maven 中,我看到了同样的问题。

有人知道我做错了什么吗?

最佳答案

我能够解决它。主要问题是 Android O 和​​ Gradle 4.x 使用 api

dependencies {
    api 'com.squareup.okhttp3:logging-interceptor:3.4.1'
    api "io.reactivex.rxjava2:rxandroid:$versions.libs.rxAndroid"

大多数答案都是关于这样的事情

publishing {
    publications {
        mipartner(MavenPublication) {
            groupId '...'
            artifactId '..'
            version 1.0
            artifact "$buildDir/outputs/aar/myLib-release.aar"

            //generate pom nodes for dependencies
            pom.withXml {
                def dependenciesNode = asNode().appendNode('dependencies')
                configurations.compile.allDependencies.each { dependency ->
                    def dependencyNode = dependenciesNode.appendNode('dependency')
                    dependencyNode.appendNode('groupId', dependency.group)
                    dependencyNode.appendNode('artifactId', dependency.name)
                    dependencyNode.appendNode('version', dependency.version)
                }
            }
        }
    }

    repositories{
        maven {
            url "https://some.url.com"
        }
    }
}

但是在生成的 *.pom 中没有包含依赖项,将此行更改为 api 后,依赖项包含在已部署的 pom 中!

configurations.api.allDependencies.each { dependency ->

之后你就可以轻松的使用aar文件了

dependencies {
    api "com.mylib.net:mylib:1.0"

关于android - 使用 aar 库导致在 Gradle 4.x 中使用 api 缺少依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46619355/

相关文章:

java - 循环遍历特定的小部件

java - Android 主线程上的网络使用情况

android - 从 Android 动态功能模块将资源加载到 WebView 中

ssl - 如何在不重新编译的情况下使用 stream_ssl_module 获取 Nginx(接受 docker)

android - Gradle 4.0 找不到匹配的配置

java - 防止支持库的 Gradle 依赖被新版本覆盖

Android Studio 找不到我的设备 - Lenovo Yoga

android - 如何在 Android 11 上启动ActivityForResult?

haskell - 在 Haskell 中从大型静态列表和映射初始化数据结构

linux - 为什么这个内核模块在 2.6.39 上标记为永久