[TOC]
Android Studio的build.gradle文件常用配置项
目录
Android Studio的build.gradle文件常用配置项
1.build.gradle用途和功能
2.常用配置
3.其他
build.gradle简介
build.gradle 文件是 Android 开发中的核心组件之一,它不仅决定了应用程序是如何构建的,还影响着项目的组织方式、依赖管理以及与其他工具和服务的交互。正确配置 build.gradle 文件对于确保项目的顺利开发、测试和发布至关重要。
1.build.gradle用途和功能
以下是 build.gradle 文件的主要用途和功能:
-
定义构建脚本
构建逻辑:指定如何编译源代码、处理资源文件、生成 APK 或 AAB 等。
任务定义:定义自定义任务或覆盖默认任务,以实现特定的构建步骤。 -
管理依赖关系
库依赖:声明项目所需的第三方库或模块依赖,如支持库、测试库等。
插件应用:应用必要的 Gradle 插件(例如 com.android.application 或 com.android.library),以便为 Android 项目提供特定的功能。 -
配置构建参数
全局配置:设置适用于整个项目的属性,如编译 SDK 版本 (compileSdkVersion)、目标 SDK (targetSdk)、最低 SDK (minSdk) 等。
模块配置:每个模块(如应用模块或库模块)都有自己的 build.gradle 文件,用于指定该模块特有的构建配置。 -
多环境支持
构建类型:定义不同的构建类型(如 debug 和 release),并为每种类型指定特定的设置,如签名配置、混淆规则等。
产品风味 (Product Flavors):允许创建不同版本的应用程序,例如免费版和付费版,每个风味可以有不同的配置、资源或代码。 -
集成开发工具
与 Android Studio 集成:build.gradle 文件被 Android Studio 使用来同步项目结构、下载依赖项、配置模拟器等。
持续集成/持续部署 (CI/CD):在 CI/CD 管道中执行构建任务,确保代码更改经过自动化测试和质量检查后能够顺利部署。 -
其他高级特性
代码混淆:通过 ProGuard 或 R8 规则进行代码混淆和优化。
动态替换:使用 manifestPlaceholders 动态修改 AndroidManifest.xml 中的值。
扩展功能:添加额外的构建逻辑,如增量构建、性能优化等。 -
文件层次
通常,一个 Android 项目会有两个级别的 build.gradle 文件:
项目级 build.gradle:位于项目的根目录下,主要用于定义所有模块共用的插件和依赖项。
模块级 build.gradle:位于每个模块的目录下,包含该模块特有的构建配置和依赖项。
2.常用配置
plugins {
id 'com.android.application' //application依赖插件
//id 'com.android.library' //library 依赖插件
id 'org.jetbrains.kotlin.android'//JetBrains 插件
id 'kotlin-android' //Android Kotlin 支持插件
id 'maven-publish' //Maven 仓库插件
id 'kotlin-kapt' //Kotlin 注解处理插件
}
//上面的写法 老版本写法为
apply plugin: 'com.android.application'
apply plugin: 'com.android.library'
....
android {
compileSdk 30 //编译时使用的 Android SDK 版本
buildToolsVersion '30.0.3' //Build Tools 包含了诸如 aapt 、dx 或 d8 (Dex 编译器) 等工具版本
namespace 'com.example.xxx' //命名空间,影响生成的 R 类、BuildConfig 类
defaultConfig {
applicationId "com.example.xxx" //应用程序的唯一标识符,生产apk后覆盖manifest里面package
minSdk 24 //应用程序支持的最低 API 级别
targetSdk 34 //针对哪个 API 级别进行了测试和优化
versionCode 1 // 用程序的版本, 应用商店用它来判断是否应该向用户推送更新
versionName "1.0" // 版本名称(给用户展示)
flavorDimensions "DEVICE" // 多渠道的时候可以进行配置,也可以配置多个逗号隔开,对应productFlavors.xxx.dimension
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" //使用 AndroidJUnitRunner 进行单元测试
//externalNativeBuild 设置与外部原生构建系统(如 CMake 或 ndk-build)集成的方式,使得 Gradle 能够编译 C/C++ 代码。
externalNativeBuild {
cmake {
cppFlags '' //没有特殊的编译器标志被添加
arguments "-DANDROID_STL=c++_shared" //CMake 使用共享的标准模板库(STL),c++_static表示静态链接
}
ndk { //配置限制了生成的原生库所支持的 ABI
//指定针对 arm64-v8a架构的原生库,果你需要可添加ABI过滤器,例如'armeabi-v7a'、'x86' 或 'x86_64'
abiFilters 'arm64-v8a'
}
}
//manifest占位符,例如BUGLY_APPID在manifest使用${BUGLY_APPID} ; 也可以在buildTypes中分release和debug设置
manifestPlaceholders = [
"BUGLY_APPID" : "xxx",
"BUGLY_APP_VERSION": "${versionName}",
"BUGLY_APP_CHANNEL": "algorithms",
]
}
resourcePrefix 'set_' //资源命名前缀,只能限定Xml资源,并不能限定图片资源,例如<string name="set_start">开始</string>
resConfigs "zh-rCN", "en" // 只打包指定的语言包进apk
signingConfigs {
release {
keyAlias = 'xxx' //keystore 中使用的别名
storeFile file('platform.keystore') //指向包含私钥的 keystore 文件的位置,相对路径
storePassword 'xxx' //keystore密码
keyPassword 'xxx' //私钥的密码
}
debug {
keyAlias = 'xxx'
storeFile file('platform.keystore')
storePassword 'xxx'
keyPassword 'xxx'
}
}
buildTypes {
release {
buildConfigField('boolean', 'LOG_ENABLE', 'false')// 日志打印开关
buildConfigField('String', 'HOST_URL', '"https://release.host.com"')// 测试服务器的主机地址
signingConfig signingConfigs.release //指定此构建类型应使用 release 签名配置进行签名
minifyEnabled false //控制是否启用代码混淆
//指定 ProGuard 或 R8 使用的规则文件
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
manifestPlaceholders = [
"BUGLY_APPID" : "xxx",
"BUGLY_APP_VERSION": "${versionName}",
"BUGLY_APP_CHANNEL": "algorithms",
]
}
debug {
// 日志打印开关 定义了一个:BuildConfig.LOG_ENABLE 字段,可供Java代码调用
buildConfigField('boolean', 'LOG_ENABLE', 'true')
// 测试服务器的主机地址 定义了一个:BuildConfig.HOST_URL 字段,可供Java代码调用
buildConfigField('String', 'HOST_URL', '"https://debug.host.com"')
testCoverageEnabled true //启用代码覆盖率报告,这对于调试和测试非常有用
signingConfig signingConfigs.debug
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
applicationIdSuffix ".debug" // 为applicationId添加后缀 如:com.aegis.module_search.debug
versionNameSuffix '_debug' // 在版本号后面添加后缀 如:1.0.0_debug
manifestPlaceholders = [
"BUGLY_APPID" : "xxx",
"BUGLY_APP_VERSION": "${versionName}",
"BUGLY_APP_CHANNEL": "algorithms",
]
}
}
packagingOptions {
//pickFirst 这种编译冲突的时候回报错提示, 按提示添加即可
pickFirst '**/*.so' // 当so出现重复时,打包自动选择第一个
pickFirsts = ['META-INFO/LICENSE'] // 当 LICENSE 出现重复时,打包自动选择第一个
merge 'META-INFO/LICENSE' // 合并打包,会自动忽略 pickFirst 配置
//exclude 'META-INF/DEPENDENCIES.txt' // 排除指定文件
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_17 //指定了源代码兼容性级别为 Java 17 (新的关键字、API 等,影响代码编写)
targetCompatibility JavaVersion.VERSION_17 //指定了目标兼容性级别为 Java 17 (编译器将生成何种字节码版本)
}
buildFeatures {
dataBinding = true //启用了 Data Binding 功能 (使用 <layout> 标签来包装你的 XML 布局文件)
viewBinding true //启用了 View Binding 功能 (减少 findViewById() 调用)
aidl true //启用了 AIDL 支持
buildConfig true //启用了 BuildConfig 类的生成
}
lintOptions {
abortOnError false //Lint 报告了错误,构建过程仍然会继续
}
sourceSets { // 指定源代码文件路径,一般不修改
main {
jniLibs.srcDirs = ['libs'] // so文件目录指向libs, (通常,这些文件位于 src/main/jniLibs 目录下)
manifest.srcFile 'src/main/manifest/AndroidManifest.xml'
java {
exclude 'src/main/module' // 排除 src/main/module 目录编译打包
}
}
}
productFlavors { // 多渠道配置,名字自定义,对于app/src下的路径
wandoujia {...}
xiaomi {...}
BAxxx {
dimension 'DEVICE'
applicationId "com.example.xxx"
buildConfigField("String", "DEVICE", '"BA202"')
versionCode xx
versionName 'xxx'
...
}
BAxxx {
dimension 'DEVICE'
applicationId "com.example.xxx"
buildConfigField("String", "DEVICE", '"BA201"')
...
}
}
productFlavors.all { // 遍历多渠道版本
// 配置示例: <meta-data android:name="UMENG_CHANNEL_NAME" android:value="${UMENG_CHANNEL_NAME}" />
// 设置清单文件 UMENG_CHANNEL_NAME 占位符值 为对应渠道的 name
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_NAME: name]
}
applicationVariants.all { variant ->
variant.outputs.all { apkData ->
//给生成的apk文件重新命名,添加上渠道,版本,时间标签到文件名上
apkData.outputFileName = project.rootProject.name + //也可以用 variant.name(渠道名)
"_C" + variant.versionCode + "_N" + variant.versionName + "_" + //版本信息
new Date().format("yyMMdd_HHmmss", TimeZone.getTimeZone("Asia/Shanghai")) + "_" + //时间信息
variant.buildType.name + //编译类型debug/release
".apk"
}
}
}
dependencies {//依赖库
implementation fileTree(include: ['*.jar'], dir: 'libs')
testImplementation 'junit:junit:4.13.2' //依赖测试库
androidTestImplementation 'androidx.test.ext:junit:1.1.5'//依赖Android测试库
implementation project(":settings-module") //依赖settings-module模块
implementation("androidx.activity:activity-ktx:1.2.1") {
exclude group: 'androidx.lifecycle', module: 'lifecycle-viewmodel-ktx'
}
//依赖库, 后续有时间在整理
}
afterEvaluate {
publishing {//Maven 仓库插件,对应的配置项
publications {
maven(MavenPublication) {
//com.test.settings:sdk:1.0.18
groupId = "com.test.settings"
artifactId = "sdk"
version = "1.0.18"
artifact tasks.findByName("bundleReleaseAar")
}
}
repositories {
maven {
allowInsecureProtocol true
url = "http://xxx" //仓库地址; 本地仓库url = 'file://D:/libs/localMaven'
//仓库的用户名及密码
credentials {
username 'xxx_user'
password 'xxx'
}
}
}
}
}
3.其他
相关参考文档和链接
Android Gradle 构建概览 (google官方文档) https://developer.android.google.cn/build/gradle-build-overview?hl=zh-cn
Android Studio常用 gradle 配置项 https://www.jianshu.com/p/c920d5e8e1c9










网友评论