Gradle 配置文件

自定义 Gradle 配置文件

方式一:

为了便于主 Model 和副 Model 的 build.gradle 之间的管理,比如版本管理和统一性。所以,可以在主 project 下面自定义一个 Gradle 配置文件来管理。

config.gradle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ext{
// Android 配置
android = [
compileSdkVersion : 30,
buildToolsVersion : "30.0.2",
applicationId : "com.example.meet",
minSdkVersion : 21,
targetSdkVersion : 30,
versionCode : 1,
versionName : "1.0"
]

// 依赖配置
dependencies = [
"appcompat" : 'androidx.appcompat:appcompat:1.2.0'
...
]
}

在主 project 下的 build.gradle 内引入自定义 Gradle 配置文件。

build.gradle
1
2
3
4
5
6
7
8
9
10
// Top-level build file where you can add configuration options common to all sub-projects/modules.

// 引入自定义 Gradle 配置文件
apply from : "config.gradle"

buildscript {
...
}

...

然后在相应 Model 下进行修改。

build.gradle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

android {
compileSdkVersion rootProject.ext.android["compileSdkVersion"]
buildToolsVersion rootProject.ext.android["buildToolsVersion"]

defaultConfig {
applicationId rootProject.ext.android["applicationId"]
minSdkVersion rootProject.ext.android["minSdkVersion"]
targetSdkVersion rootProject.ext.android["targetSdkVersion"]
versionCode rootProject.ext.android["versionCode"]
versionName rootProject.ext.android["versionName"]

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

...
}

dependencies {
...
implementation rootProject.ext.dependencies["appcompat"]
}

方式二:

主 project 下创建文件 dependencies.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

android {
compileSdkVersion compile_sdk_version
buildToolsVersion build_tools_version

defaultConfig {
minSdkVersion min_sdk_verion
targetSdkVersion target_sdk_version
versionCode lib_version_code
versionName lib_version_name

...
}

...

compileOptions {
sourceCompatibility = 1.8
targetCompatibility = 1.8
}
//使用jetPack的组件,会要求jdk 1.8最好,有的时候会遇到报错,需要配置如下,避免target jvm 1.8的那个报错
kotlinOptions {
jvmTarget = "1.8"
}
}

dependencies {
//...
}

在主 project 下的 build.gradle:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
buildscript {

ext {
kotlin_version = '1.4.10'
compile_sdk_version = 29
build_tools_version = '29.0.3'
min_sdk_verion = 21
target_sdk_version = 29
lib_version_code = 1
lib_version_name = "1.0.0"

...
}
...
}

...

在相应的 module 中去引用 dependencies.gradle:

1
apply from: '../dependencies.gradle'

配置 Gradle 常量

在 BuildConfig 类中存在一些静态常量。(如果 BuildConfig 类不存在,可选择 Build -> Make Module ‘app’。)

1
2
3
4
5
6
7
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.example.meet";
public static final String BUILD_TYPE = "debug";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.0";
}

修改 build.gradle 文件,添加需要的常量。

build.gradle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
...

android {
...

buildTypes {
debug{
// 自定义 Gradle 常量
buildConfigField("boolean", "LOG_DEBUG", "true")
buildConfigField("String", "LOG_TAG", "\"Meet\"")
buildConfigField("String", "SP_NAME", "\"Config\"")
}
release {
buildConfigField("boolean", "LOG_DEBUG", "false")
buildConfigField("String", "LOG_TAG", "\"Meet\"")
buildConfigField("String", "SP_NAME", "\"Config\"")

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

...

修改后的结果。

1
2
3
4
5
6
7
8
9
10
11
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.example.meet";
public static final String BUILD_TYPE = "debug";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.0";
// Fields from build type: debug
public static final boolean LOG_DEBUG = true;
public static final String LOG_TAG = "Meet";
public static final String SP_NAME = "Config";
}

根据情况来使用。

1
2
3
4
5
6
7
8
9
10
11
12
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

if (BuildConfig.LOG_DEBUG){
// debug
}else {
// release
}
}
}

提升 Gradle 构建速度的一些技巧

1、使用最新版的 Gradle 插件。

可以通过主 Project 下 gradle -> wrapper -> gradle-wrapper.properties -> distributionUrl = … 查看 。

2、避免激活旧的 Multidex。

3、禁止 Multidex Apk 构建。

Gradle 构建的三个性能指标:

  • 全量编译:全部编译。比如第一次打开项目时(Open Project)。
  • 代码增量编译:修改了 Java/Kotlin 下面的代码的时候编译。
  • 资源增量编译:修改了 res 下面的资源文件的时候编译。

可通过如下方式,来提升构建速度。

Preferences -> Build -> Compiler -> Command -line Options: 添加 -PdevBuild。(注意:发布的时候,要将这个参数去掉。

build.gradle
1
2
3
4
5
6
7
8
9
android {
// 有这个属性,说明是调试。
// 通过 api 和像素密度来构建不同的应用,以达到体积降低的效果。
if (rootProject.hasProperty('devBuild')){
splits.abi.enable = false
splits.density.enable = false
}
...
}

4、最小化打包资源文件。

注意:发布的时候,要将它去掉。

build.gradle
1
2
3
4
5
6
7
8
9
10
android {
...
defaultConfig {
...

// 调试的时候用
resConfigs("zh","xxhdpi") // 编译时,只编译这两个,而不会打包 res 下所有资源。
}
...
}

5、禁用 PNG 压缩。

在开发阶段可以不需要此功能,来提高构建速度。

build.gradle
1
2
3
4
5
6
7
8
9
android {
// 有这个属性,说明是调试。
// 通过 api 和像素密度来构建不同的应用,以达到体积降低的效果。
if (rootProject.hasProperty('devBuild')){
splits.abi.enable = false
splits.density.enable = false
// 禁用 PNG 压缩
aaptOptions.cruncherEnabled = false
}

6、PNG 转换 WebP。

图片上右键 -> Convert to WebP。(launcher 无法转换)

7、推荐使用 Instant Run。

8、不使用动态版本标识。

build.gradle
1
2
3
4
5
dependencies {
// 也就是这个加号。
// Gradle 每 24小时会检查一次依赖库的更新,当依赖的库很多时,自然会对性能产生一定的影响。
implementation 'androidx.constraintlayout:constraintlayout:2.0.4+'
}

9、Gradle 内存分配调优。

gradle.properties
1
2
3
# 这里默认分配了 2048兆(2G)。
# 通过调整这个数值来AS内存优化。
org.gradle.jvmargs=-Xmx2048m

10、开启 Gradle 构建缓存。

gradle.properties
1
2
# 开启 Gradle 构建缓存
org.gradle.caching=true

备注

参考资料: