Gradle
Gradle 是一个项目自动化构建工具, 帮我们做了依赖、打包、部署、发布、各种渠道的差异管理等工作.
项目级别的 build.gradle 指定了当前项目的总体编译规则.
模块级别的 build.gradle 对应于具体模块, 每个模块都有自己的 build.gradle, 它指定了当前模块的详细编译规则.
想要学习 gradle 的话还需要学习 groovy 语言.
groovy 教程: https://www.w3cschool.cn/groovy/
工程级的 build.gradle:
模块级的 build.gradle 内容比较多:
不同版本的 Android Studio 对不同版本的 gradle 的支持有很大差异.
不同版本的 gradle 之间的配置也是不一样的.
项目级别的 build.gradle
新创建的 App 项目默认有两个 build.gradle, 一个是 Project 项目级别的 build.gradle; 另一个是 Module 模块级别的 build.gradle.
Android Studio 是采用 Gradle 来构建项目的. Gradle 是一个非常先进的项目构建工具, 它使用了一种基于 Groovy 的领域特定语言 (DSL) 来进行项目设置, 摒弃了传统的基于 XML (如 Ant 和 Maven) 的各种烦琐配置.
领域特定语言 (英语: Domain-specific language, 缩写: DSL) , 也称为特定域语言, 是专门针对特定应用领域的计算机语言, 和可以用在多种领域的通用语言 (GPL) 恰好相反.
通用语言, 英语: general-purpose language, 简称为 GPL.
项目级别的 build.gradle 指定了当前项目的总体编译规则, 打开该文件, 在 buildscript 下面找到 repositories 和 dependencies 两个节点, 其中 repositories 节点用于设置 Android Studio 插件的网络仓库地址, 而 dependencies 节点用于设置 gradle 插件的版本号. 由于官方的谷歌仓库位于国外, 下载速度相对较慢, 因此可在 repositories 节点添加阿里云的仓库地址, 方便国内开发者下载相关插件. 修改之后的 buildscript 节点内容如下所示:
buildscript { repositories { // 以下四行添加阿里云的仓库地址, 方便国内开发者下载相关插件 maven { url 'https://maven.aliyun.com/repository/jcenter' } maven { url 'https://maven.aliyun.com/repository/google' } maven { url 'https://maven.aliyun.com/repository/gradle-plugin' } maven { url 'https://maven.aliyun.com/repository/public' } google() jcenter() } dependencies { // 配置 gradle 插件版本, 下面的版本号就是 Android Studio 的版本号 classpath 'com.android.tools.build:gradle:4.1.0' } }
以一个 HelloWorld 工程为例:
build.gradle 文件内容:
// Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { id 'com.android.application' version '7.1.2' apply false id 'com.android.library' version '7.1.2' apply false } task clean(type: Delete) { delete rootProject.buildDir }
build.gradle 文件解析:
另一种可能的 build.gradle 文件内容:
buildscript { ext.kotlin_version = '1.3.61' repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.5.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } allprojects { repositories { google() jcenter() } }
两处 repositories 的闭包中都声明了 google() 和 jcenter() 这两行配置, 它们分别对应一个代码仓库, google 仓库中包含的主要是 Google 自家的扩展依赖库, 而 jcenter 仓库中包含的大多是一些第三方的开源库, 很多 Android 开源项目都会选择将代码托管到 jcenter 上. 声明了这两行配置之后, 我们就可以在项目中轻松引用任何 google 和 jcenter 仓库中的依赖库了.
dependencies 闭包中使用 classpath 声明了两个插件: 一个 Gradle 插件和一个 Kotlin 插件.
Gradle 并不是专门为构建 Android 项目而开发的, Java、C++ 等很多种项目也可以使用 Gradle 来构建, 因此如果我们要想使用它来构建 Android 项目, 则需要声明 com.android.tools.build:gradle:3.5.2
这个插件. 其中, 最后面的部分是插件的版本号, 它通常和当前 Android Studio 的版本是对应的, 比如我现在使用的是 Android Studio 3.5.2 版本, 那么这里的插件版本号就应该是 3.5.2. 而另外一个 Kotlin 插件则表示当前项目是使用 Kotlin 进行开发的, 如果是 Java 版的 Android 项目, 则不需要声明这个插件.
通常情况下, 你并不需要修改这个最外层目录下的 build.gradle 文件中的内容, 除非你想添加一些全局的项目构建配置.
模块级别的 build.gradle
模块级别的 build.gradle 对应于具体模块, 每个模块都有自己的 build.gradle, 它指定了当前模块的详细编译规则.
示例:
android { // 指定编译用的 SDK 版本号. 比如 30 表示使用 Android 11.0 编译 compileSdkVersion 30 // 指定编译工具的版本号. 这里的头两位数字必须与 compileSdkVersion 保持一致, 具体的版本号可在 sdk 安装目录的 sdk\build - tools 下找到 buildToolsVersion "30.0.3" defaultConfig { // 指定该模块的应用编号, 也就是 App 的包名 applicationId "com.example.chapter02" // 指定 App 适合运行的最小 SDK 版本号. 比如 19 表示至少要在 Android 4.4 上运行 minSdkVersion 19 // 指定目标设备的 SDK 版本号. 表示 App 最希望在哪个版本的 Android 上运行 targetSdkVersion 30 // 指定 App 的应用版本号 versionCode 1 // 指定 App 的应用版本名称 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-androidoptimize.txt '), ' proguard - rules.pro ' } } } // 指定 App 编译的依赖信息 dependencies { // 指定引用 jar 包的路径 implementation fileTree(dir: 'libs', include: ['*.jar']) // 指定编译 Android 的高版本支持库. 如 AppCompatActivity 必须指定编译 appcompat 库 // appcompat 库各版本见 https://mvnrepository.com/artifact/androidx.appcompat/appcompat implementation 'androidx.appcompat:appcompat:1.2.0' // 指定单元测试编译用的 junit 版本号 testImplementation 'junit:junit:4.13' androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' }
这两种编译配置文件的扩展名都是 .gradle
是因为它们采用了 Gradle 工具完成编译构建操作. Gradle 工具的版本配置在 gradle\wrapper\gradle-wrapper.properties, 也可以依次选择菜单 File → Project Structure → Project, 在弹出的设置页面中修改 Gradle Version. 注意每个版本的 Android Studio 都有对应的 Gradle 版本, 只有二者的版本正确对应, App 工程才能成功编译. 比如 Android Studio 4.1 对应的 Gradle 版本为 6.5, 更多的版本对应关系见 https://developer.android.google.cn/studio/releases/gradle-plugin#updating-plugin
以 HelloWorld 工程为例:
内容示例:
apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' android { compileSdkVersion 29 buildToolsVersion "29.0.2" defaultConfig { applicationId "com.example.helloworld" minSdkVersion 21 targetSdkVersion 29 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.core:core-ktx:1.1.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' }
首先第一行应用了一个插件, 一般有两种值可选: com.android.application
表示这是一个应用程序模块, com.android.library
表示这是一个库模块. 二者最大的区别在于, 应用程序模块是可以直接运行的, 库模块只能作为代码库依附于别的应用程序模块来运行.
接下来的两行应用了 kotlin-android
和 kotlin-android-extensions
这两个插件. 如果你想要使用 Kotlin 来开发 Android 项目, 那么第一个插件就是必须应用的. 而第二个插件帮助我们实现了一些非常好用的 Kotlin 扩展功能, 能带来巨大的便利性.
紧接着是一个大的 android 闭包, 在这个闭包中我们可以配置项目构建的各种属性. 其中, compileSdkVersion 用于指定项目的编译版本, 这里指定成 29 表示使用 Android 10.0 系统的 SDK 编译. buildToolsVersion 用于指定项目构建工具的版本, 目前最新的版本就是 29.0.2, 如果有更新的版本时, Android Studio 会进行提示.
android 闭包中又嵌套了一个 defaultConfig 闭包, defaultConfig 闭包中可以对项目的更多细节进行配置.
其中, applicationId 是每一个应用的唯一标识符, 绝对不能重复, 默认会使用我们在创建项目时指定的包名, 如果你想在后面对其进行修改, 那么就是在这里修改的.
minSdkVersion 用于指定项目最低兼容的 Android 系统版本, 这里指定成 21 表示最低兼容到 Android 5.0 系统.
targetSdkVersion 指定的值表示你在该目标版本上已经做过了充分的测试, 系统将会为你的应用程序启用一些最新的功能和特性. 比如 Android 6.0 系统中引入了运行时权限这个功能, 如果你将 targetSdkVersion 指定成 23 或者更高, 那么系统就会为你的程序启用运行时权限功能, 而如果你将 targetSdkVersion 指定成 22, 那么就说明你的程序最高只在 Android 5.1 系统上做过充分的测试, Android 6.0 系统中引入的新功能自然就不会启用了.
versionCode 用于指定项目的版本号.
versionName 用于指定项目的版本名.
testInstrumentationRunner 用于在当前项目中启用 JUnit 测试, 你可以为当前项目编写测试用例, 以保证功能的正确性和稳定性.
buildTypes 闭包中用于指定生成安装文件的相关配置, 通常只会有两个子闭包: 一个是 debug, 一个是 release. debug 闭包用于指定生成测试版安装文件的配置, release 闭包用于指定生成正式版安装文件的配置. 另外, debug 闭包是可以忽略不写的, 因此我们看到上面的代码中就只有一个 release 闭包.
release 闭包中, minifyEnabled 用于指定是否对项目的代码进行混淆, true 表示混淆, false 表示不混淆. proguardFiles 用于指定混淆时使用的规则文件, 这里指定了两个文件: 第一个 proguard-android-optimize.txt
是在 <Android SDK>/tools/proguard
目录下的, 里面是所有项目通用的混淆规则; 第二个 proguard-rules.pro
是在当前项目的根目录下的, 里面可以编写当前项目特有的混淆规则.
dependencies 闭包的功能非常强大, 它可以指定当前项目所有的依赖关系. 通常 Android Studio 项目一共有 3 种依赖方式: 本地依赖、库依赖和远程依赖. 本地依赖可以对本地的 jar 包或目录添加依赖关系, 库依赖可以对项目中的库模块添加依赖关系, 远程依赖则可以对 jcenter 仓库上的开源项目添加依赖关系.
在 dependencies 闭包中的配置, 第一行的 implementation fileTree
就是一个本地依赖声明, 它表示将 libs 目录下所有 .jar 后缀的文件都添加到项目的构建路径中.
implementation 则是远程依赖声明, androidx.appcompat:appcompat:1.1.0
就是一个标准的远程依赖库格式, 其中 androidx.appcompat 是域名部分, 用于和其他公司的库做区分; appcompat 是工程名部分, 用于和同一个公司中不同的库工程做区分; 1.1.0 是版本号, 用于和同一个库不同的版本做区分. 加上这句声明后, Gradle 在构建项目时会首先检查一下本地是否已经有这个库的缓存, 如果没有的话则会自动联网下载, 然后再添加到项目的构建路径中. 至于库依赖声明这里没有用到, 它的基本格式是 implementation project 后面加上要依赖的库的名称, 比如有一个库模块的名字叫 helper, 那么添加这个库的依赖关系只需要加入 implementation project(':helper')
这句声明即可.
testImplementation 和 androidTestImplementation 都是用于声明测试用例库的.
通过 Android Studio 直接运行项目生成的都是测试版安装文件, 并不是正式版安装文件.
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!