【问题标题】:Android Gradle Project dependency on AAR library failes with 3.5.x releaseAAR 库中的 Android Gradle 项目依赖项在 3.5.x 版本中失败
【发布时间】:2020-02-11 23:52:33
【问题描述】:

我有一个 gradle android 库模块,它依赖于另一个项目的 android 库:

androidlib-a depends on androidlib-b

androidlib-a 依赖

implementation project(path: ':androidlib-b', configuration: "default")

从 3.3.0 升级到 android build tools 3.5.0 后配置阶段抛出以下异常:

出了什么问题: 无法确定任务 ':androidlib-a:lint' 的依赖关系。 无法解析配置“:androidlib-a:releaseCompileClasspath”的所有工件。 无法转换工件 'androidlib-b.aar (project :androidlib-b)' 以匹配属性 {artifactType=jar}。 IdentityTransform 执行失败:C:\LocalData\projects\project\androidlib-b\build\outputs\aar\androidlib-b-release.aar。 C:\LocalData\projects\project\androidlib-b\build\outputs\aar\androidlib-b-release.aar.

我把 androidlib-a 的依赖改成:

implementation project(':androidlib-b')

从命令行构建 androidlib-a 现在可以工作,但我在 Android Studio Gradle Sync 上遇到以下问题:

错误:项目的多个变体 :androidlib-b 匹配消费者属性: - 配置 ':androidlib-b:releaseRuntimeElements' 变体 android-assets: - 无与伦比的属性: - 找到 artifactType 'android-assets' 但不是必需的。 - 找到 com.android.build.api.attributes.VariantAttr 'release' 但不是必需的。 - 兼容属性: - 需要 com.android.build.api.attributes.BuildTypeAttr 'release' 并找到兼容值 'release'。 - 需要 com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' 并找到兼容值 'Aar'。 - 需要 org.gradle.usage 'java-runtime' 并找到兼容值 'java-runtime'。 - 配置 ':androidlib-b:releaseRuntimeElements' 变体 android-classes: - 无与伦比的属性: - 找到 artifactType 'android-classes' 但不是必需的。 - 找到 com.android.build.api.attributes.VariantAttr 'release' 但不是必需的。 - 兼容属性: - 需要 com.android.build.api.attributes.BuildTypeAttr 'release' 并找到兼容值 'release'。 - 需要 com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' 并找到兼容值 'Aar'。 - 需要 org.gradle.usage 'java-runtime' 并找到兼容值 'java-runtime'。 - 配置 ':androidlib-b:releaseRuntimeElements' 变体 android-consumer-proguard-rules: ...

更改后,我在另一个依赖于 androidlib-a 的模块中也遇到了问题,并尝试像这样复制依赖项:

task copyToLib() {
    afterEvaluate {
        dependsOn ":androidlib-a:assembleRelease"
    }
    doLast {
        delete libDir
        def config = rootProject.project(":project").configurations.releaseRuntimeClasspath
        println config.toList()
        copy {
            into libDir
            from config
        }
    }
}

preBuild.dependsOn "copyToLib"

任务 ':anothermodule:copyToLib' 执行失败。 无法解析配置“:androidlib-a:releaseRuntimeClasspath”的所有文件。 不止一种 project :androidlib-b 变体匹配消费者属性: - 配置 ':androidlib-b:releaseRuntimeElements' 变体 android-assets: - 无与伦比的属性: - 找到 artifactType 'android-assets' 但不是必需的。 - 找到 com.android.build.api.attributes.VariantAttr 'release' 但不是必需的。 - 兼容属性: - 需要 com.android.build.api.attributes.BuildTypeAttr 'release' 并找到兼容值 'release'。 - 需要 com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' 并找到兼容值 'Aar'。 - 需要 org.gradle.usage 'java-runtime' 并找到兼容值 'java-runtime'。 - 配置 ':androidlib-b:releaseRuntimeElements' 变体 android-classes: - 无与伦比的属性: - 找到 artifactType 'android-classes' 但不是必需的。 - 找到 com.android.build.api.attributes.VariantAttr 'release' 但不是必需的。 - 兼容属性: - 需要 com.android.build.api.attributes.BuildTypeAttr 'release' 并找到兼容值 'release'。 - 需要 com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' 并找到兼容值 'Aar'。 - 需要 org.gradle.usage 'java-runtime' 并找到兼容值 'java-runtime'。

android 构建工具 3.5.1 版本也存在同样的问题。

完整的 androidlib-a 构建配置:

apply plugin: 'com.android.library'

version = releaseVersion

android {
    compileSdkVersion 27
    buildToolsVersion '28.0.3'

    defaultConfig {
        minSdkVersion 19
        targetSdkVersion 27
        versionCode 1
        versionName releaseVersion
    }

    buildTypes {
        release {
            minifyEnabled false
        }
    }
}

dependencies {
    implementation project(path: ':androidlib-b', configuration: "default")
}

完整的 androidlib-b 构建配置文件:

apply plugin: 'com.android.library'

version = releaseVersion

android {
    compileSdkVersion 27
    buildToolsVersion '28.0.3'

    defaultConfig {
        minSdkVersion 19
        targetSdkVersion 27
        versionCode 1
        versionName releaseVersion
    }

    buildTypes {
        release {
            minifyEnabled false
        }
    }
}

【问题讨论】:

  • 能把buildTypes和productFlavors各库的配置贴出来吗?
  • 此外,模块(libs + 模块取决于 libs)的目录结构将有助于解决您的第二个问题
  • 看不到任何 AAR 依赖项;这些错误信息并不能解释问题。
  • @ahasbini 为 androuidlib-a 和 b 添加了构建配置
  • 在引入构建工具 3.0.x 之前我也遇到过类似的问题,然后添加默认配置即可解决问题。不知道这在 3.5.x 中是如何再次改变的。此处描述了与 3.0.x 构建工具问题相关的修复:stackoverflow.com/a/51766919/1100559

标签: java android gradle dependencies


【解决方案1】:

我不能说这是否是你的问题,但 Android Studio 3.5 默认启用 R8 缩小和缩小,替换 Proguard - 并启用它我会说即使在调试构建类型上至少在某些部分 -。

在此版本中有一个与 AAR 相关的 issue。 Android Studio 找不到 AAR 中包含的 JAR 依赖项。这个问题应该会在 Android Studio 3.6.0-alpha05 或更高版本的 Canary 频道上修复,可在 Android Studio 的网站上下载。

此外,如果 AAR 不包含任何 JAR 依赖项,当您的 AAR 库尝试使用某些第三方库时,您在执行期间仍可能出现 NoClassDefFoundException 或 NoSuchMethodError。此问题尚无任何修复方法,但您可以应用以下解决方法:

只需将下一行添加到根目录下的 gradle.properties,同步项目并重新运行:

android.enableD8.desugaring=false

您还可以通过将 AAR 上传到任何存储库来解决这两个问题,例如本地存储库或 JFrog 或 Nexus 私有服务器等云存储库(如果您的库是私有的),甚至可以上传到 Maven 或类似的公共存储库(如果您的库是公共的) ,因为这些错误只影响手动包含的 AAR,而不影响从存储库下载的 AAR

【讨论】:

  • 我尝试在 3.5.1 中禁用脱糖功能,但随后我收到以下日志:信息:选项设置 'android.enableD8.desugaring=false' 是实验性的,不受支持。当前默认值为“真”。 -->同样的问题正在发生。我也尝试使用 3.6.0-alpha05,但后来我从另一个仅与 3.5.x 兼容的库中收到错误。我会在删除那个后检查。
  • 该日志消息只是一条信息性消息,而不是错误消息。无论如何,您也可以尝试将 AAR 上传到本地 maven 存储库:proandroiddev.com/…
  • enableD8.desugaring 现在不是已弃用了吗?
猜你喜欢
  • 1970-01-01
  • 2015-11-11
  • 2018-10-15
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 2016-07-10
  • 2021-01-07
  • 1970-01-01
相关资源
最近更新 更多