gradle多版本源码管理及打包

一、需求背景

实际项目开发过程中,经常会遇到这样的场景:一个项目要根据需要打包成多个存在差异的版本,比如对外版本、对内版本,或者开发版本、测试版本、线上版本等等……那么如何通过维护一套代码的前提下实现打包多版本的需求呢?在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一样即可,目录创建参照下图:

《gradle多版本源码管理及打包》 Paste_Image.png

四、在代码中判断版本

如果有些公共的逻辑需要在代码中判断版本,可以通过BuildConfig.FLAVOR去获取当前选择的是什么版本值:
<pre>
if(BuildConfig.FLAVOR.equals(“v1”)){
textView.setText(getResources().getString(R.string.my_app_name) + “_v1”);
}
</pre>

五、按版本打包

1> 签名打包的时候,选择对应的版本即可:

《gradle多版本源码管理及打包》 Paste_Image.png

2> 使用gradlew命令打包:

gradlew assembleDebug //打包所有版本
gradlew assemblev1Debug //打包v1版本
gradlew assemblev2Debug  //打包v2版本
gradlew assemblev3Debug  //打包v3版本

PS: 更多原创技术好文,请关注下方公众号:

《gradle多版本源码管理及打包》 code_share.jpg

    原文作者:测试开发栈
    原文地址: https://www.jianshu.com/p/8d7034a6d8db
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞