Android:基于Gradle实现不同Flavor的产物管理
根据Flavor切换封装的外部AAR库方案
以下是几种可行的实现方案,解决根据特定Flavor切换对应外部AAR库的需求:
方案一:动态创建Flavor专属配置并绑定AAR
在封装AAR的Module的build.gradle(Groovy)中,先定义与主App一致的Flavors,再通过动态配置为每个Flavor绑定对应AAR:
android { flavorDimensions "version" productFlavors { flavor1 { dimension "version" } flavor2 { dimension "version" } } } // 为每个Flavor创建专属配置并添加对应AAR afterEvaluate { android.productFlavors.each { flavor -> def flavorConfig = "${flavor.name}RuntimeOnly" configurations.maybeCreate(flavorConfig) artifacts.add(flavorConfig, file("libs/ExternalLibrary-${flavor.name}.aar")) } }
主App的build.gradle中,按Flavor关联对应配置的依赖:
dependencies { flavor1Implementation project(path: ':your-aar-module', configuration: 'flavor1RuntimeOnly') flavor2Implementation project(path: ':your-aar-module', configuration: 'flavor2RuntimeOnly') }
方案二:按Flavor目录存放AAR,通过SourceSets关联
将不同Flavor的AAR分别放在Module的src/flavor1/libs、src/flavor2/libs目录下,通过SourceSets为每个Flavor指定资源目录:
android { flavorDimensions "version" productFlavors { flavor1 { dimension "version" } flavor2 { dimension "version" } } sourceSets { flavor1 { jniLibs.srcDirs = ['src/flavor1/libs'] dependencies { implementation files('src/flavor1/libs/ExternalLibrary-flavor1.aar') } } flavor2 { jniLibs.srcDirs = ['src/flavor2/libs'] dependencies { implementation files('src/flavor2/libs/ExternalLibrary-flavor2.aar') } } } }
主App直接依赖该Module即可,Gradle会自动根据当前Flavor匹配对应目录的AAR:
dependencies { implementation project(':your-aar-module') }
方案三:通过VariantFilter为变体绑定AAR
利用VariantFilter遍历构建变体,直接为每个Flavor变体添加对应AAR依赖:
android { flavorDimensions "version" productFlavors { flavor1 { dimension "version" } flavor2 { dimension "version" } } variantFilter { variant -> def targetFlavor = variant.flavors[0].name variant.variantData.scope.dependencies.add( files("libs/ExternalLibrary-${targetFlavor}.aar") ) } } // 保留默认配置作为 fallback configurations.maybeCreate("default") artifacts.add("default", file("libs/ExternalLibrary-flavor1.aar"))
主App直接依赖Module,构建时会自动匹配当前Flavor对应的AAR。
注意事项
- 主App与封装Module的Flavor维度、名称必须完全一致,否则无法完成匹配
- 确保AAR文件路径与代码中定义的路径一致,避免构建时出现文件找不到的错误
- 若使用Kotlin DSL,语法需做对应调整(如
configurations.maybeCreate改为configurations.createIfNotExists)
内容的提问来源于stack exchange,提问作者user3363936
相关产品推荐
相关产品推荐

