如何确保Gradle不同构建变体对应链接Debug/Release版本库?
解决构建变体对应版本库的链接问题
你当前的代码逻辑存在问题:Gradle的依赖配置块是在配置阶段执行的,debugCompileOnly和releaseCompileOnly这两个块都会被执行,buildConfig变量会被最后执行的那个块覆盖(比如如果releaseCompileOnly在后面,不管是Debug还是Release构建,最终都会用release版本的库),根本达不到区分变体的效果。
下面是几种正确的实现方式:
方法一:直接使用变体专属依赖配置
最直观的方式,针对Debug和Release构建类型分别声明依赖:
dependencies { // Debug构建时链接debug版本的aar debugImplementation(fileTree(mapOf("dir" to "libs", "include" to listOf("mylib-debug-1.0.0.aar")))) // Release构建时链接release版本的aar releaseImplementation(fileTree(mapOf("dir" to "libs", "include" to listOf("mylib-release-1.0.0.aar")))) }
方法二:遍历构建类型批量配置
如果后续可能新增构建类型,用遍历的方式更灵活:
android { buildTypes { debug {} release {} // 后续新增的构建类型,比如staging,也能自动适配 staging {} } } dependencies { // 遍历所有构建类型,自动匹配对应版本的库 android.buildTypes.each { buildType -> implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("mylib-${buildType.name}-1.0.0.aar")))) } }
方法三:适配多产品风味的场景
如果项目还有产品风味(比如free/paid),可以遍历所有应用变体来配置:
android { buildTypes { debug {} release {} } productFlavors { free {} paid {} } } dependencies { android.applicationVariants.each { variant -> // 获取当前变体的implementation配置名称,比如freeDebugImplementation val configName = variant.implementationConfigurationName // 根据构建类型匹配对应库 add(configName, fileTree(mapOf("dir" to "libs", "include" to listOf("mylib-${variant.buildType.name}-1.0.0.aar")))) } }
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

