【Gradle 学习】(五)Android 中的 Gradle 配置介绍
前言
前面介绍了在 Android 项目中是如何应用 Gradle 实现构建的,这篇学习在 Android 项目中对做了哪些构建的定制。
1. Android Studio 目录层级
Android 项目的目录层级大概如下,我们逐步拆解学习,为了便于定位说明的文件位置,上面描述的数字和后面小节一致。
├── app #Android App目录
│ ├── app.iml
│ ├── build #构建输出目录
│ ├── build.gradle #构建脚本 -- ④
│ ├── libs #so相关库
│ ├── proguard-rules.pro #proguard混淆配置
│ └── src #源代码,资源等
├── build
│ └── intermediates
├── build.gradle #工程构建文件 -- ③
├── gradle
│ └── wrapper
├── gradle.properties #gradle的配置 外部属性
├── gradlew #gradle wrapper linux shell脚本
├── gradlew.bat
├── local.properties #配置Androod SDK位置文件
└── settings.gradle #工程配置 -- ②
2. setting.gradle
settings.gradle 用于配置 project。
settings 文件声明了所需的配置来实例化项目的层次结构,标明其下有几个 module,比如这里包含一个名为 app 的 module。
include ':app'
3. 根目录的 build. gradle
和 settings.gradle 在同一目录下的 build.gradle 是一个顶级的 build 配置文件,在这里可以为所有的 project 以及 module 配置一些常用的配置。
根目录中的 build.gradle 默认包含 2 个代码块
- buildscript{...} 用于配置构建脚本所用到的代码库和依赖关系。这里定义了 Android 编译工具的类路径。repositories 中, jCenter 是一个著名的 Maven 仓库,不过由于 bintray.com(jcenter) 业务调整,后期不再提供 repo 管理了。
- allprojects{...} 用于定义所有模块需要用到的一些公共属性。这里定义的属性会被应用到所有的 module 中,但为了保证每个项目的独立性,一般不会在这里操作太多共有的东西
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()//使用 jcenter库
}
dependencies {
// 依赖 android提供的 4.3.0 的 gradle build
classpath 'com.android.tools.build:gradle:4.3.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
//为所有的工程的 repositories 配置为 jcenters
allprojects {
repositories {
jcenter()
}
}
4.模块级 build.gradle
除了在目录下的 build 文件,gradle 支持对每个 module 进行配置,主要有三个重要的代码块:plugin、android 和 dependencies
# build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 21
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "org.flysnow.demo"
minSdkVersion 9
targetSdkVersion 21
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.0.0'
}
4.1 apply plugin
第一行 apply plugin: 'com.android.application'
,这表示该 module 是一个 app module,应用了com.android.application 插件。 如果是一个 android library,那么这里的是 apply plugin: 'com.android.library'
apply plugin
:声明引用插件的类型,如果是库的话就加apply from
:表示引用其他的配置文件,比如apply from:"config.gradle"
4.2 android {...}
android { ... } 配置了所有 android 构建所需的参数,这也是 Android DSL 的入口点。
默认情况下,只有 compileSdkVersion 和 buildtoolsVersion 这两个属性是必须的。
compileSdkVersion & buildToolsVersion
compileSdkVersion
: 基于哪个 SDK 编译,这里的 Version 是 API LEVEL,是21buildToolsVersion
: 基于哪个构建工具版本进行构建的
defaultConfig {...} 默认配置
defaultConfig {...} 是默认配置,如果没有其他的配置覆盖,就会使用这里的。
常用属性:
applicationId
配置包名的versionCode
版本号versionName
版本名称minSdkVersion
app能够运行的最小版本targetSdkVersion
目标设备sdk(向前兼容)
补充说明:
一般 minSdkVersion
< targetSdkVersion
<= compileSdkVersion
miniSdkVersion
: app能运行的最小版本,比如minSdkVersion=18
(Android 4.3)那么在低于这个系统版本的设备上就会提示不能安装或运行。compileSdkVersion
: 是我们告诉 Gradle,我们是用哪一版本的Android Sdk去编译程序的,可以使用这个版本的 API,比如我们使用的是 7.0 的版本compileSdkVersion=24
,那么我们对于拍照裁剪图片等功能的操作,就可以使用 FileProvider了。targetSdkVersion
: 系统通过 targetSdkVersion 来保证 Android 的向前兼容性,在 Android4.4 之后的设备上,系统会判断你的 targetSdkVersion 是否小于 19,如果小于的话,那就按照 19 之前的 api 方法,如果大于等于 19,那么就按照之后的 api 方法来走,保证了程序运行的一致性。也就是向前兼容性。
defaultConfig {} 还有很多其他的配置,后面介绍
buildTypes {...} 构建类型
buildTypes 是构建类型,默认情况下,Android Plugin 会自动给项目构建 debug 和 release 版本,可以在这里面启用混淆,启用 zipAlign
以及配置签名信息等。
buildTypes{} 中的其他配置,后面介绍
4.3 dependencies {...}
dependencies DSL 就不属于 Android 专有的配置了,它是 Gradle API 的一部分,这里定义了该 module 需要依赖的 jar,aar,jcenter库信息。
apply plugin: 'com.android.application'
android { ... }
dependencies {
// Dependency on a local library module
implementation project(":mylibrary")
// Dependency on local binaries
implementation fileTree(dir: 'libs', include: ['*.jar'])
// Dependency on a remote binary
implementation 'com.example.android:app-magic:12.3'
}
包依赖方式
本地项目依赖
implementation project(':mylibrary')
这声明了对一个名为“mylibrary”(此名称必须与在您的 settings.gradle
文件中使用 include:
定义的库名称相符)的 Android 库模块的依赖关系。在构建您的应用时,构建系统会编译该库模块,并将生成的编译内容打包到 APK 中。
本地包依赖
implementation fileTree(dir: 'libs', include: ['*.jar'])
Gradle 声明了对项目的 module_name/libs/
目录中 JAR 文件的依赖关系(因为 Gradle 会读取 build.gradle
文件的相对路径)。
或者,您也可以按如下方式指定各个文件:
implementation files('libs/foo.jar', 'libs/bar.jar')
远程包依赖
Gralde 支持从 Maven 或 lvy 仓库中拉取依赖文件,首先需将仓库添加到列表中,再在 dependencies 中添加声明的包
repositories {
jcenter()
}
dependencies {
implementation 'com.example.android:app-magic:12.3'
}
这实际上是以下代码的简写形式:
implementation group: 'com.example.android', name: 'app-magic', version: '12.3'
这声明了对 com.example.android 命名空间组内的 12.3 版 app-magic 库的依赖关系。
注意:此类远程依赖项要求您声明适当的远程代码库,Gradle 应在其中查找相应的库。如果本地不存在相应的库,那么当 build 需要它时(例如,当您点击 Sync Project with Gradle Files 图标 或运行 build 时),Gradle 会从远程拉取它。
原生依赖项
从 Android Gradle 插件 4.0 开始,也可以按照本文档所述的方式导入原生依赖项。
根据公开原生库的 AAR,原生依赖项将自动提供给 externalNativeBuild
所使用的构建系统。如要从代码访问这些库,您必须在原生构建脚本中链接到这些库。
依赖项配置
- implementation: Gradle 会将依赖项添加到编译类路径和构建输出,依赖不会暴露给其他模块
- api: Gradle 会将依赖项添加到编译类路径和构建输出,依赖会传递给其他依赖该模块的模块
- compileOnly:Gradle 只会将依赖项添加到编译类路径,仅在编译期依赖,运行时可有可无时可以使用该配置
- runtimeOnly:Gradle 只会将依赖项添加到构建输出,以便在运行时使用。也就是说,不会将其添加到编译类路径。
- annotationProcessor:添加注解处理器的库依赖关系,需使用该配置将其添加到注解处理器类路径。注:Kotlin 使用 kapt 声明注解处理器依赖项
以上配置可以将依赖项应用于所有构建变体
如果想为特定的构建变体源代码集或测试源代码集声明依赖,必须将配置的名称首字母大写,并在前面加上构建变体或测试源代码集的名称作为前缀
dependencies {
releaseImplementation 'com.google.firebase:firebase-ads:9.8.0'
}
4.4 ext {...} 定制项目属性
在根目录 build.gradle 中, 可以定制适用于所有模块的属性,通过 ext
代码块来实现,如:
ext {
compileSdkVersion = 28
minSdkVersion = 18
}
然后在模块的 build.gradle 配置引用这些属性,语法为: rootProject.ext.{属性名}
, 比如:
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
}
小结
上面根据 Android 的目录结构说明了相关构建文件的组成,这里只是学习了基本的框架,在项目的使用中会有更多扩展配置应用,比如默认配置项、签名、构建类型、产品定制等,这些就放在后面继续学习吧。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanejhk
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01