GitLab CI中AAR模块构建失败问题排查
问题:多模块Android项目GitLab CI构建AAR模块依赖失败
我有一个多模块Android项目,为AAR文件创建了单独模块,其Gradle配置如下:
configurations.maybeCreate("default") artifacts.add("default", file('my-aar-1.0.0.aar'))
另有模块依赖该AAR模块,在Android Studio中执行./gradlew build可正常构建,但在GitLab CI脚本中执行时出现如下错误:
Install Android SDK Platform-Tools (revision: 34.0.5) finished. FAILURE: Build failed with an exception. * What went wrong: Could not determine the dependencies of task ':features:app:buildProdBetaPreBundle'. > Could not resolve all task dependencies for configuration ':features:app:prodBetaRuntimeClasspath'. > Could not resolve project :myaar. Required by: project :app > project :module:secondmodule > No matching configuration of project :myaar was found. The consumer was configured to find a runtime of a component, preferably optimized for Android, as well as attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'beta', attribute 'com.android.build.api.attributes.ProductFlavor:default' with value 'prod', attribute 'com.android.build.api.attributes.AgpVersionAttr' with value '7.4.2', attribute 'org.jetbrains.kotlin.platform.type' with value 'androidJvm' but: - Configuration 'ktlintRuleset': - Other compatible attributes: - Doesn't say anything about com.android.build.api.attributes.AgpVersionAttr (required '7.4.2') - Doesn't say anything about com.android.build.api.attributes.BuildTypeAttr (required 'beta') - Doesn't say anything about com.android.build.api.attributes.ProductFlavor:default (required 'prod') - Doesn't say anything about its target Java environment (preferred optimized for Android) - Doesn't say anything about its usage (required a runtime) - Doesn't say anything about org.jetbrains.kotlin.platform.type (required 'androidJvm')
GitLab CI脚本配置如下:
image: public.ecr.aws/openjdk:11jdk-new variables: ANDROID_COMPILE_SDK: "28" ANDROID_BUILD_TOOLS: "28.0.2" ANDROID_SDK_TOOLS: "4333796" ENVIRONMENT: $CI_COMMIT_REF_NAME REGION: $AWS_DEFAULT_REGION stages: - build lintDebug: image: public.ecr.aws/android:latest stage: build artifacts: name: "$CI_JOB_NAME-$CI_COMMIT_REF_NAME" when: always paths: - ./builds/poc-pipeline-android/app/build/outputs/* before_script: - | yes | sdkmanager --licenses && \ yes | sdkmanager --update --channel=0 && \ yes | sdkmanager \ "platforms;android-30" \ "platforms;android-29" \ "platforms;android-28" \ "platforms;android-27" \ "platforms;android-26" \ "platforms;android-25" \ "platforms;android-24" \ "platforms;android-23" \ "platforms;android-22" \ "build-tools;30.0.3" \ "build-tools;30.0.2" \ "build-tools;30.0.0" \ "build-tools;29.0.3" \ "build-tools;29.0.2" \ "build-tools;29.0.1" \ "build-tools;29.0.0" \ "build-tools;28.0.3" \ "build-tools;28.0.2" \ "build-tools;28.0.1" \ "build-tools;28.0.0" \ "build-tools;27.0.3" \ "build-tools;27.0.2" \ "build-tools;27.0.1" \ "build-tools;27.0.0" \ "build-tools;26.0.2" \ "build-tools;26.0.1" \ "build-tools;25.0.3" \ "build-tools;24.0.3" \ "build-tools;23.0.3" \ "build-tools;22.0.1" \ "build-tools;21.1.2" \ "build-tools;19.1.0" \ "build-tools;17.0.0" \ "system-images;android-30;google_apis;x86" \ "system-images;android-29;google_apis;x86" \ "system-images;android-28;google_apis;x86_64" \ "system-images;android-26;google_apis;x86" \ "system-images;android-25;google_apis;armeabi-v7a" \ "system-images;android-24;default;armeabi-v7a" \ "system-images;android-22;default;armeabi-v7a" \ "extras;android;m2repository" \ "extras;google;m2repository" \ "extras;google;google_play_services" \ "extras;m2repository;com;android;support;constraint;constraint-layout;1.0.2" \ "extras;m2repository;com;android;support;constraint;constraint-layout;1.0.1" \ "add-ons;addon-google_apis-google-23" \ "add-ons;addon-google_apis-google-22" \ "add-ons;addon-google_apis-google-21" script: - ./gradlew build
请问该问题是需要修改AAR模块的Gradle配置,还是调整CI脚本?
解决方案
问题出在AAR模块的Gradle配置上,当前的配置只创建了基础的default配置,但未添加Android构建所需的属性,导致CI构建时无法匹配prodBeta变体的属性要求。
方案1:手动为配置添加匹配属性
修改AAR模块的build.gradle,为default配置补充缺失的属性:
configurations { create("default") { attributes { // 标记为Java运行时依赖 attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage, Usage.JAVA_RUNTIME)) // 标记为Android目标环境 attribute(TargetJvmEnvironment.TARGET_JVM_ENVIRONMENT_ATTRIBUTE, objects.named(TargetJvmEnvironment, TargetJvmEnvironment.ANDROID)) // 标记为AndroidJVM平台 attribute(org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType.attribute, objects.named(org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType, org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType.androidJvm)) // 匹配主项目的BuildType和ProductFlavor attribute(com.android.build.api.attributes.BuildTypeAttr.ATTRIBUTE, objects.named(com.android.build.api.attributes.BuildTypeAttr, "beta")) attribute(com.android.build.api.attributes.ProductFlavorAttr.of("default"), objects.named(com.android.build.api.attributes.ProductFlavorAttr, "prod")) // 匹配AGP版本 attribute(com.android.build.api.attributes.AgpVersionAttr.ATTRIBUTE, objects.named(com.android.build.api.attributes.AgpVersionAttr, "7.4.2")) } outgoing.artifact(file('my-aar-1.0.0.aar')) } }
方案2:应用Android库插件(更推荐)
直接将AAR模块转为标准Android库模块,让插件自动生成适配所有变体的配置:
plugins { id 'com.android.library' } android { compileSdk 28 buildToolsVersion "28.0.2" defaultConfig { minSdkVersion 21 targetSdkVersion 28 } // 复制主项目的buildTypes配置 buildTypes { beta { // 保持与主项目一致的配置 } } // 复制主项目的productFlavors配置 productFlavors { prod { // 保持与主项目一致的配置 } } } dependencies { // 将本地AAR作为库依赖引入 implementation files('my-aar-1.0.0.aar') }
这种方式无需手动维护属性,Android库插件会自动生成对应buildType和productFlavor的配置,完美匹配主项目的属性要求。
内容的提问来源于stack exchange,提问作者Kazunari
相关产品推荐
相关产品推荐

