Gradle之构建变体(BuildVariant)

一、构建变体

1. BuildType

1.1 默认BuildType

默认情况下,Android plugin会自动的构建release和debug两个版本

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    debug {
        minifyEnabled false
    }
}
// release版本中设置了开启混淆,并且定义了混淆文件的位置

release和debug的差异主要在于是否可以在设备上调试应用以及APK如何签名。

  • debug 版本会被使用已知的名称/密码自动生成的密钥/证书签名。
  • release 版本在构建过程中不会被签名,需要构建后再签名。
1.2 自定义BuildType

Android plugin允许自定义这两个示例,并且可以创建其他的buildType,如下:

buildTypes {
    debug {
        minifyEnabled false
        applicationIdSuffix ".debug"
    }
    custom.initWith(buildTypes.debug)
    custom {
        applicationIdSuffix ".custom"
        versionNameSuffix "-customs"
    }
}
  • 上述配置进行了一下设置

    1. 对默认的debug构建类型进行了修改,关闭了混淆配置,添加applicationId后缀
    2. 以debug为基础创建一个叫custom的构建类型(相当于继承了debug版本),在custom的构建类型中修改applicationId后缀,并添加了versionName的后缀
  • 创建一个新的BuildType的步骤为:

    1. 在buildTypes容器下添加一个自定义名称的元素
    2. 调用initWith或者使用闭包进行配置点击查看BuildType的可配置属性
  • 对于每一个BuildType,Android plugin都会创建对应的“assembleBuildTypeName”任务

  • 对于每一个BuildType,都可以在dependencies容器中添加名为BuildTypeNameCompile的依赖配置

  • 对于每一个BuildType,Android plugin都会创建一个对应的sourceSet,默认位置为:src/BuildTypeName
    所以新建BuildType的名字不能是main、androidTest和test这三个已经被用的名字
    BuildType的代码/资源会以以下方式进行合并

    1. manifest会被合并到app的manifest文件中
    2. res目录下的资源文件会替换main里的资源文件
    3. java目录下的文件会被添加到main里的java目录中,所以不能和main里的类重名(含包名)

2. ProductFlavor

2.1 单维度的ProductFlavor

ProductFlavor定义了通过工程构建应用的自定义版本。一个独立的工程可以定义不同的flavor改变生成的应用。
创建方式:

productFlavors {
    flavor1 {
        minSdkVersion 10
        versionCode 1
    }
    flavor2 {
        minSdkVersion 14
        versionCode 2
    }
}
  • 上述配置进行了以下设置

    1. 新建了两个ProductFlavors,名字分别为flavor1和flavor2
    2. 重新设置了minSdkVersion和versionCode
  • 创建一个新的ProductFlavor的步骤为:

    1. 在productFlavors容器下添加一个自定义名称的元素
    2. 使用闭包进行配置
2.2 多维度的ProductFlavor

某些情况下,我们需要从多个维度来区分app的版本,比如渠道和是否付费,只是我们就需要创建多维度的ProductFlavor来生成不同的apk。
创建方式:

flavorDimensions "channle", "version"

productFlavors {
    huawei {
        dimension "channle"
    }

    xiaomi {
        dimension "channle"
    }

    free {
        dimension "version"
    }

    paid {
        dimension "version"
    }
}
  • 上述配置进行了以下设置

    1. flavorDimensions定义了可能用到的维度和顺序
    2. 新建了四个ProductFlavor,每一个ProductFlavor都指定了一个维度
  • 创建多维度的ProductFlavor的步骤为:

    1. 使用flavorDimensions定义维度和顺序
    2. 在productFlavors容器下添加一个自定义名称的元素
    3. 使用闭包进行配置,必须指定ProductFlavor的维度点击查看ProductFlavor的可配置项
  • 对于每一个ProductFlavor,Android plugin都会创建对应的“assembleProductFlavorNameDebug”和“assembleProductFlavorNameRelease”任务

  • 对于每一个ProductFlavor,都可以在dependencies容器中添加名为ProductFlavorNameCompile的依赖配置

  • 类似BuildType,Android plugin也会为ProductFlavor创建对应的sourceSet,默认的位置为:src/ProductFlavorName
    所以ProductFlavor的名字不能和已存在的BuildType的名字冲突
    ProductFlavor的代码/资源会以以下方式进行合并

    1. manifest会被合并到app的manifest文件中
    2. res目录下的资源文件会替换main里的资源文件
    3. java目录下的文件会被添加到main里的java目录中,所以不能和main里的类重名(含包名)

3. BuildVariant

BuildType和ProductFlavor相结合,组成了构建变体。每创建一个buildType或productFlavor,都会同时创建相应的变体。

3.1 单维度ProductFlavor时产生的BuildVariant

例如:

buildTypes {
    debug {
        minifyEnabled false
        applicationIdSuffix ".debug"
    }
    custom.initWith(buildTypes.debug)
    custom {
        applicationIdSuffix ".custom"
        versionNameSuffix "-customs"
    }
}

productFlavors {
    flavor1 {
        minSdkVersion 10
        versionCode 1
    }
    flavor2 {
        minSdkVersion 14
        versionCode 2
    }
}

上述配置的情况下会产生6个BuildVariant:

  • flavor1Debug
  • flavor1Release
  • flavor1Custom
  • flavor2Debug
  • flavor2Release
  • flavor2Custom
3.2 多维度ProductFlavor时产生的BuildVariant

如果是多维度的ProductFlavor,例如:

buildTypes {
    debug {
        minifyEnabled false
        applicationIdSuffix ".debug"
    }
    custom.initWith(buildTypes.debug)
    custom {
        applicationIdSuffix ".custom"
        versionNameSuffix "-customs"
    }
}

flavorDimensions "channle", "version"

productFlavors {
    huawei {
        dimension "channle"
    }

    xiaomi {
        dimension "channle"
    }

    free {
        dimension "version"
    }

    paid {
        dimension "version"
    }
}

上述配置的情况下会产生12个BuildVariant:

  • huaweiFreeDebug
  • huaweiFreeRelease
  • huaweiFreeCustom
  • huaweiPaidDebug
  • huaweiPaidRelease
  • huaweiPaidCustom
  • xiaomiFreeDebug
  • xiaomiFreeRelease
  • xiaomiFreeCustom
  • xiaomiPaidDebug
  • xiaomiPaidRelease
  • xiaomiPaidCustom
3.3 BuildVariant的使用
  • 对于每一个BuildVariant,Android plugin都会创建对应的“assembleBuildVariantName”任务

  • BuildVariant的sourceSet合并规则:

    1. 所有的manifest会被合并到一个manifest文件中
    2. res目录下的资源文件会遵循优先级覆盖的原则:
      • BuildType会覆盖ProductFlavor
      • flavorDimensions中定义维度是的顺序,决定了ProductFlavor之间资源覆盖的顺序,顺序在在前的优先级越高,高优先级会覆盖低优先级的资源
      • ProductFlavor会覆盖main的资源文件
    3. java目录下的文件会被添加到main里的java目录中,如果所选的BuildVariant中BuildType和ProductFlavor对应的sourceSet中有同名的类,则会编译不通过
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,637评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,831评论 25 707
  • 转载注明出处:http://www.jianshu.com/p/5255b100930e 0. 前言 完全由个人翻...
    王三的猫阿德阅读 2,506评论 0 4
  • 1.介绍 如果你正在查阅build.gradle文件的所有可选项,请点击这里进行查阅:DSL参考 1.1新构建系统...
    Chuckiefan阅读 12,122评论 8 72
  • 0404-今日话题-萌 你报过多少网络课程?学习情况如何? 1.战隼老师的知乎live利用时间管理工具提升生活质量...
    萌爱佑佑阅读 151评论 0 0