首先因为公司对某个项目有打不同版本apk包的需求;要是分开维护的话 灰常麻烦;只能在Gradle中通过类似打不同版本包的形势完成了该需求。下面简单解说下 在这过程中踩过的坑。
主要靠productFlavors
一个product flavor定义了从项目中构建了一个应用的自定义版本。一个单一的项目可以同时定义多个不同的flavor来改变应用的输出。
这个设计是为了解决不同的版本之间的差异非常小的情况。虽然最项目终生成了多个定制的版本,但是它们本质上都是同一个应用,那么这种做法可能是比使用库项目更好的实现方式。
Product flavor需要在productFlavors这个DSL容器中声明:
android {
....
productFlavors {
defaultPublishConfig "flavor1"
publishNonDefault true
flavor1 {
...
//此处可以 定义 applicationId,来实现不同版本装在同一个手机的需求
//manifestPlaceholders 可以定义一些常量来实现AndroidManifest.xml不同的配置
// 可以通过 buildConfigField "String", "NAME", "\"小明\"" 通过BuildConfig.NAME获取
}
flavor2 {
...
}
}
}
在这个地儿有个坑 当你这个model是做完lib被引用时候 必须指定 defaultPublishConfig “XXXXX”; 否则会出现引用该库是类都找不到的问题
基本原则
通过 android.defaultPublishConfig修改默认的发布配置
通过 android.publishNonDefault = true 启用其他variants的发布
通过 compile project(path: ‘:project’, configuration: ‘flavor1Debug’) 引用指定的variant(备注当通过这种方式引用的时候 对应的库可以不配置 defaultPublishConfig)
而主应用则不用配置defaultPublishConfig;方便手动切。暂且就这么点过多的就不在此详述了。
哎对了 各种尝试的过程中还发现个这样有趣的问题
def name = ""
android {
....
productFlavors {
defaultPublishConfig "flavor1"
publishNonDefault true
flavor1 {
...
name = "小明"
}
flavor2 {
...
name = "小红"
}
}
}
println "the name is $name"
这时候不管怎么切换版本 都会输出小红;productFlavors 中flavor中代码都会执行 是覆盖关系…
——————————————————分割线——————————————————
额 又想到先 可以补充的 针对不同版本依赖不同库文件的时候 可以通过这种方式来应对
flavor1compile project(path: ':project', configuration: 'flavor1Debug')