如何使用Gradle构建不同版本的app?

某软件,一套源代码中绝大多数代码是相同的,仅仅是某些类不同; 或者说,在某版本的app上开发新的beta版本。 笨笨的方法是有几个版本使用拷贝几个源代…
关注者
75
被浏览
16,008

6 个回答

不久之前总结过:

如何通过Gradle实现一套代码开发不同特性的APK

有demo参考,希望能帮到你!

Java语言不能像C或者C++可以使用#if, #elif, #else, #endif这些条件编译指令能够对部分代码进行编译隔离,eclipse也不能提供像xcode能够提供在同一个项目创建不同的task,每个task能够选择需要的代码和资源进行编译打包这种功能,但是现在Android Studio使用Gradle已经能够很方便满足构建多个版本不同代码的需求,虽然没有条件编译指令来的方便。 我的项目还在使用eclipse的时候需要在不同的渠道使用不同的代码是非常的简单粗暴的,就是使用ant脚本判断不同的渠道进行代码文件的删减和某些字符串常量的替换,这种方式不便于扩展和维护,也难于让组内其他同事快速上手和维护。

我之前是使用eclipse的Exporting an eclipse project as gradle功能生成Gradle文件,代码目录结构没有改变,还是eclipse的格式,从而能够同时使用AS和eclipse,这样可以方便的组内未转AS的同学还能够继续使用eclipse开发,但是这样就有个缺点,在构建不同的Build Variants需要在代码目录创建多个flavor目录就会非常的不方便,而且我们的flavor也比较多。在上周我也已经通知组内的同事我们在下个版本开始要全部转AS开发,因此今天还特意去公司加班把项目的文件目录结构改成AS的格式,这样就很方便flavor的管理,单元测试起来也很来的方便。所以题主如果你的项目还是从eclipse的目录结构,还是尽早的去修改成AS的目录结构。

其实构建不同版本不同代码非常简单,在gradle的flavors标签声明多个flavor,然后在src创建对应flavor名字的目录,把对应的类丢进去,然后在Build Variants选择不同的buildTypeFlavor就可以编译运行了。目录结构如下图,不过有个点要解释下,main目录是没有classA和classB的,否则会提示类重复的错误,所以要删掉

project/
   |
   |---src/
        |---flavorA2/
        |      |
        |      |---java/
        |      |     |---com.abc
        |      |                 |-----classA.java
        |      |                 |-----classB.java
        |      |---res/
        |      |---AndroidManifest.xml
        |
        |---main
        |      |---java/
        |      |     |---com.abc.flavorA
        |      |                 |-----classC.java
        |      |                 |-----classD.java
        |      |---res/
        |      |    |---drawable/
        |      |    |---layout/
        |      |    |---values/
        |      |         
        |      |---AndroidManifest.xml
        |
        |---falvorA
        |      |---java/
        |      |     |---com.abc
        |      |                 |-----classA.java
        |      |                 |-----classB.java