【进阶开发】gradle 如此多娇(多图慎入)

本文主要是讲解gradle的一丢丢优化

1、如此多的build.gradle文件

开发过程中,会经常与 gradle 的配置文件 build.gradle 打交道,如果 android studio 开启的是 android 视图,所有 build.gradle 都在 Gradle Scripts 中,要区分哪个 build.gradle 是哪个模块的,经常需要看该文件后面显示的路径或者模块名,而这些往往比较长,不太好区分。
image

最简单的当然是直接将build.gradle 改个名字就行了。很多人肯定自己尝试过,但发现改了名字之后,就发现根本不会生效,实际上,引入的文件是通过 settings.gradle 配置的。我们只需要在 settings.gradle 中配置指定模块的 buildFileName 即可,如:

同时,我们还可以修改根项目的 buildFileName

2、如此多的项目

当我们有多个 cocos 打包的 android 项目时,他们的目录都在 proj.android-studio 目录,而 gradle 默认是以目录名为项目名的,因此 gradle 项目在 android studio 中的名字也是这个名字。这就导致 android studio 的同名项目显示的是项目的绝对路径,而长长的项目路径绝对是不利于查找的

我们只需要在 settings.gradle 中修改项目的 name 即可

在project list中显示的项目名

3、如此多的包

有过多渠道包经历的人,肯定对维护几个项目 深恶痛绝,而维护一个项目的话,又有可能因为漏修改某段代码而导致逻辑的错误(非程序错误,因此打包没有任何影响)。androidgradle 插件非常贴心的帮我们解决了这个问题,就是productFlavors 功能。

3.1、多个包

我们只需要下面简单的配置,就可以添加oppo和vivo的包

android {
    //...省略其他配置
    flavorDimensions "default"
    productFlavors {
        oppo {

        }
        vivo {

        }
    }
}

生成的多平台的包

3.2、不同配置

既然涉及到多个包,那肯定也会碰到不同包的不同配置,这些也能轻松解决。

如果我们使用 xxx.gradle.kts 配置的话(xxx.gradle 使用的是 Groovy 实现的dsl,而 xxx.gradle.kts 使用的是 Kotlin 实现的dsl),android studio 会“贴心”的帮我们显示配置的类型:

image

image

通过上图我们可以发现,defaultConfig 配置的类型是 DefaultConfig,而 productFlavors 配置的类型是 ProductFlavor。阅读源码,我们可以发现,他俩都继承自 BaseFlavor

image

所以 defaultConfig 的配置,我们在 productFlavors 中都可以配置,比如包名。

注意:

我目前只使用了 包名BuildConfigresValueManifest占位符,其他配置是否生效未验证,但理论上应该问题不大,且通常我们要配置的也大多是以上几种。

3.3、不同参数

上一个章节末尾,我提到了我使用的 BuildConfigresValueManifest占位符,他们可以非常方便的配置不同的参数。

3.3.1、BuildConfig

BuildConfig里包括了默认的一些字段,以及你配置的常量

/**
 * Automatically generated file. DO NOT MODIFY
 */
package your._package.name;

public final class BuildConfig {
  public static final boolean DEBUG = false;
  public static final String APPLICATION_ID = "这里是你配置的包名";
  public static final String BUILD_TYPE = "release";
  public static final String FLAVOR = "oppo";
  public static final int VERSION_CODE = 2;
  public static final String VERSION_NAME = "0.0.2";

  // 下面是你配置的常量
  // Field from product flavor: oppo
  public static final String APP_ID = "xxxxxx";
  // Field from product flavor: oppo
  public static final boolean FLAG = true;
  // Field from product flavor: oppo
  public static final int num = 11111;
}

上面展示的是一个BuildConfig的示例。

接下来,我们看看他是怎么配置的:

android {
    //...省略其他配置
    flavorDimensions "default"
    productFlavors {
        oppo {
            buildConfigField "String", "APP_ID", "\"xxxxxx\""
            buildConfigField "int", "num", "11111"
            buildConfigField "boolean", "FLAG", "true"
        }
    }
}

上面的配置,实际上是调用 buildConfigField 方法来配置,因为 Groovy 语法,可以省略括号,实际上相当于 buildConfigField("String", "APP_ID", "\"xxxxxx\"")

  1. 第一个参数是变量类型,比如 Stringint, boolean 等,相信熟悉 java 的同学,很容易知道还有哪些类型。
  2. 第二个参数是变量名,只要是 java 合法的标识符,都可以
  3. 第三个参数是变量具体的值,根据类型来配置

注意:

细心的同学可能已经发现,上面的字符串配置加了引号,这是因为插件不会根据我们设置的类型来帮我们转换配置的值,因此这里需要加上引号,表示这是一个字符串,否则生成的变量就是:

    public static final String APP_ID = xxxxxx;// 这里会因为缺少引号,而编译失败

3.3.2 resValue

就是values中的配置

android {
    //...省略其他配置
    flavorDimensions "default"
    productFlavors {
        oppo {
            resValue "string", "appName", "应用名"
        }
    }
}

与上一个章节 BuildConfig 一样,这里相当于 resValue("string", "appName", "应用名")

  1. 第一个参数是value的类型,比如 stringcolor 等,熟悉 android 的同学,很容易知道还有哪些类型。
  2. 第二个参数是value的变量名,只要values目录下能配置的,这里都可以
  3. 第三个参数是value具体的值

这个配置相当于
image

在java代码中也能轻松使用(这里可能需要build一下,确保 R.java 文件更新和 gradleResValues.xml生成了)

image

注意:

resValue的配置不能与values目录中的配置重复,否则会出现 Error: Duplicate resources 错误

3.3.3 Manifest占位符

就是AndroidManifest.xml中的占位符,使用${xxx} 来占位

android {
    //...省略其他配置
    flavorDimensions "default"
    productFlavors {
        oppo {
            manifestPlaceholders = [
                    "xxx": "xxxxx"
            ]
        }
    }
}

与json的object通过 {:}来配置不同, Groovy 中,[:]相当于map。这里是配置多个属性。

使用方法如下图所示

39赞

很好先mark住

牛呀,很赞的帖子

mark了,很赞

mark mark 就很nice

我们早就是这样干了 之前发帖问过官方能不能说明一下 安卓工程结构 结果石沉大海 后面自己动手丰衣足食

mark,

mark!

想问一下,多渠道包那些,那些依赖的库怎么区分配置,譬如我vivo的是用了这些jar,aar。oppo的是用其它的

productFlavors下面的渠道名+Compile 比如渠道vivo 你就用vivoCompile

有没有完整的android构建流程教程推荐的

我也是用到哪,就学到哪

mark mark mark

mark下,值得一试。

mark , 最近准备弄安卓渠道包

简单易懂,非常好

nice

mark.

战略性mark