Gradle对多版本项目的管理

jopen 9年前

      在实际工作中,我们可能会给很动客户提供apk,而不同的客户又有不同的需求,如果需求不是差别很大的话,通过Gradle来管理是非常方便的。 Gradle的Android plugin提供了productFlavors方法来实现对多个项目的管理,具体实现方法为在项目Gradle脚本的android配置下加入以下代 码,就加入了两个项目的版本管理,其强大的地方在于可以通过对不同flavor的sourceSets进行配置来实现差异化,比如在src/escape /values的值会在编译时覆盖main sourceSets里的res/values的值,达到overlay的效果,后面会详细的对这项属性进行介绍:

android{

             . . . . . .

productFlavors{

            escape{

                versionName "1.0-escape"

            }

            tcl{

                versionName "1.0-tcl"

            }

     }

. . . . . .

</blockquote>

}

然后点击Build Variant右边的箭头就可以选择相应的版本进行编译



   详细介绍Build variants(构建变种版本)

    该项功能主要是用来从一个单独工程创建一个应用的不同版本,这是非常有用的,如果你的app有一个demo版本和一个需要收费的版本或者你想在不同配置的设备上都不同的apk。  
    Gradle使用product flavors(产品的多样化)来创建app的不同版本,每一个app版本可能有不同的特点或者设备需求。Gradle为每一个版本的app产生不同的apk。
    构建变种
    app的每一个版本在Gradle编译系统中用一个build variant(构建变种)表示。构建变种信息包含了编译类型和产品独特配置(build types和product flavor)。Android studio默认定义了两种编译类型(debug和release),没有定义产品配置。这些默认的项目由两个构建变种组成,debug和 release,gradle会为每一个变种生成一个apk。
     上面的例子中定义了两个项目配置,escape和tcl,这会产生四个构建变种:

  •      escape-debug
  •      escape-release
  •      tcl-debug
  •      tcl-release
     在编译的时候有四种选择,可以为每一个变种生成相应的apk。
     在编译每一个版本的app的时候,Gradle会从下面的目录整合源代码和资源:
  •      src/main/ 主要的代码目录(对所有的变种都通用)
  •      src/<buildType>/ 编译类型代码目录
  •      src/<flavorName> falvor代码目录
     flavor代码目录的使用数量是根据工程的flavor配置来决定的:
  •      对于没有定义任何flavors的工程,构建系统不会使用任何的flavor代码目录,比如为了产生没有定义flavors的release版本变种,构建系统使用下列目录:

          src/main/

          src/release/(build type)

</blockquote>

  •       对于定义了一些flavors的工程,构建系统会使用一个flavor代码目录,例如,产生上面的escape-debug构建变种,构建系统会使用下列目录:

        src/main/

        src/debug/(build type)

        src/escape/(flavor)

</blockquote>

        这些目录的代码会被共同使用来产生构建变种的输出,可以在不同的目录中存在相同名称的类,只要它们不在同一个变种的构建中使用。构建系统会把所有的 manifests整合成一个manifest,所以每一个构建变种都可以定义在manifest中定义不同的组件或者权限。
     构建系统会把所有的资源目录组合到一起,如果在一个构建中,不同的目录包含相同名称的资源,优先级顺序为:build type的资源覆盖product flavor的资源,product flavor的资源覆盖main source目录的资源。

     创建app不同版本的步骤:

    1.在build文件中定义product flavors

    2.为每一个flavor创建source目录,例如为escape flavor创建以下目录

</blockquote>

       app/src/escape/java

</blockquote>

       app/src/escape/res

</blockquote>

       app/src/escape/res/layout

</blockquote>

       app/src/escape/res/values

</blockquote> </blockquote>

    3.为project添加属于flavor的代码和资源

</blockquote>