本文主要是讲解gradle的一丢丢优化
1、如此多的build.gradle文件
开发过程中,会经常与 gradle
的配置文件 build.gradle
打交道,如果 android studio
开启的是 android
视图,所有 build.gradle
都在 Gradle Scripts
中,要区分哪个 build.gradle
是哪个模块的,经常需要看该文件后面显示的路径或者模块名,而这些往往比较长,不太好区分。
最简单的当然是直接将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、如此多的包
有过多渠道包经历的人,肯定对维护几个项目 深恶痛绝,而维护一个项目的话,又有可能因为漏修改某段代码而导致逻辑的错误(非程序错误,因此打包没有任何影响)。android
的 gradle
插件非常贴心的帮我们解决了这个问题,就是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
会“贴心”的帮我们显示配置的类型:
通过上图我们可以发现,defaultConfig
配置的类型是 DefaultConfig
,而 productFlavors
配置的类型是 ProductFlavor
。阅读源码,我们可以发现,他俩都继承自 BaseFlavor
所以 defaultConfig
的配置,我们在 productFlavors
中都可以配置,比如包名。
注意:
我目前只使用了 包名、BuildConfig、resValue 和 Manifest占位符,其他配置是否生效未验证,但理论上应该问题不大,且通常我们要配置的也大多是以上几种。
3.3、不同参数
上一个章节末尾,我提到了我使用的 BuildConfig
、resValue
和Manifest占位符
,他们可以非常方便的配置不同的参数。
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\"")
- 第一个参数是变量类型,比如
String
,int
,boolean
等,相信熟悉java
的同学,很容易知道还有哪些类型。 - 第二个参数是变量名,只要是
java
合法的标识符,都可以 - 第三个参数是变量具体的值,根据类型来配置
注意:
细心的同学可能已经发现,上面的字符串配置加了引号,这是因为插件不会根据我们设置的类型来帮我们转换配置的值,因此这里需要加上引号,表示这是一个字符串,否则生成的变量就是:
public static final String APP_ID = xxxxxx;// 这里会因为缺少引号,而编译失败
3.3.2 resValue
就是values中的配置
android {
//...省略其他配置
flavorDimensions "default"
productFlavors {
oppo {
resValue "string", "appName", "应用名"
}
}
}
与上一个章节 BuildConfig
一样,这里相当于 resValue("string", "appName", "应用名")
- 第一个参数是value的类型,比如
string
,color
等,熟悉android
的同学,很容易知道还有哪些类型。 - 第二个参数是value的变量名,只要values目录下能配置的,这里都可以
- 第三个参数是value具体的值
这个配置相当于
在java代码中也能轻松使用(这里可能需要build一下,确保 R.java
文件更新和 gradleResValues.xml
生成了)
注意:
resValue的配置不能与values目录中的配置重复,否则会出现 Error: Duplicate resources 错误
3.3.3 Manifest占位符
就是AndroidManifest.xml中的占位符,使用${xxx}
来占位
android {
//...省略其他配置
flavorDimensions "default"
productFlavors {
oppo {
manifestPlaceholders = [
"xxx": "xxxxx"
]
}
}
}
与json的object通过 {:}
来配置不同, Groovy
中,[:]
相当于map。这里是配置多个属性。
使用方法如下图所示