Gradle多样化构建

Posted wangziqiang123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gradle多样化构建相关的知识,希望对你有一定的参考价值。

概述

当我们在android studio新建android工程时,就会给我们生成默认的build.gradle文件,这个文件内容已经满足大多数情况,我们不需要添加新的东西.但是如果你需要在一次构建过程中打出差异化的包,那么就需要了解grale的多样化构建.

在gradle中variant是用来描述某一个构建包,每一个variant都有相对应的配置.在聊variant之前,我们得先了解构建类型和product flavor(我们常说的渠道)这两个概念.

构建类型

构建类型是用来配置同一个渠道不同类型的构建,也就是说每一个渠道都会对应几种不同构建类型的包.最主要的应用就是打正式包和测试包.因为正式包需要去掉debugable,log,换正式服等等.当然你还可以自己定义其他的构建类型来高度的差异化.这些差异化可以通过构建类型很方便的实现.

Product Flavor

product flavor就是我们常说的渠道,他还用来创建应用的不同版本.我们通常用这个打不同应用市场的包,以此来统计各个市场的下载量.

Variant

variant是一个二维的概念.每一个variant是由Product Flavor和构建类型组成.假设我们的构建类型有debug和release两种.Product Flavor有免费版(free)和付费版(pay)两种.那么就可以构建四种不同的包

  • freeDebug
  • freeRelease
  • payDebug
  • payRelease

配置Variant

对于每一个Variant我们都可以做一些相应的配置以此来实现差异化.我们可以配置BuildConfig的字段,resValue以及替换manifest里面的metaData.


    buildTypes {
        debug {
            buildConfigField "String", "type", ""debug""
            resValue "string" , "test" , "hello world debug"
        }
        release {
            buildConfigField "String", "type", ""release""
            minifyEnabled false
            signingConfig signingConfigs.config
            proguardFiles getDefaultProguardFile('proguard-android.txt'),                     'proguard-rules.pro'
        }
        other.initWith(android.buildTypes.debug)
        other {
        }
    }

我们还可以在product flavor中配置这些值.


    productFlavors {
        free {
            buildConfigField "String" , "type" , ""free""
            resValue "string" , "test" , "hello world free"
        }
        pay {
            buildConfigField "String" , "type" , ""pay""
        }
    }
如果构建类型和渠道中存在相同的字段,那么优先使用构建类型中的字段.在上面的例子中,如果你打debug包.
    
        BuildConfig.type = "debug";
        R.string.text = "hello world debug";
    

替换manifest中metadata的值

    
        <meta-data
         android:name="UMENG_APPKEY"
         android:value="${umeng_app_key}"/>

      buildTypes {
        debug {
         manifestPlaceholders = [umeng_app_key: "你替代的内容"]
        }
        release {
       manifestPlaceholders = [umeng_app_key: "你替代的内容"]
        }
        develop {
       manifestPlaceholders = [umeng_app_key: "你替代的内容"]
        }
    }
    

上述的定制只是轻量级的.如果我们要定制图片,布局等资源仅仅用上面的方法是办不到的.如果要做高度化的定制我们必须要引入一个新的概念–源集.

源集

源集即源代码的集合.每个Variant都会对应一个源集(需要手动创建).



-app
| -src
| | -freeDebug
| | | -java
| | | | -com.package
| | | | | -Constants.java
| | | -res
| | | | -layout
| | | | | -activity_main.xml
| | -freeRelease
| | | -java
| | | | -com.package
| | | | | -Constants.java
| | | -res
| | | | -layout
| | | | | -activity_main.xml
| | -payDebug
| | | -java
| | | | -com.package
| | | | | -Constants.java
| | | -res
| | | | -layout
| | | | | -activity_main.xml
| | -payRelease
| | | -java
| | | | -com.package
| | | | | -Constants.java
| | | -res
| | | | -layout
| | | | | -activity_main.xml
| | -main
| | | -java
| | | | -com.package
| | | | | -MainActivity


如上图所示,新建工程都会生成一个默认的源集目录main.如果你需要高度定制版本,就可以手动创建该版本的源集目录,然后开始定制你想要的java类或者资源文件.
注意:主源集目录和其他版本的源集目录不能有相同的类.如果你需要定制一个java类,需要从主源集目录去掉,并在其他源集目录各新建一个.

原文:大专栏  Gradle多样化构建


以上是关于Gradle多样化构建的主要内容,如果未能解决你的问题,请参考以下文章

如何添加jcenter仓库 gradle依赖

片段内部静态类和gradle问题

错误:这个片段内部类应该是静态的 [ValidFragment]

Gradle 引入本地定制 jar 包

用于 kotlin 代码的 gradle 构建

c#代码片段快速构建代码