Android - build.gradle 详解

最近重新捡起了 Android 开发,发现很多以前的知识点很多都忘了,也有当时追求项目进度而在过程中只是稍作了解并没有深入,所以项目完成后就忘了的原因。所以近期可能会更新很多我在 Android 开发中碰到的问题和收获的知识,由大部分来自网络上的资料,和我自己在实际开发中发现的和网络上的博客教程存在差异的地方。
另外推荐大家最好的可以在开发的过程中比照官方文档来使用 api,在最近公司的一个技术分享会上有位同事提到关于一个 WiFi 服务底下的 api,在 API 27 中已经弃用,虽然你在工程里仍可以调用那部分方法,但很可能会碰上不起作用或者产生其他问题的可能。安卓的官网现在国内也可以直接访问:Android Developers,外网地址:Android Developer

关于 build.gradle 的前置知识

  1. java 开发中有两个大名鼎鼎的项目构建 ANT、Maven。
  2. Google 推荐使用的 Android Studio 是采用 Gradle 来构建项目的。Gradle 是一个非常先进的项目构建工具。

Gradle 是用了一种基于 Groovy 的领域特定语言(DSL,Domain Specific Language)来声明项目设置,摒弃了 XML(如 ANT 和 Maven)的各种繁琐配置。

3 > 项目中一般会出现 2 个或者多个 build.gradle 文件,一个在根目录下,一个在 app 目录下。

如果切换到 Android 模式下则全部在 Gradle Scripts

根目录下的 build.gradle

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
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {//这里是 gradle 脚本执行所需依赖,分别是对应的 maven 库和插件
repositories {
google()//从 Android Studio3.0 后新增了 google()配置,可以引用 google 上的开源项目
jcenter()//是一个类似于 github 的代码托管仓库,声明了 jcenter() 配置,可以轻松引用 jcenter 上的开源项目
}
dependencies { //dependencies 闭包
classpath 'com.android.tools.build:gradle:3.5.1'
//gradle 是一个强大的项目构建工具,不仅可以构建 Android,还可以构建 java,C++ 等
//此处引用 android 的插件

// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}

allprojects {//这里是项目本身需要的依赖,比如项目所需的maven库
repositories {
google()
jcenter()
}
}

// 运行 gradle clean 时,执行此处定义的 task 任务。
// 该任务继承自 Delete,删除根目录中的 build 目录。
// 相当于执行 Delete.delete(rootProject.buildDir)。
// gradle 使用 groovy 语言,调用 method 时可以不用加()。
task clean(type: Delete) {
delete rootProject.buildDir
}

新建工程后,如果不做改动的话,显示和效用如上。除此以外:

  • buildscript{} 闭包里是 gradle 脚本执行所需依赖,分别是对应的 maven 库和插件。
  • allprojects{} 闭包里是项目本身需要的依赖,比如项目所需的 maven 库。
  • repositories{} 闭包:配置远程仓库,该闭包中声明了 jcenter()google() 的配置,其中jcenter是一个代码托管仓库,上面托管了很多 Android 开源项目,在这里配置了 jcenter 后我们可以在项目中方便引用 jcenter 上的开源项目,从 Android Studio3.0 后新增了 google() 配置,可以引用 google 上的开源项目。
  • dependencies{} 闭包:配置构建工具,该闭包使用classpath 声明了一个 Gradle 插件,由于 Gradle 并不只是用来构建 Android 项目,因此此处引入相关插件来构建 Android 项目,其中’3.0.0’为该插件的版本号,可以根据最新的版本号来调整。

app 目录下的 build.gradle

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
// 声明是 Android 程序,
//com.android.application 表示这是一个应用程序模块
//com.android.library 标识这是一个库模块
//而这区别:前者可以直接运行,后着是依附别的应用程序运行
apply plugin: 'com.android.application'

//Android 闭包:主要为了配置项目构建的各个属性
android {
compileSdkVersion 28 //设置编译时用的Android版本
buildToolsVersion "29.0.0" //build tools的版本,其中包括了打包工具aapt、dx等等。这个工具的目录位于你的sdk目录/build-tools/下
defaultConfig {
applicationId "com.example.net_speed_demo" //项目的包名
minSdkVersion 16 //项目最低兼容的版本
targetSdkVersion 28 //项目的目标版本
versionCode 1 //版本号
versionName "1.0" //版本名称
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" //表明要使用AndroidJUnitRunner进行单元测试
}

//这个闭包主要指定生成安装文件的主要配置,一般包含两个子闭包,一个是debug闭包,用于指定生成测试版安装文件的配置,可以忽略不写;另一个是release闭包,用于指定生成正式版安装文件的配置。
buildTypes {
release {
//表明是否对代码进行混淆,true 表示对代码进行混淆,false 表示对代码不进行混淆,默认的是 false。
minifyEnabled false
//指定混淆的规则文件,这里指定了 proguard-android.txt 文件和 proguard-rules.pro 文件两个文件,proguard-android.txt 文件为默认的混淆文件,里面定义了一些通用的混淆规则。proguard-rules.pro 文件位于当前项目的根目录下,可以在该文件中定义一些项目特有的混淆规则。
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
//项目的依赖关系
implementation fileTree(dir: 'libs', include: ['*.jar'])
//远程依赖
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
//声明测试用例库
androidTestImplementation 'androidx.test.ext:junit:1.1.0'
androidTestImplementation('androidx.test.espresso:espresso-core:3.1.1', {
exclude group: 'com.android.support', module: 'support-annotations'
})
api 'com.android.support:appcompat-v7:28.0.0'
implementation files('libs/achartengine-1.2.0.jar')
}

正常情况下,我们只需要用到以上配置,值得一提的是 dependencies{} 闭包,在下载 GitHub 上的第三方库常看到不太熟悉的引用方式,去搜索了一下后,得出答案:

从 Android Studio3.0 后 compile 引入库不在使用,而是通过 apiimplementationapi 完全等同于以前的 compile,用 api 引入的库整个项目都可以使用,用 implementation 引入的库只有对应的 Module 能使用,其他 Module 不能使用,由于之前的项目统一用 compile 依赖,导致的情况就是模块耦合性太高,不利于项目拆解,使用 implementation 之后虽然使用起来复杂了,但是做到降低偶合兴提高安全性。

另外还有一些配置可以根据个人需要添加,比如签名配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
signingConfigs {// 自动化打包配置
release {// 线上环境
keyAlias 'test'
keyPassword '123456'
storeFile file('test.keystore')
storePassword '123456'
}
debug {// 开发环境
keyAlias 'test'
keyPassword '123456'
storeFile file('test.keystore')
storePassword '123456'
}
}

------本文结束 感谢阅读------

本文地址:http://kaaaaai.cn/articles/Android-buildGradle-detailed.html
本文基于 知识共享署名-相同方式共享 4.0 国际许可协议发布
转载请注明出处,谢谢!

众筹项目:拯救世界!
0%