Android Gradle(一)Gradle的Android插件入门

新建一个Android项目,默认使用Gradle进行构建,相信大家或多或少都听过Gradle,Gralde也是现在项目构建的主流工具。看到项目中杂乱gradle配置,你是否手足无措,莫慌,本文将带你了解Android中Gradle插件。

1.什么是Gradle的Android插件

Gradle有很多插件,为了支持Android项目的构建,谷歌为Gradle编写了Android插件,新的Android构建系统就是由Gradle的Android插件组成的,Gradle是一个高级构建工具包,它管理依赖项并允许开发者自定义构建逻辑。Android Studio使用Gradle wrapper来集成Gradle的Android插件。需要注意的是,Gradle的Android插件也可以独立于AndroidStudio运行。

在 Android的官方网站提到了新的Android构建系统主要有以下几个特点:

  • 代码和资源易于重用
  • 无论是针对多个apk发行版还是针对不同风格的应用程序,都可以很容易创建应用程序的多个不同版本。
  • 易于配置、扩展和自定义构建过程
  • 良好的IDE集成

Gradle的Android插件结合Android Studio成为了目前最为流行的Android构建系统。

2.Android Studio的模块类型

Android Studio中的每个项目包含一个或多个含有源代码文件和资源文件的模块,这些模块可以独立构建、测试或调试,一个Android Studio的模块类型可以有以下几种:

2.1 Android应用程序模块

Android应用程序模块可能依赖于库模块,尽管许多Android应用程序只包含一个应用程序模块,构建系统会将其生成一个APK。
模块的build.gradle包含:

1
apply plugin: 'com.android.application'

2.2 Android 库模块

Android库模块包含可重用的特定于Android的代码和资源,构建系统会将其生成一个AAR。
模块的build.gradle包含:

1
apply plugin: 'com.android.library'

2.3 Java库模块

包含可重用的代码,构建系统会将其生成一个JAR包。
模块的build.gradle包含:

1
apply plugin: 'com.android.library'

3. 一个Android项目视图

所有构建文件在Gradle Scripts层级下显示,大概介绍下这些文件的用处。
  • 项目build.gradle:配置项目的整体属性,比如指定使用的代码仓库、依赖的Gradle插件版本等等。
  • 模块build.gradle:配置当前Module的编译参数。
  • gradle-wrapper.properites:配置Gradle Wrapper。
  • gradle.properties:配置Gradle的编译参数。具体配置见Gradle官方文档
  • settings.gradle:配置Gradle的多项目管理。
  • local.properties:一般用来存放该Android项目的私有属性配置,比如Android项目的SDK路径。

接下来将简单介绍它们,先讲简单的,重点讲项目build.gradle和模块build.gradle。

3.1 local.properties

通常用于SDK路径、NDK路径等Android项目的私有属性配置,比如:local.properties

1
2
ndk.dir=/Users/username/Downloads/android-ndk-r19c
sdk.dir=/Users/username/Downloads/sdk

3.2 settings.gradle

配置Gradle的多项目管理,一个项目中所有的module都include在这里。比如:settings.gradle

1
2
3
4
include ':LibJavaLibrary'
include ':LibAndroidLibrary'
include ':app'
rootProject.name = "GradleTestDemo"

3.3 gradle.properties

配置Gradle的编译参数。具体配置见Gradle官方文档
比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Specifies the JVM arguments used for the daemon process.
# 设置gradle守护进程的JVM参数,内存和编码格式
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app"s APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
# 是否使用AndroidX
android.useAndroidX=true
# Automatically convert third-party
libraries to use AndroidX
# 三方库是否使用AndroidX
android.enableJetifier=true
# Kotlin code style for this project: "official" or "obsolete"
# 设置kotlin代码样式为“official”
kotlin.code.style=official

3.4 gradle.properties

配置Gradle Wrapper,主要是为了标准化项目。只要项目配置了gradle wrapper,就可以指定gradle版本等信息。关于Gradle Wrapper可以看这篇文章:
Gradle核心思想(四)看似无用,实则重要的Gradle Wrapper
比如:

1
2
3
4
5
6
7
8
9
10
11
# Sat Jun 19 21:24:56 CST 2021
# Gradle解包后存储的主目录
distributionBase=GRADLE_USER_HOME
# distributionBase指定目录的子目录。distributionBase+distributionPath就是Gradle解包后的存放位置
distributionPath=wrapper/dists
# Gradle压缩包存储主目录
zipStoreBase=GRADLE_USER_HOME
# zipStoreBase指定目录的子目录。zipStoreBase+zipStorePath就是Gradle压缩包的存放位置。
zipStorePath=wrapper/dists
# gradle下载的url地址,如果不能翻墙可以使用国内镜像,或者将gradle放在自己的服务器上
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip

3.5 项目build.gradle

项目build.gradle指的是根目录下的build.gradle文件。它的作用主要有以下几点:

  • 统一管理项目的版本号,比如库的版本号、SDK版本号等

  • 配置classpath的仓库地址,classpth一般是build.gradle脚本需要使用的资源,比如Gradle插件,必须添加如下配置:

    1
    classpath "com.android.tools.build:gradle:4.1.3"
  • 配置module中依赖的仓库地址,通过allprojects的repositories {}配置

一个新建的Android项目,项目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
26
27
28
29
30
// Top-level build file where you can add configuration options common to all sub-projects/modules.
// 顶级构建文件,您可以在其中添加所有子项目/模块通用的配置选项。
buildscript {
ext.kotlin_version = "1.3.72"
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:4.1.3"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
//注意:不要将您的应用程序依赖项放在这里;它们属于单个模块 build.gradle 文件
// 意思就是应用程序的dependencies应该在对应module下的build.gradle中配置
}
}

//各module中依赖的仓库
allprojects {
repositories {
google()
jcenter()
}
}

task clean(type: Delete) {
delete rootProject.buildDir
}

通常项目build.gradle文件还有如下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//统一管理库版本号、SDK版本号等,在module中的build.gradle中可以通过rootProject.compileSdkVersion使用
ext {
compileSdkVersion = 29
buildToolsVersion = "28.0.3"
minSdkVersion = 18
targetSdkVersion = 28

AppVersionCode = 595000
AppVersionName = "5.95.0"
LogicVersionCode = 595000
LogicVersionName = "5.95.0"

frescoVersion = "1.9.0"
}

3.6 模块build.gradle

一个新Android项目的app模块的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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
plugins {
//应用程序插件,表示当前module是应用程序模块,编译生成APK
id 'com.android.application'
//kotlin插件
id 'kotlin-android'
}

//用于描述该Module构建过程中所用到的所有参数
android {
compileSdkVersion rootProject.compileSdkVersion
buildToolsVersion rootProject.buildToolsVersion

defaultConfig {
applicationId "com.hh.gradletestdemo"
minSdkVersion 17
targetSdkVersion 30
versionCode 1
versionName "1.0"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}

dependencies {

implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.5.0'
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'com.google.android.material:material:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}

模块中比较重要的几项配置:
1.Gradle的Android插件类型
apply引入的插件id为com.android.application,说明当前模块是一个应用程序模块,Gradle的Android插件有多个类型分别为:

  • 应用程序插件,插件id为com.android.application,会生成一个APK。
  • 库插件,插件id为com.android.library,会生成一个AAR,提供给其他应用程序模块用。
  • java插件,插件id为java-library,会生成Jar包,提供给其他应用程序模块用。
-------------本文结束感谢您的阅读-------------
如果本篇文章对你有帮助,请作者喝杯咖啡吧~