Android开发:《Gradle Recipes for Android》阅读笔记(翻译)3.2——设置Flavors和Variants

问题:

需要构建大体上一样,但是使用不同资源或者类的应用。

解决方案:

产品的flavors可以帮助你对同一个app创建不同的版本。

讨论:

build types是开发过程的一部分,一般用来将app从开发版进化到生产版。默认的build types:debug和release反应了这个。

Flavors让你能够构建同一个app的不同版本。当你想对不同版本的app自定义不同的外观,或者你需要一个免费版和收费版的app,你可以使用Flavors。

可以使用productFlavors块来声明product的flavor。

考虑下这样的场景,设置一个基于简单edittext入口的“helloworld”风格的欢迎界面。你给app设置不同的flavors:“friendly”,“arrogant”,“obsequious”:

android {
    productFlavors {
         arrogant {
              applicationId 'com.oreilly.helloworld.arrg'
         } 
         friendly {
             applicationId 'com.oreilly.helloworld.frnd'
         }
         obsequious {
             applicationId 'com.oreilly.helloworld.obsq'
         } 
    }
}        

每个都有不同的applicationId,这样三个都可以安装在同一个设备上面。

注:flavor的名字不可以和已经存在build type的名字或者预定义的androidTest相同。

每个产品的flavor都有下列属于自己的属性,其中,都是基于defaultConfig中相同的属性:

applicationId

minSdkVersion

targetSdkVersion

versionCode

versionName

signingConfig

每个flavor定义自己的代码设置和资源,它们是主目录的同级代码。意味着,除了app/src/main/java文件夹外,你可以把代码放在以下的目录:

app/src/arrogant/java

app/src/friendly/java

app/src/obsequious/java

你也可以增加额外的资源文件在:

app/src/arrogant/res

app/src/arrogant/res/layout

app/src/arrogant/res/values

同样的资源结构会被应用到所有flavors,如:

相似的文件结构。一个build type和一个flavor的组合被称作variant。对于默认的两个build types(debug和release)和上面展示的三个flavors(arrogant,friendly和obsequious),6种不同变体(variant)的apk可以被生成。

为了看到所有可能的变体名,可以在module的build文件中增加自定义任务:

task printVariantNames() {
    doLast {
        android.applicationVariants.all { variant ->
            println variant.name
        } 
    }
}

在命令行下执行./gradlew printVariantNames

为了部署一个指定的变体,android sudio提供了一个build variant的视图。可以在下拉列表中选择合适的变体:

  

product flavors使用后,assemble任务会构建所有可能的变体。assemble<variant>任务会构建指定的build type和flavor。你也可以使用assemble<BuildType>构建这个build type下所有的flavors,或者使用assemble<Flavor>任务构建这个flavor下所有的build type。install任务被分配到每个变体,如installArrogantDebug或者installFriendlyRelease。

posted @ 2017-02-11 23:37  tootwo2  阅读(503)  评论(0编辑  收藏  举报