Android Gradle 代码实现指定渠道不引入引用

参考:

不一样的Gradle多渠道配置总结 - 掘金


首先感谢 GitLqr 大佬的无私分享,Gradle多渠道写的很详细。我这里取用一小点。

gradle 提供了 productFlavors 来实现不同的渠道。

不同的渠道引入不同的引用也很简单,可以每个渠道分开指定需要引用的库。

但是如果有几十个渠道,其中一个要引用不同的库。不能因此写几十遍引用,这样后期改动也很麻烦,所以要通过配置来实现。

首先假定有这些渠道

productFlavors {
        channel1 {}
        channel2 {}
        channel3 {}
        channel4 {}
        channel5 {}

        // ... channel xxx 假定非常多
}

那么,可以通过以下代码来对不同的渠道引入不同的内容:

此时 channel1 是直接将远程库加入包,其他渠道是不打入的。

注意:示例代码是 library,所以用的libraryVariants 。如果是apk,需要改成 applicationVariants

dependencies {

    def aar1='com.xxx.xxx:aaaa:1.0.0-SNAPSHOT'
    def aar2='com.xxx.xxx:bbbb:1.0.0-SNAPSHOT'

    android.libraryVariants.all { variant ->
        variant.productFlavors.each { flavors ->
            // println(flavors.name)

            if (flavors.name.equals("channel1")) {
                dependencies.add("${variant.flavorName}Embed", aar1)
                dependencies.add("${variant.flavorName}Embed", aar2)
            } else {
                dependencies.add("${variant.flavorName}CompileOnly", aar1)
                dependencies.add("${variant.flavorName}CompileOnly", aar2)
            }
			
			// 示例
			// 本地引用1
//        	dependencies.add("${variant.flavorName}Implementation", project(':DroidPluginFix'))
			// 本地引用2
//        	dependencies.add("${variant.flavorName}Implementation", fileTree(include: ['*.aar'], dir: 'libs_xxx_1'))
			// 远程引用1
//        	dependencies.add("${variant.flavorName}Implementation", 'com.xxx.xxx:aaaa:1.0.0-SNAPSHOT')
			// 远程引用2
// 			dependencies.add("${variant.flavorName}Embed", 'com.xxx.xxx:aaaa:1.0.0-SNAPSHOT')
        	// 远程引用3 
//			dependencies.add("${variant.flavorName}CompileOnly", 'com.xxx.xxx:bbbb:1.0.0-SNAPSHOT@aar')
        }
    }
	
	
	// others xxx
}

还有个方法写起来更简单,但是不完美

dependencies {

    gradle.startParameter.getTaskNames().each { task ->
        // printf("====================================================")
        // println("print task : " + task)
        if (task.contains('Channel1')) {
            embed ('com.xxx.aaa:asd:1.0.0')
        } else {
            compileOnly ('com.xxx.bbb:asd:1.0.0')
        }
    }


	// others xxx
}
	

这个是通过 task 来进行区分:

打单个渠道时是没有问题的:gradle clean assembleChannel1 / assembleChannel2 这时候能够区分出 Channel1 。

但是如果你想打所有渠道,使用类似 gradle clean assebmleRelease

这时候task 就是 clean 和 assembleRelease ,就无法触发if 了。所以这个方法不完美。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值