Android开发之gradle入门与小技巧
所属分类:Android | 发布于 2023-12-16 15:10:14
1、Gradle是什么
Gradle是新一代的自动化构建工具,一个基于JVM的构建工具,它是一个独立的项目,跟Android、Android Studio无关。
构建工具就是对你的项目进行编译、运行、签名、打包、依赖管理等一系列功能集合。
构建工具还有Maven和Ant,这类都是基于xml来进行描述的。而Gradle采用了一种叫Groovy的语言,语法跟Java语法类似,而且在Java基础上做了不少改进,用起来更加简洁、灵活。
Gradle的推出主要以Java应用为主,当然目前还支持Android、C、C++。
2、AGP(Android Gradle Plugin)
Gradle跟Android Studio其实没什么关系,但是Gradle官方还是很看重Android开发的,Google推出Android Studio的时候选中了Gradle作为构建工具,为了支持Gradle能在Android Studio上使用,Google做了个Android Studio的插件叫Android Gradle Plugin(AGP),这就是我们能在Android Studio上使用Gradle的原因。
在项目的Project Structure中可以看到Gradle版本和Android Gradle Plugin版本
3、相关文档
1、Gradle用户手册:https://docs.gradle.org/current/userguide/userguide.html
2、Kotlin DSL Primer:https://docs.gradle.org/current/userguide/kotlin_dsl.html
3、Android Gradle Plugin:https://developer.android.com/studio/build/extend-agp
4、Groovy迁移到KTS(讲述语法差异):https://developer.android.com/studio/build/migrate-to-kts
4、gradle配置文件
├── app
│ ├── build.gradle.kts // 模块gradle配置文件
│ ├── proguard-rules.pro
│ └── src
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── build.gradle.kts // 项目gradle配置文件
├── gradle.properties
├── gradlew
├── gradlew.bat
├── local.properties
└── settings.gradle.kts
4.1、根目录下的build.gradle.kts是Top-level配置选项,项目下所有的子项目和模块通用。
4.2、每一个Module或Library下面都必须有自己的build.gradle.kts,这个是针对模块或Library的配置。
4.3、项目build.gradle.kts基本结构
plugins {
id("com.android.application") version "8.1.3" apply false
id("com.android.library") version "7.4.1" apply false
id("org.jetbrains.kotlin.android") version "1.8.10" apply false
}
4.4、模块build.gradle.kts基本结构
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
}
android {
namespace = "com.wenge365.wengewrold"
compileSdk = 34
defaultConfig {
applicationId = "com.wenge365.wengewrold"
minSdk = 24
targetSdk = 33
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
useSupportLibrary = true
}
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
buildFeatures {
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = "1.4.3"
}
packaging {
resources {
excludes += "/META-INF/{AL2.0,LGPL2.1}"
}
}
}
dependencies {
implementation("androidx.core:core-ktx:1.9.0")
// 其它依赖项...
}
5、gradle配置知识点
5.1、插件plugins{} 闭包
在使用Gradle版本目录时应用插件
// Top-level build.gradle.kts file
plugins {
alias(libs.plugins.android.application) apply false
...
}
// Module-level build.gradle.kts file
plugins {
alias(libs.plugins.android.application)
...
}
在不使用Gradle版本目录时应用插件
// Top-level build.gradle.kts file
plugins {
id("com.android.application") version '7.3.0' apply false
...
}
// Module-level build.gradle.kts file
plugins {
id("com.android.application")
...
}
配置插件扩展信息
// build.gradle.kts
plugins {
jacoco
}
jacoco {
toolVersion = "0.8.1"
}
5.2、构建类型buildTypes{ } 闭包
在Kotlin DSL中,调试debug和发布release类型是隐式提供的。所有其他自定义build类型都必须手动创建。如下,创建benchmark类型
buildTypes {
debug {
...
}
release {
...
}
register("benchmark") {
...
}
}
5.3、风味productFlavors{ }闭包
profuctFlavor翻译过来是风味,是指针对不同场景进行不同配置,每一种场景都有自己的风味。
国外常用的配置场景是一个app分为free免费版和收费paid收费版本,国内一般用来做多渠道打包配置。
可以同时定义多个维度多个场景,下面就是根本支持api的最小版本和功能特点两个维度定义的风味。
android {
...
// Specifies the flavor dimensions you want to use. The order in which you
// list each dimension determines its priority, from highest to lowest,
// when Gradle merges variant sources and configurations. You must assign
// each product flavor you configure to one of the flavor dimensions.
flavorDimensions 'api', 'version'
productFlavors {
demo {
// Assigns this product flavor to the 'version' flavor dimension.
dimension 'version'
...
}
full {
dimension 'version'
...
}
minApi24 {
// Assigns this flavor to the 'api' dimension.
dimension 'api'
minSdkVersion '24'
versionNameSuffix "-minApi24"
...
}
minApi21 {
dimension "api"
minSdkVersion '21'
versionNameSuffix "-minApi21"
...
}
}
}
6、gradle配置实战
6.1、根据构建类型自定义App名称,接口地址
构建类型可以理解为开发环境,默认的有release和debug两种,上面讲到了,debug模式是隐式的。
android {
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
buildConfigField("String", "API_URL", "\"https://api.wg.com/api\"")
manifestPlaceholders["appLabel"] = "@string/appLabel"
}
debug {
applicationIdSuffix = ".debug"
versionNameSuffix = "-debug"
buildConfigField("String", "API_URL", "\"https://apitest.wg.com/api\"")
manifestPlaceholders["appLabel"] = "@string/appDevLabel"
}
}
buildFeatures {
compose = true
buildConfig = true
}
}
a、debug的applicationIdSuffix增加.debug后缀
b、debug的versionNameSuffix增加-debug后缀
c、使用buildConfigField方法增加API_URL的定义,在App内使用BuildConfig.API_URL调用,注意:要在buildFeatures里面设置buildConfig值为true
d、给manifestPlaceholders增加appLabel字段,因为项目是多语言的,所以值是@string。
d1. 在strings.xml中增加appLabel和appDevLabel,此处可做多语言。
<string name="appLabel">WengeWorld</string>
<string name="appDevLabel">WengeWorldDev</string>
d2. 更改AndroidManifest.xml中application节点的android:label属性的值。
更改前:android:label="@string/app_name"
更改后:android:label="@string/appLabel"