安卓Gradle总结
1. 简介
Gradle 是 Android 官方推荐的构建系统,基于 Groovy DSL,通过脚本化的方式管理项目依赖、任务执行和打包流程
一套标准的安卓项目应该如下:
projectRoot/
├── app/ # 主模块(可自定义命名)
│ ├── src/ # 源代码目录(按包名分类)
│ │ ├── main/ # Java/Kotlin + 资源文件(布局/图片/字符串等)
│ │ └── androidTest/ # 设备端测试代码
│ ├── build.gradle # 模块级构建脚本(定义依赖、插件等)
├── build.gradle # 顶层全局设置(如仓库地址、公共依赖)
└── settings.gradle # 指定参与构建的模块列表
gradle编译的过程如下:
1). 解析settings.gradle
该文件是项目级别的gradle文件,用于确定参与构建的所有模块,加载环境变量和属性文件。
2). 配置阶段
执行各模块的 build.gradle,创建任务图并建立依赖关系模型。此时不会实际执行任何操作
3). 执行阶段
合并资源 → 编译Java→处理Manifest→打包APK→签名对齐
2. settings.gradle配置
settings.gradle最基础的作用是指定哪些目录被视为项目的子模块,如:
include("app", "library", "another-module")
如果省略此句,默认只会将当前根目录作为唯一项目;对于多模块工程必须显式声明。
还可以设置跨项目的属性传递,向所有子项目暴露通用的配置参数
rootProject {extensions.add("myGlobalProp", "value") // 自定义扩展属性
}
然后在任意子模块的build.gradle中可以直接读取参数:
println project.property('myGlobalProp') // => "value"
再一个就是配置插件的来源,增强安全性:
pluginManagement {repositories {maven { url = uri(" ") } //可以写一些镜像源gradlePluginPortal() // 官方仓库仍建议保留}
}
3. build.gradle配置
build.gradle在根目录下会有一个,是用于顶层全局配置,比如设置仓库地址,公共依赖等。每个模块下,还会有一个模块级的build.gradle,会牵扯到模块的业务逻辑,用于构建模块。
顶层build.gradle一般会配置如下:
//插件门户管理
pluginManagement {repositories {mavenCentral() // 确保能下载到最新插件版本google() // Android官方插件源gradlePluginPortal() // Gradle社区认证的插件仓库}
}
//集中定义所有Maven/Ivy源以避免重复代码
allprojects {repositories {maven { url = uri("https://maven.aliyun.com/repository/public") } // 阿里云镜像加速国内访问mavenLocal() // 优先使用本地缓存的构件mavenCentral() // JCenter已废弃,改用中央库替代方案}
}
项目级build.gradle:
- 域声明:必须以 apply plugin: ‘com.android.application’ 开头(应用)或 library(库),启用对应类型的编译逻辑。
- 配置块:关键属性包括:
defaultConfig { … } → 设置默认维度(如版本号、屏幕密度适配策略);
dependencies { … } → 引入三方库(如 implementation ‘com.squareup.retrofit2:retrofit:2.9.0’);
android { … } → 精细调控编译选项(混淆规则、NDK支持等) - 变量复用:利用 ext 或 extra 集中管理常量值,提升可维护性。
plugins {id 'com.android.application'
}android {...defaultConfig {applicationId "com.example.myapp"minSdkVersion 21 //minSdk targetSdk 这些类写法都已经弃用targetSdkVersion 30versionCode 1versionName "1.0.0" // 修改此处的值即可改变APK的名称...}// 所有flavor相关资源都应该配置在模块级的src/目录下,用于表示不同版本的代码productFlavors{free{resValue "string", "app_name", "free"}paid{resValue "string", "app_name", "paid"}}//指定签名signingConfigs {// debug 和 release 分开写debug {storeFile file("${project.rootDir}/mykey.keystore")storePassword '123456'keyAlias 'mykey'keyPassword '123456'}}关于文件路径最好使用动态路径,灵活性更高不易冲突buildTypes {debug {buildConfigField "boolean", "ENABLE_LOGGING", "true"resValue "string", "app_name", "MyApp"//自定义输出目录 // 将debug构建的APK输出到模块的根目录下的debug目录outputFile = "${rootProject.projectDir}/outputs/debug/app-debug.apk"}release {buildConfigField "boolean", "ENABLE_LOGGING", "true"resValue "string", "app_name", "MyApp" //用于替代AndroidMainfest.xml中的字段// 将release构建的APK输出到模块的根目录下的release目录outputFile = "${rootProject.projectDir}/outputs/release/app-release.apk"}}// 编译版本 显示指定编译的JDK版本 1_8对应java8 11 17 21 分别对应java11 java17 java21 compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}// 依赖库添加 包括本地和远程依赖dependencies {}
4. 实用工具
编译出问题的时候可以通过以下命令获取详细错误信息:
./gradlew assembleDebug --stacktrace --info./gradlew lint //用于代码检查,可以排除一些代码规范问题