build.gradle配置文件详解

Andorid Studio高版本和低版本的build.gradle配置逻辑有些差异

安卓项目中相关编译文件的介绍

gradle-wrapper.properites:配置Gradle Wrapper
gradle.properties:配置Gradle的编译参数。具体配置见Gradle官方文档:com.android.build.gradle  |  Android Developers
settings.gradle:配置Gradle的多项目管理
local.properties:一般用来存放该Android项目的私有属性配置,比如Android项目的SDK路径项目build.gradle:配置项目的整体属性,比如指定使用的代码仓库、依赖的Gradle插件版本等等
模块build.gradle:配置当前Module的编译参数

build.gradle配置文件详解_第1张图片
下面介绍下开发中经常用到的项目build.gradle和模块build.gradle

项目的build.gradle

新建一个Android项目,它的项目build.gradle的内容如下

build.gradle配置文件详解_第2张图片

app的build.gradle

build.gradle配置文件详解_第3张图片

Gradle的Android插件类型

plugins {
    id 'com.android.application'
}

build.gradle配置文件详解_第4张图片

如:build.gradle配置文件详解_第5张图片

参考地址:(AS笔记)AndroidStudio中ButterKnife配置和使用_电竞丶小松哥的博客-CSDN博客

其实是从 Gradle 官方的插件仓库 https://plugins.gradle.org/m2/ 下载

引入的插件类型,老版本的写法:apply plugin: 'com.android.application'

说明当前模块是一个应用程序模块,Gradle的Android插件有多个类型分别为:

应用程序插件**,插件id为com.android.application,会生成一个APK。
库插件,插件id为com.android.library,会生成一个AAR,提供给其他应用程序模块用。
测试插件,插件id为com.android.test,用于测试其他的模块。
feature插件,插件id为com.android.feature,创建Android Instant App时需要用到的插件。
Instant App插件,插件id为com.android.instantapp,是Android Instant App的入口。

Android块参数

compileSdkVersion:配置编译该模块的SDK版本
buildToolsVersion:Android构建工具的版本
2.2.1. defaultConfig块
Android块中的defaultConfig块用于默认配置,常用的配置如下所示。
build.gradle配置文件详解_第6张图片

buildTypes块

buildTypes块用于配置构建不同类型的APK。 当我们新建一个项目时,在Android块已经默认配置了 buildTypes块:

build.gradle配置文件详解_第7张图片

在AS的Terminal中执行gradlew.bat build命令,会在该模块的build/outputs/apk目录中生成release和debug的APK,虽然只配置了release ,但release和debug是默认配置,即使我们不配置也会生成。也可以修改默认的release和debug,甚至可以自定义构建类型,比如:

build.gradle配置文件详解_第8张图片

这时会在build/outputs/apk目录中生成release、debug、privitedebug的APK,buildTypes块还可以配置很多属性,常用的配置如下所示。

build.gradle配置文件详解_第9张图片

signingConfigs块

用于配置签名设置,一般用来配置release模式

build.gradle配置文件详解_第10张图片

signingConfigs {
        release {
            storeFile file('../signfiles/keystore.jks')
            storePassword 'android'
            keyAlias 'androidreleasekey'
            keyPassword 'android' 
        }
        debug {
            storeFile file("../signfiles/keystore.jks")
            storePassword 'android'
            keyAlias 'androidreleasekey'
            keyPassword 'android'
        }
}

其他配置块

android块中除了前面讲的defaultConfig块、buildTypes块、signingConfigs块还有其他的配置块,这里列举一些:

build.gradle配置文件详解_第11张图片

dependencies块

dependencies 块用于配置该module构建过程中所依赖的所有库。Gradle插件3.4版本新增了api和implementation来代替compile配置依赖,其中api和此前的 compile是一样的。dependencies和api主要以下的区别:
implementation:可以让module在编译时隐藏自己使用的依赖,但是在运行时这个依赖对所有模块是可见的。而api与compile一样,无法隐藏自己使用的依赖。
如果使用api,一个module发生变化,这条依赖链上所有的module都需要重新编译,而使用implemention,只有直接依赖这个module需要重新编译。

settings.gradle

Settings

build.gradle里面的配置和方法调用委托的是Project对象,同样是构建脚本的settings.gradle里面的配置和方法调用委托的是Settings对象。
在Gradle构建时会创建一个Settings实例,并根据它执行设置文件。Settings实例和settings.gradle文件是一对一的对应关系。
Settings:声明实例化和配置参与构建Project实例的层次结构所需的配置。

项目管理

Gradle支持单项目或多项目构建:
单项目构建,settings.gradle文件是可选的;
多项目构建,settings.gradle文件是必需的,且必须位于项目的根目录下;
多项目构建的settings.gradle文件:

build.gradle配置文件详解_第12张图片

目录:

build.gradle配置文件详解_第13张图片

核心是include,表示给指定的项目添加到构建中,它可以指向我们项目包含的module路径,也可以指向硬盘中子项目的绝对路径,这在项目aar和源码切换的时候非常方便,也是编译提速的重要手段之一。

插件管理

settings.gradle除了管理项目之外,另一个比较重要的就是管理插件(Plugin),即pluginManagement


插件仓库


pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
}
在pluginManagement中,repositories指定了插件所需要的下载仓库地址。如果自定义的插件发布在私有仓库,就需要在这里加上私有仓库的地址才可以找到你的插件。

插件替换

pluginManagement配置是由PluginManagementSpec接口类解析的,其下有5个方法:

build.gradle配置文件详解_第14张图片

includeBuild方法需要在7.0版本之后才可用

 Configuration (配置)

在 Configuration (配置) 阶段,Gradle会评估构建项目中包含的所有构建脚本,随后应用插件、使用DSL配置构建,并在最后注册Task,同时惰性注册它们的输入,因为并不一定会执行。
注意:无论请求执行哪个Task,配置阶段都会执行。所以为了保持构建简洁高效,要避免在配置阶段执行任何耗时操作,类似android里面的onDraw方法。
简单的说,配置阶段就是创建Projec对象,执行我们的build.gradle文件,根据代码创建对应的Task依赖关系图。

Project

Gradle构建时,会根据Settings对象解析出来的项目结构为每个项目都创建一个Project对象,Project对象和build.gradle文件之间存在一对一的关系。
在Gradle生成Task依赖关系图之前,Project对象还做了几件事:
引入插件
配置属性
编译依赖

引入插件

plugins {
    id 'com.android.application'
}

plugins是Project对象的一个方法,用于设置当前模块所使用的插件。

配置属性

android {
    compileSdk 34
    defaultConfig {
        applicationId "com.lcb.myapp"
        minSdk 31
        targetSdk 34
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

前文我们分析过android { } 配置的源码,android { } 配置实际是 id 'com.android.application' 插件的DSL配置,也就是说我们在build.gradle中所有的配置其实都是通过DSL对插件的配置,这些配置会影响插件的执行,从而影响整个构建流程。

编译依赖

dependencies {
    implementation 'androidx.appcompat:appcompat:1.3.0'
    implementation 'com.google.android.material:material:1.4.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

dependencies { } 里面除了官方库之外,我们还经常在里面添加所需要的三方库,比如okhttp、glide等等。

模块自有的三方依赖可以直接在build.gradle中添加仓库下载地址:

等同于7.0之前的subprojects { },settings.gradle中的dependencyResolutionManagement>repositories等同于7.0之前的allprojects { } 。
前文【Gradle-2】一文搞懂Gradle配置(https://juejin.cn/post/7160337743552675847#heading-48)中漏了一点dependencyResolutionManagement里面的repositoriesMode,即Gradle对于allprojects { } 和subprojects { }中的依赖解析策略

build.gradle配置文件详解_第15张图片

repositoriesMode:
PREFER_PROJECT:默认值,优先使用build.gradle中的repositories { },忽略settings.gradle中的repositories { } ;
PREFER_SETTINGS:优先settings.gradle中的repositories { } ,忽略build.gradle中的repositories { };
FAIL_ON_PROJECT_REPOS:这个厉害了,表示在build.gradle中声明的repositories { }会导致编译错误;
如果只有app模块,可以把仓库地址都写在dependencyResolutionManagement>repositories里面,如果有多个模块,且依赖差别很大,还是建议分开写,毕竟从仓库找依赖也是耗时的,虽然并不是编译痛点...(可忽略)
当然Project对象也不止干这些事,通用来讲是这样,但你也可能有一些额外的配置,比如发布publishing等

 详情参考:Gradle的生命周期_Android技术之家的博客-CSDN博客

repositories 

repositories是project一个方法,闭包作为参数

这个是用来指定使用什么库的,它可以存在buildScript块、allprojects块、根级别块。

buildScript块的repositories主要是为了Gradle脚本自身的执行,获取脚本依赖插件。

根级别的repositories主要是为了当前项目提供所需依赖包,比如log4j、spring-core等依赖包可从mavenCentral仓库获得。

allprojects块的repositories用于多项目构建,为所有项目提供共同所需依赖包。而子项目可以配置自己的repositories以获取自己独需的依赖包。

gradle中的常用属性可以写在gradle.properties中
一个gradle文件中的属性有很多,比如 jdk版本,编码类型,dependency 版本。如果都放在 build.gradle 中势必不好管理哦(经验哦),那么gradle默认提供了一个 gradle.properties 文件。用这个文件来管理所有的属性在合适不过了

插件是不对外的,存在某个私有仓库的,该如何修改或者添加额外的私有仓库地址

build.gradle配置文件详解_第16张图片

使用老的方式应用插件:

build.gradle配置文件详解_第17张图片

build.gradle配置文件详解_第18张图片

你可能感兴趣的:(android,studio)