Gradle 配置详解

我们为大家介绍一下 Android 项目中 Gradle 的配置。

1. AndroidStudio 项目结构

我们介绍 AndroidStudio 中 Android 项目的 Gradle 配置之前,我们先来看下 AndroidStudio 中 Android 项目的结构,我们新建一个项目结构大致如下图所示:

我们通过上面的图片可以看到,Android 项目中跟 Gradle 相关的主要有 7 个部分:

  1. 根目录下的 build.gradle: 顶级构建文件,配置 Gradle 版本和 Maven 依赖;
  2. app 目录下的 build.gralde文件: app 打包和签名配置,及模块的依赖;
  3. gradle 文件夹: 配置 gradel-wrapper;
  4. setting.gradle 文件: 添加编译的所有模块;
  5. gradle.projects 文件: 项目范围的梯度设置,编译内存,Gradle 并发性等设置。
  6. gradlew 和 gradlew.bat 文件: Gradle 启动脚本文件
  7. .gradle 文件夹: 编译时的缓存文件夹

这几个部分各自负责的功能都不尽相同。下面我们来看下它们具体的功能

2. 根目录下的 build.gradle 文件

这个文件是我们创建 Android 项目的时候自动生成的,它是顶级构建文件,我们可以在其中添加所有子项目/模块共有的配置选项。我们来看下这个文件:

// Top-level build file where you can add configuration options common to all sub-projects/modules.
//顶级构建文件,您可以在其中添加所有 子项目/modules 共有的配置选项
buildscript {repositories {google()jcenter()}dependencies {classpath 'com.android.tools.build:gradle:3.5.1'// NOTE: Do not place your application dependencies here; they belong// in the individual module build.gradle files//注意:不要将您的应用程序依赖项放在这里; 它们属于单独的模块 build.gradle 文件}
}allprojects {repositories {google()jcenter()}
}task clean(type: Delete) {delete rootProject.buildDir
}

以上就是我们每创建一个 Android 项目,项目根目录下的 build.gradle 文件的代码,也就是顶级构建文件的代码。下面来分开讲解一下每个闭包:

2.1 buildscript{} 闭包

首先我们先看下上面的buildscript闭包,这个闭包里是配置 Gradle 脚本执行所需要的的依赖,分别是对应 Maven 仓库和构建工具 Gradle 的版本。

2.1.1 repositories{} 闭包

这个闭包里面主要是配置远程的 Maven 仓库地址。我们看到里面声明了jcenter()google(),这两个都是 maven 仓库,上面托管了很多开源项目,依赖了这个我们就可以引用上面的开源项目了。比如 Android 中的 V7,V4 包等。

2.1.2 dependencies{} 闭包

这个闭包我们直接看,就应该能猜到是配置项目构建工具 Gradle 的版本的,classpath 就是声明一个插件 Gradle来构建项目。dependencies虽然是依赖的意思,但是我们这里需要注意:不能将应用程序的依赖放在这里,应用程序的依赖在单独的build.gradle里面。

2.2 allprojects{} 闭包

这个闭包里面的是我们项目运行所需要的的依赖,往往和上面的repositories是相对应的。

buildscript {repositories {  //注释1maven { url "http://maven.aliyun.com/nexus/content/groups/public/" }google()jcenter()}dependencies {classpath 'com.android.tools.build:gradle:3.5.1'// NOTE: Do not place your application dependencies here; they belong// in the individual module build.gradle files//注意:不要将您的应用程序依赖项放在这里; 它们属于单独的模块build.gradle文件}
}
allprojects {repositories { //注释2maven { url "http://maven.aliyun.com/nexus/content/groups/public/" }google()jcenter()}
}
task clean(type: Delete) {delete rootProject.buildDir
}

这里我们需要注意代码中的注释1注释2处的 repositories 闭包,往往我们添加一个 maven 库的依赖时,需要两个闭包中都添加一遍。

Tips: 我们添加 Maven 库时可以需要两个都添加,比如国外 Maven 访问太慢,我们可以加入国内阿里云的 Maven 库。

2.3 clean任务

我们前面讲到 Gradle 是基于任务的,这里的clean它是一个 Gradle 任务,它继承自Delete,我们点击clean Project或是执行gradle clean命令的时候就是在执行这个任务,它的任务内容是删除build文件夹下的内容。

3. app目录下的 build.gradle 文件

这个我们直接看文件内容吧:

//注释1
apply plugin: 'com.android.application'
//注释2
android {compileSdkVersion 28buildToolsVersion "29.0.2"defaultConfig {applicationId "com.bthvi.myuiapplication"minSdkVersion 19targetSdkVersion 28versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}
}
//注释3
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'
}

上面的文件就是 app 模块下的 build.gradle 文件,我们看到主要是分三个部分,注释1,注释2,注释3分别对应如下三个语句和闭包:

  1. apply plugin 语句
  2. android 闭包
  3. dependencies 闭包

3.1 apply plugin

这句是文件中的 第一行,表示的意思是在这个模块应用一个插件,插件的值有以下 2 种:

  • com.android.application:如果是这个值,则代表这个模块是一个Android应用程序,可以独立运行,生成apk文件。
  • com.android.library:如果是这个值,代表这个模块是一个Android model,不能够独立运行,必须依附于application才能运行,项目构建后生成的是一个aar文件。

Tips:
apply plugin: ‘com.android.application’ 表示这是一个应用程序模块
apply plugin: ‘com.android.library’ 标识这是一个模块module
区别: 前者可以直接运行,后者是需要依附在应用程序上运行的

3.2 android闭包

这个闭包主要是配置我们打包的一些信息,包括包名,版本号,版本名称,混淆配置,签名信息等。

下面我们详细介绍下:

  • compileSdkVersion: 设置编译时的 Android 版本。
  • buildToolsVersion: 设置编译时构建工具的版本。

3.2.1 defaultConfig{}闭包:

这个闭包里主要是设置包的一些基本信息,如包名,版本号等。

  • applicationId: 设置打包后的 APK 的包名。
  • minSdkVersion: 设置 apk 最低的支持 Android 版本,如果手机的 Android 系统版本低于这个值,app 一般无法安装。
  • targetSdkVersion: 设置项目的目标版本,表示应用程序在该版本上已经做过充分的测试,系统会为该应用启动一些对应该目标系统的最新功能特性。

Tips: Android系统的行为变更,只有 targetSdkVersion 的值设置为大于或等于该手机系统的 API 版本时,才会生效。例如,设置 targetSdkVersion 为 28,对应为 Android 系统版本为 9.0,在 Android 10.0(对应 targetSdkVersion 为 29)系统的手机上,Android 10.0 拥有的新特性[如外存中私有目录权限变更等功能]就不会被启用。

  • versionCode: 设置 APK 包的版本号,一般情况每次打包都要 +1,否则会无法覆盖安装。
  • versionName: 表示版本名称,展示在 APP 的关于里面或是应用市场上。
  • testInstrumentationRunner: 设置单元测试,android.support.test.runner.AndroidJUnitRunner表明是要使用AndroidJUnitRunner进行单元测试。

3.2.2 buildTypes{}闭包:

这个闭包主要是配置我们打包的,一般包含两个闭包releasedebug分别对应的是打Release包还是Debug包。所谓Debug包就是我们直接运行的包,这个包的配置新建项目时是省略没有写的。

    buildTypes {release {// 生产包配置minifyEnabled true//是否混淆shrinkResources true//是否启用未使用资源的收缩proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//指定混淆的规则文件signingConfig signingConfigs.release//设置签名信息zipAlignEnabled true//是否对APK包执行ZIP对齐优化,减小zip体积renderscriptOptimLevel 5 //指定RenderScript的编译优化等级,一般设置为3}debug {// 开发配置minifyEnabled false//是否混淆shrinkResources false//是否启用未使用资源的收缩signingConfig signingConfigs.release//设置签名信息proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//指定混淆的规则文件zipAlignEnabled true//是否对APK包执行ZIP对齐优化,减小zip体积renderscriptOptimLevel 5}}

从上面的代码中我们可以看到releasedebug的配置基本差不多。关于每个字段的具体的意义上面注释中有写,下面就不多做说明了。我们下面主要看下signingConfig这个字段,这个是设置 APP 的签名信息的。

    //签名signingConfigs {//你自己的keystore信息releaseConfig {storeFile file(rootProject.ext.store_file)storePassword rootProject.ext.store_passwordkeyAlias rootProject.ext.key_aliaskeyPassword rootProject.ext.key_passwordv1SigningEnabled truev2SigningEnabled true}}

Tips: 签名信息设置signingConfig闭包是在最外层的,也就是和buildTypes闭包是在同一层级的。千万不要把它放在buildTypes闭包里面。

3.2.3 dependencies 闭包

这个闭包是项目运行所需要的依赖。如我们需要引用的本地 libs 目录下的第三方的 jar 包或是 aar 包,还可以是 maven 库里面的第三方的开源库 [如 support-v4 support-v7 包等]。

Tips: 这里我们要和最外层的build.gradle文件的dependencies闭包区分开来。这里的 dependencies 闭包是配置项目运行时引入的第三方库。而最外层的文件中的 dependencies 闭包是配置构建项目时的 Gradle 的版本。

4. gradle文件夹

gradle 文件夹主要是配置 gradle-wrapper 的,我们看到它的目录下有个wrapper目录,下面有gradle-wrapper.jargradle-wrapper.properties两个文件。

下面我们看下gradle-wrapper.properties文件的内容,我们会发现它是配置 Gradle 版本的。看着毫不起眼,但是它却非常重要,关于它的详细介绍我们下一节会做详细的讲解。

#Mon Mar 01 07:39:30 CST 2021
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip

5. setting.gradle 文件

这个文件其实非常简单,就是配置项目的模块的,有几个模块就在 setting.gradle 文件里面添加它们的名字就行了。默认创建只有app在里面:

include ':app'
//如果,我们的项目中有person,common,home等模块时,可以这样引入
include ':app',':person',':common',':home'

6. gradle.projects 文件

这个文档一般我们在日常开发中不需要去动它,这个文档主要是项目范围的梯度设置,通过 AndroidStudio 配置的渐变设置将覆盖此文件中指定的任何设置。

# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1024m
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true

通过上面的代码我们看到主要有一句没有注释,第 9 行,这句的作用就是设置运行时的最大内存。

Tips: 这里分享一个经验,如果你的电脑编译项目耗时比较久,我们可以修改这个文件的配置,适当增加编译时的内存,使 Gradle 独立运行。笔者亲测有效:第11、12行。

# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
# 提高AndroidStudio的并发性,使Gradle独立运行。
org.gradle.parallel=true
org.gradle.daemon=true

7. gradlew 和 gradlew.bat 文件

这两个文件其实就是 Gradle 启动的脚本文件,我们可以使用gradlew命令来打包相当于gradle命令。关于gradle的命令我们后面有一节专门介绍。这节我们看下这两个文件的区别,以及怎么使用gradlew命令。
下面我们看看这两个文件的前面几行:
gradlew 文件

#!/usr/bin/env sh##############################################################################
##
##  Gradle start up script for UN*X
##
##############################################################################

gradlew.bat 文件

@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem  Gradle startup script for Windows
@rem
@rem ##########################################################################

通过上面的注释我们可以看到,原来这两个文件的作用是你一样的,都是 Gradle 启动的脚本文件,不过gradlew文件是 Linux 系统或是 Unix 系统的脚本文件,而gradlew.bat是 Windows 系统的脚本文件。
使用 gradlew 命令,以 clean 命令为例,我们只需要在 AndroidStudio下输入如下命令:

//Windows系统
gradlew clean//Linux系统或是Mac系统
./gradlew clean

Tips: 我们可能在 MAC 或是 Linux 系统中遇到bash: ./gradlew: Permission denied这个错误,这是因为没有权限。我们只需要执行chmod +x gradlew这个命令后,再执行./gradlew clean命令就 OK 了。

8. .gradle 文件夹

这个文件其实我们不用太在意它,这个文件夹是项目构建的一个缓存的目录。只要我们打开一个 Android 项目,它就会生成这个文件夹。是一个临时的文件夹。

9. 小结

本节我们主要为大家介绍了 AndroidStudio 中 Android 项目的结构,及相关 Gradle 知识的详解。我们回顾一下前面所说的 7 个文件的作用:

  • 根目录下的 build.gradle: 顶级构建文件,配置 Gradle 版本和 Maven 依赖;
  • app 目录下的 build.gralde文件: app 打包和签名配置,及模块的依赖;
  • gradle 文件夹: 配置 gradel-wrapper;
  • setting.gradle 文件: 添加编译的所有模块;
  • gradle.projects 文件: 项目范围的梯度设置,编译内存,Gradle 并发性等设置;
  • gradlew 和 gradlew.bat 文件: Gradle 启动脚本文件;
  • .gradle 文件夹: 编译时的缓存文件夹。

Gradle 配置详解相关推荐

  1. 史上最全Android build.gradle配置详解

    Android Studio是采用gradle来构建项目的,gradle是基于groovy语言的,如果只是用它构建普通Android项目的话,是可以不去学groovy的.当我们创建一个Android项 ...

  2. Android Studio build.gradle配置详解

    Android Studio是采用gradle来构建项目的,gradle是基于groovy语言的,如果只是用它构建普通Android项目的话,是可以不去学groovy的.当我们创建一个Android项 ...

  3. Android build.gradle配置详解

    AndroidStudio中的Gradle文件 Android Studio是采用gradle来构建项目的,gradle是基于groovy语言. 如上图所示,创建一个AndroidStudio项目,会 ...

  4. gradle配置详解

    版权声明:本文为章鱼哥原创文章,若要转载,请注明出处 https://blog.csdn.net/qq_40388552/article/details/95939429 gradle配置总结   g ...

  5. android 项目build.gradle,Android build.gradle 配置详解

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? Gradle 简介 Android Studio 是采用 Gradle 来构建项目的.Gradle 是一个非常先进的项目 ...

  6. Jenkins 从选择插件到配置详解-Gradle

    1.入门安装重要插件 Publish Over SSH: SSH连接服务器插件Git 相关: 代码拉取gradle: 用于项目打包 2.Jenkins 创建项目到配置详解 1.创建一个自由风格的软件项 ...

  7. Gradle安装和配置详解

    Gradle安装和配置详解 gradle是基于Apache Ant和Apache Maven概念的项目自动化构建开源工具,也提供了很多第三方插件.在Java Web项目中通常会用到 java.war. ...

  8. Android build.gradle文件详解(转述自《Android第一行代码》第二版)

    Android build.gradle文件详解 1. 最外层目录下的build.gradle文件 1.1 repostories 1.2 dependencies 2. app目录下的build.g ...

  9. Android studio 多渠道(多环境)打包grade配置详解

    Android studio 多渠道(多环境)打包grade配置详解 场景:开发app,我们需要两套环境或者两套环境以上的apk,每套环境的apk分两个版本debug版和release版. 公司有套平 ...

最新文章

  1. 人工神经网络背后的数学原理!
  2. Nat. Biotechnol.扩增子测序革命—用16S及18S rRNA全长进行微生物多样性研究
  3. 你可能不需要一个 JavaScript 框架(二)
  4. notifyDataSetInvalidated()跟notifyDataSetChanged()的区别
  5. 脸红是因为缺乏乙醛分解酶导致的酒精中毒
  6. 征战蓝桥 —— 2013年第四届 —— C/C++A组第6题——逆波兰表达式
  7. mac 下配置连接Linux服务器方法,上传下载文件操作
  8. android 动态调用apk,通过反射动态加载未安装apk
  9. Windows 10企业批量部署实战之刷新并添加启动映像
  10. 【华为云技术分享】“技术-经济范式”视角下的开源软件演进剖析-part 1
  11. 如何自学python-如何自学python语言
  12. FIN断开-TCP segment of a reassembled PDU-原因分析
  13. 常用英语高频词汇android,英语常用高频词汇
  14. 海海软件DRM-X 4.0产品介绍
  15. java网络编程中Socket什么意思?怎么工作的?
  16. 你有多久没有看星星了呢?【爬取NASA的科普网站上的所有图片】
  17. java如何对list进行深度复制
  18. 跨境电商的三个增长点:产品曝光 品类轮转 入自建站
  19. 计算机基础知识--->对张海藩老师所著《软件工程》的这本书的一些知识总结
  20. 《谋圣鬼谷子》曝片花 徐麒雯饰演“姮娥”

热门文章

  1. [实用工具]Unity调用外部EXE或Shell命令
  2. 【重要】opencv实现立体匹配
  3. [SMOJ2217]摩天楼
  4. 让生气的顾客开心的 10 种方法
  5. node Sream
  6. C语言Union的使用
  7. 第7章 学习是个技术活——《逆袭大学》连载
  8. JavaScript基础之缓存机制:浏览器缓存机制
  9. Macbook Pro 201 装Win10 声卡_【Macbook安装Win10优化第一弹】用Dolby Atmos恢复应有的音质...
  10. hnu实验七字符串7. 音乐DJ和回响贝斯