一、需求背景
实际项目开发过程中,经常会遇到这样的场景:一个项目要根据需要打包成多个存在差异的版本,比如对外版本、对内版本,或者开发版本、测试版本、线上版本等等……那么如何通过维护一套代码的前提下实现打包多版本的需求呢?在Android Studio中我们可以使用gradle的productFlavors等功能来实现这样的需求。
二、配置gradle文件
在moudle的gradle配置文件中增加如下配置:
1> 使用sourceSets 给多个版本的源码设置差异化目录,比如现在有三个版本(v1、v2、v3、main),main为原始的默认目录,v1、v2、v3为差异化版本,如果v1、v2、v3下面没有指定的资源或代码,则使用默认目录main中的,下面给它们指定各自的目录:
sourceSets {
main {
manifest.srcFile 'src/main/AndroidManifest.xml'
java.srcDirs = ['src/main/java']
res.srcDirs = ['src/main/res']
assets.srcDirs = ['src/main/assets']
}
v1{
java.srcDirs = ['src/v1/java']
assets.srcDirs = ['src/v1/assets']
}
v2{
java.srcDirs = ['src/v2/java']
assets.srcDirs = ['src/v2/assets']
res.srcDirs = ['src/v2/res']
}
v3{
java.srcDirs = ['src/v3/java']
res.srcDirs = ['src/v3/res']
assets.srcDirs = ['src/v3/assets']
}
}
2> 利用productFlavors 设置打包时的包名及label等
productFlavors {
v1{
manifestPlaceholders = [app_label: "@string/app_name_v1"]
applicationId "com.yag.demo.v1"
}
v2{
manifestPlaceholders = [app_label: "我是V2"]
applicationId "com.yag.demo.v2"
}
v3{
manifestPlaceholders = [app_label: "我是V3"]
applicationId "com.yag.demo.v3"
}
}
3> 为不同版本设置不同的依赖(如果有这样的需求),差异化的依赖使用flavors + Compile(比如v1Compile)去设置,公共的依赖仍使用compile
v1Compile(name: 'tools-lib-release', ext: 'aar')
v1Compile'com.xx.xx.sdk:colortheme-blue:1.2.170113'
v2Compile'com.xx.xx.sdk:colortheme-red-light:1.0.150165'
v3Compile'com.xx.xx.sdk:colortheme-grey:1.7.152403'
compile 'com.squareup.leakcanary:leakcanary-android:1.4-beta2'
compile('fr.avianey.com.viewpagerindicator:library:2.4.1.1@aar') {
exclude group: 'com.android.support', module: 'support-v4'
}
三、创建差异化版本目录结构
上述gradle配置完后,就要在moudle下面创建差异化版本目录了,将版本差异化的代码或资源文件放在这对应的文件夹下,具体的目录层次同main一样即可,目录创建参照下图:
Paste_Image.png
四、在代码中判断版本
如果有些公共的逻辑需要在代码中判断版本,可以通过BuildConfig.FLAVOR去获取当前选择的是什么版本值:
<pre>
if(BuildConfig.FLAVOR.equals(“v1”)){
textView.setText(getResources().getString(R.string.my_app_name) + “_v1”);
}
</pre>
五、按版本打包
1> 签名打包的时候,选择对应的版本即可:
Paste_Image.png
2> 使用gradlew命令打包:
gradlew assembleDebug //打包所有版本
gradlew assemblev1Debug //打包v1版本
gradlew assemblev2Debug //打包v2版本
gradlew assemblev3Debug //打包v3版本
PS: 更多原创技术好文,请关注下方公众号:
code_share.jpg