问题
考虑一个问题,存在一个普通的application和一个library项目,application需要依赖于library,而它们分别都定义了自己的buildTypes与flavors,不同的variants之间代码上可能存在着区别,现在需要实现application分别与library中相匹配的variants结合依赖。
环境
- gradle-plugin version: 2.2.2
- gradle version: 2.14.1+
- Android Studio: 3.0.1
常规操作
一般这种添加依赖的,那就直接在application的dependencies中加入对library的依赖就可以了,如1
2
3dependencies{
compile project(':library')
}
这样就增加了对library依赖,这没毛病。
然而,在加上了flavor的维度后,同步后会出错
这是因为添加flavor后默认的compile不知道要依赖谁(因为有多个variants),默认的配置应该需要根据实际来作调整。
进阶操作
在添加了flavor后,实际上是增加了variants的种类了,我们知道,compile只是一个默认的编译依赖,基于compile可以扩展自定义的依赖配置,如我们熟悉的debugCompile,releaseCompile可以根据不同的buildType来决定不同的依赖对象。
而flavor,也有同样的特性,但这种依赖需要手动配置。
在app的build.gradle里,在configrautions里加几个配置
1 | configurations { |
其分别对应于不同的variants,但不需要extendsFrom compile,估计是android的插件帮我们完成的。
再在dependencies中添加library的依赖
1 | devDebugCompile project(path: ':library', configuration: 'devDebug') |
拿devDebugCompile这个依赖来说,意思是给我添加一个library模块的依赖,且使用它的devDebug的variant。
再进一步
添加完依赖后,理应gradle是可以找到对应的依赖的,但事实上还是编译不过,提示
说是library模块没有声明’prodDebug’的configuration,这是因为默认的library的输出是不带flavor的,如果我们带上flavor后,新的variant普通的依赖方式是找不着的,就算是加上上面的声明也没用,library模块也要同样的声明。
在library模块里加上以下声明即可
1 | android{ |
声明publish的时候有这四种类型,如此一来,app就能知道library有声明哪些输出了,依赖也就成立了。
验证
as中切换Build Variants,可以看到切换variants时app与library都会联动,并根据不同的variants,选择与哪个library编译。
在项目中
./gardlew :app:androidDependencies
可以看到不同的variants有不同的依赖关系
github demo