专栏首页AnRFDevGradle 构建多种版本

Gradle 构建多种版本

本章目的

  • Build types 构建类型
  • Product flavors
  • Build variants 构建不同种类
  • Signing configurations

开发APP时,会有生成不同版本的需求。比如测试版本和发布版本。不同版本之间通常有不同的设置。

Build types

定义APP或者模块该被如何构建。

可以用buildTypes来定义构建类型。例如:

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

默认的build.gradle文件会包含一个release构建类型

创建构建类型

比如创建一个staging构建类型

buildTypes {
    // staging 是一个自定义名字
    // 生成signed App时可以选择这个类型
    staging.initWith(buildTypes.debug)
    staging {
        applicationIdSuffix ".staging"
        versionNameSuffix "-staging"
        buildConfigField("String", "BASE_URL", "\"http://www.staging.com\"")
    }
}

这里定义了applicationIdSuffix,让staging版本的applicationId和release版本的不同。

initWith()创建一个新的构建类型并复制现有的构建类型。用这个方法可以复写已有的构建类型。

资源目录

创建了新的构建类型后,可以建立新的资源文件。例如我们已经有了staging构建类型

src
├── androidTest
├── debug
├── greenRelease
├── main
├── redDebug
├── staging// 可以新建资源目录
└── test

不同资源目录里的文件可以用相同的文件名。

main目录里的strings.xml

<resources>
    <string name="app_name">GDemo</string>
</resources>
<resources>
    <!-- staging strings.xml -->
    <string name="app_name">GStaging</string>
</resources>

生成不同版本的app时,会自动去找相应的资源文件

依赖包管理

每一种构建类型可以有自己的依赖。Gradle自动为每个类型创建依赖配置。 下面就是单独为debug版本添加logging模块的依赖

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.1.1'
    testCompile 'junit:junit:4.12'

    debugCompile 'de.mindpipe.android:android-logging-log4j:1.0.3'
}

Product flavors 产品特征

product flavors用于创建同一个APP的不同版本。最直接的例子就是免费和付费版APP。

当我们要发布APP时,可以选择release或者staging(上面的例子)版。但是对同一个构建类型,比如对 于release版,我们可以用Product flavors打包出有各自特征的APP。比如:

// 多渠道打包可以用在这里配置
// 一旦配置了productFlavors,生成apk时会默认选其中一个选项
productFlavors {
    red {
        versionName "1.0-red"
    }
    green {
        applicationId "com.rustfisher.gradletest.green" // 使用另一个签名
        versionNameSuffix "-green"// 版本名添加后缀
    }
}

资源文件

新建了productFlavors类型后,我们可以新建相应的资源目录。

src
├── androidTest
├── debug
├── greenRelease // release版本  采用green
├── main
├── redDebug // debug版本   采用red
├── staging
└── test

多种特种的变量 Multiflavor variants

在Product flavors中可以进行组合,例如

android {

    flavorDimensions("color", "price") // 新建了2种类型

    // 多渠道打包可以用在这里配置
    // 一旦配置了productFlavors,debug时会默认选一个选项
    productFlavors {
        red {
            versionName "1.0-red"
            dimension "color"
        }
        green {
            applicationId "com.rustfisher.gradletest.green" // 使用另一个签名
            versionNameSuffix "-green"
            dimension "color"
        }
        freeApp {
            dimension "price"
        }
        paidApp {
            dimension "price"
        }
    }
}

那么在打包apk时,可以有如下4种版本

green-freeApp 
green-paidApp 
red-freeApp 
red-paidApp

一旦添加flavorDimensions,就必须为每一个flavor制定dimension。 就像上面的colorprice必须出现在下面4种productFlavors之中。否则会报错。

Build Variants

Android Studio左下角可以打开Build Variants窗口。选择模块和Build Variants。 前面配置的构建类型都会在这个列表中出现。

Tasks 任务

Android plugin for Gradle 会自动为每个配置的构建类型创建任务。 新建项目时,会有默认的assembleDebug 和 assembleRelease。 经过上面的配置以后,会有产生相对应的任务

assemble
assembleAndroidTest
assembleDebug
assembleFreeApp
assembleGreen
assembleGreenFreeApp
assembleGreenPaidApp
assemblePaidApp
assembleRed
assembleRedFreeApp
assembleRedPaidApp
assembleRelease
assembleStaging

Resource and manifest merging

Android的Gradle插件会在打包app前将主要资源和构建类型资源合在一起。另外,lib工程也可以提供 额外可被合并的资源文件。manifest文件也可被合并。比如在debug版本中申请正式版中不需要的权限。

定义构建变量

给productFlavors中的类型添加资源

productFlavors {
    red {
        versionName "1.0-red"
        dimension "color"
        resValue("color", "flavor_color", "#ff0000")
    }
    green {
        applicationId "com.rustfisher.gradletest.green" // 使用另一个签名
        versionNameSuffix "-green"
        resValue("color", "flavor_color", "#00ff00")
        dimension "color"
    }
// ...
}

上面的flavor_color可以在代码中通过R文件找到R.color.flavor_color

参考:Gradle for Android Kevin Pelgrims

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Gradle 构建脚本

    Gradle提供了一种领域特定语言,目前同时支持 Groovy 和 Kotlin 。

    佛系编码
  • Gradle For Android(4)--构建不同的版本

    当构建App的时候,通常都会有不同的版本。比如说测试版本,正式版本,Debug版本等等。而这些版本通常有不同的配置,比如说服务器的域名,Log开关,付费开关等等...

    None_Ling
  • springBoot+gradle构建多模块项目

    提示:若先配置settings文件无法触发自动构建,请先执行下一步“修改根目录 build.gradle”,之后保存就会自动执行。

    WindCoder
  • Gradle构建多模块SpringBoot应用

    本文是一篇笔记,通过实战将Gradle构建多模块的步骤记录下来,为今后新建的项目准备一个脚手架,该脚手架由两个子模块组成:二方库、SpringBoot应用,本文...

    程序员欣宸
  • 读书笔记--Android Gradle权威指南(上)前言笔记

    请叫我大苏
  • Android 重构 | 统一管理 Gradle 依赖版本

    好代码,总是要经历多个阶段,从匆忙赶工上线,到慢慢细致打磨,折腾的过程,美好的结果。

    HLQ_Struggle
  • Gradle多项目构建与jar包发布

    通常在使用Maven构建项目的时候,我们会将一个项目划分为多个模块,然后通过父工程去管理子模块。而 Gradle 也拥有类似的功能,我们将其称之为多项目构建(m...

    端碗吹水
  • iOS APP版本构建版本无效

    GuangdongQi
  • 深入了解gradle和maven的区别

    gradle和maven都可以用来构建java程序,甚至在某些情况下,两者还可以互相转换,那么他们两个的共同点和不同点是什么?我们如何在项目中选择使用哪种技术呢...

    程序那些事
  • android studio更新gradle错误构建项目失败的解决方法

    对应版本,修改gradle version,和plusing version两个地方修改gradle version,和plusing version的方法有两...

    砸漏
  • 深入了解gradle和maven的区别

    gradle和maven都可以用来构建java程序,甚至在某些情况下,两者还可以互相转换,那么他们两个的共同点和不同点是什么?我们如何在项目中选择使用哪种技术呢...

    子润先生
  • 给Android初学者的Gradle知识普及

    Android Tools 主页 ,大概是2016年2月份发布 adt21.1 的时候,忽然在主页发现了New Build System 原来是可以用gradl...

    砸漏
  • Gradle和Maven性能对比

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明...

    乐百川
  • Gradle Vs Maven:Java项目构建工具如何选择?

    在Java项目的开发中,需要引入自动化构建工具来帮助我们管理项目的外部依赖包、项目编译、打包等工作。Gradle和Maven是Java世界中两个重要的自动化构建...

    IT大咖说
  • Maven和Gradle对比

    Java世界中主要有三大构建工具:Ant、Maven和Gradle。经过几年的发展,Ant几乎销声匿迹、Maven也日薄西山,而Gradle的发展则如日中天。笔...

    IT大咖说
  • 说实话,用完Gradle之后,有点嫌弃Maven了。贼好用!

    相信使用 Java 的同学都用过 Maven,这是一个非常经典好用的项目构建工具。但是如果你经常使用 Maven,可能会发现 Maven 有一些地方用的让人不太...

    用户6543014
  • 自从用完 Gradle 后,有点嫌弃 Maven 了!

    相信使用Java的同学都用过Maven,这是一个非常经典好用的项目构建工具。但是如果你经常使用Maven,可能会发现Maven有一些地方用的让人不太舒服:

    JAVA葵花宝典
  • 自从用完Gradle后,有点嫌弃Maven了!速度贼快!

    相信使用Java的同学都用过Maven,这是一个非常经典好用的项目构建工具。但是如果你经常使用Maven,可能会发现Maven有一些地方用的让人不太舒服:

    xcbeyond
  • Gradle从入门到了解 - 简书

    Gradle(英[g'reɪdl])是一个任务驱动型的构建工具,是一个依赖管理工具,更是一个编程框架。 它抛弃了基于XML的各种繁琐配置,取而代...

    用户2802329

扫码关注云+社区

领取腾讯云代金券