gradle build.gradle解析

1. 根节点的build.gradle详解

build.gradle文件内容

// buildScript gradle的构建脚本
buildscript {
    repositories {
        google()
        mavenCentral()
        jcenter()
        maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
    }
    /*
    	dependencies 声明下载所需要的依赖,类似maven工程pom.xml中
		  
		    
		      com.android.tools.build
		      gradle
		      4.2.2
		     
		  
    */  
    dependencies {
    	// 指定gradle插件版本
        classpath "com.android.tools.build:gradle:4.2.2"
    }
}

// allprojects是对所有的项目配置
allprojects {
    repositories {
        google()
        mavenCentral()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}


1.1 buildScript

buildscript中的声明是gradle脚本自身需要使用的资源。可以声明的资源包括依赖项、第三方插件、maven仓库地址等

而在build.gradle文件中直接声明的依赖项、仓库地址等信息是项目自身需要的资源。

gradle在执行脚本时,会优先执行buildscript代码块中的内容,然后才会执行剩余的build脚本。

1.1.1 repositories

代表仓库地址,常见参数:

  • google()
    Google官方依赖存储库
  • mavencentral()
    由sonatype.org维护的Maven仓库
  • jcenter()
    由 bintray.com维护的Maven仓库
  • maven { url ‘http://maven.aliyun.com/nexus/content/groups/public/’ }
    手动指定Maven仓库地址

JCenter() 与 mavenCenter()在完全不同的服务器上维护,由不同的人提供内容,两者之间毫无关系。在jcenter上有的可能 Maven Central 上没有,反之亦然

1.1.2 dependcies

dependices闭包代表声明下载所需要的依赖,类似maven工程pom.xml中 标签

		  <dependencies>
		    <dependency>
		      <groupId>com.android.tools.buildgroupId>
		      <artifactId>gradleartifactId>
		      <version>4.2.2version>
		     dependency>
		  dependencies>

依赖配置:

  • classpath
    添加 buildscript 本身需要的依赖。
  • implementation
    一般是在在模块中的build.gradle中,dependencies 中添加的使应用程序所需要的依赖包,也就是项目运行所需要的东西

1.2 allprojects

是对所有项目声明的配置。

1.2.1 repositories

声明所有项目声明的依赖仓库。和buildScript中意思相同。

2.模块build.gradle解析

plugins {
    id 'com.android.application'
}
// 自定义配置的入口
android {
    compileSdkVersion 33  // 编译Android工程的SDK版本
    buildToolsVersion "33.0.0" // 构建Android工程所用的构建工具版本

    defaultConfig {
        applicationId "com.example.gradle_lifecycle"
        minSdkVersion 21
        targetSdkVersion 33
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
	// 构建类型
    buildTypes {
        release {
            minifyEnabled false //是否启用混淆
            // 混淆文件
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

// 该项目所需要的依赖
dependencies {
	// implemengtation 添加的使应用程序所需要的依赖包
    implementation 'androidx.appcompat:appcompat:1.5.1'
    // Dependency on a local library module
    implementation project(':mylibrary')
    // Dependency on local binaries
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

2.1 plugin

一般有两种值可选:

  • com.android.application
    表示这是一个应用程序模块。可以直接运行。
  • com.android.library
    表示这是一个库模块,只能作为代码库依附于别的应用程序模块来运行。

高低版本使用插件的两种方式

1. 高版本plugins方式:

必须在Top Level(父项目或子项目的gradle.build顶级),直接使用:

plugins{
     id 'com.android.application'
}

plugins{}这种引入插件的方式更简单些,但是引入的插件得是Gradle官方有得才行。参考Gradle官方插件库

2. 遗留版本的apply方式

与buildscript结合

先解析再使用

buildscript {
   ...
//    此处引入插件
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:2.2.2.RELEASE")
    }
}
// 使用apply(本意就有使用的意思)
apply plugin: 'org.springframework.boot' 

在父项目中指定了插件的情况下(父项目中使用了plugins或者buildscript+apply),此时,可以直接在子项目中直接使用apply

2.2 android

android{}是Android Gradle插件提供的一个扩展类型,可以让我们自定义Android Gradle工程。

compileSdkVersion

编译Android工程的SDK版本

buildToolsVersion “23.0.1”

构建Android工程所用的构建工具版本

defaultConfig

defaultConfig{}是默认的配置,是一个ProductFlavor(构建渠道),ProductFlavor允许我们根据不同的情况同时生成不同的APK包。

defaultConfig闭包可以对项目的更多细节进行配置。

  • applicationId
    应用ID,在Android设备和市场上,这个ID是你应用的唯一标识。
    不是包名,默认和包名一致。区别→参考:Android中app的applicationId和包名的区别

  • midSdkVersion
    用于指定项目最低兼容的Android系统版本。midSdkVersion 21对应Android 5.0。表示安装应用程序的手机系统的版本必须要>=5.0

  • targetSdkVersion
    APP所使用这个所设定的版本及该版本前的所有特性。如果设置为22,那么23以及23以后的所有新特性、新功能和API新行为统统无视;只认识22以及22之前提供的功能和API行为。

    例如:
    需求:app要支持Android SDK 4,并且能够使用手势。
    这个时候,就需要将minSdkVersion 设置为4,targetSdkVersion设置为7。因为手势实在Android SDK 7才引入的功能
    minSdkVersion :4
    targetSdkVersion:7
    开发的APP中,要使用手势功能,手势功能在android SDK7的版本才引入的。这个时候,就可以将targetSdkVersion设置为7。

  • versionCode
    App应用内部版本名称,自己看的,用来给设备程序识别版本。

  • versionName
    APP应用的版本名称。展示给消费者的版本号,代表应用程序的版本信息。

buildTypes

构建类型,buildTypes{}是一个NamedDomainObjectContainer类型,是一个域对象,可以在buildTypes{}里新增任意多个我们需要构建的类型,比如debug类型、release类型。

dependcies

依赖项配置(只介绍常见的)

compile

Gradle 会将依赖项添加到编译类路径和 build 输出,并将依赖项导出到其他模块。此配置已废弃

implementation

与compile对应。Gradle 会将依赖项添加到编译类路径,并将依赖项打包到构建输出。不过,当您的模块配置 implementation 依赖项时,会让 Gradle 了解您不希望该模块在编译时将该依赖项泄露给其他模块。也就是说,其他模块只有在运行时才能使用该依赖项

implementation
定义项目主源代码(main目录)的依赖

implementation包含三种不同类型的依赖项:

  • 本地库模块依赖项
implementation project(':mylibrary'

这声明了对一个名为“mylibrary”**(此名称必须与您的 settings.gradle 文件中使用 include: 定义的库名称相符)**的 Android 库模块的依赖关系。 在构建您的应用时,构建系统会编译该库模块,并将生成的编译内容打包到应用中。

  • 本地二进制文件依赖项
 // *.jar 代表所有后缀为.jar的文件
 implementation fileTree(dir: 'libs', include: ['*.jar'])
 // 也可以按如下方式指定各个文件
 implementation files('libs/foo.jar', 'libs/bar.jar')

Gradle 声明了对项目的 module_name/libs/ 目录中 JAR 文件的依赖关系(因为 Gradle 会读取 build.gradle 文件的相对路径)。

  • 远程二进制文件依赖项
// 正常形式
implementation 'com.example.android:app-magic:12.3'

// 完整写法 声明了对“com.example.android”命名空间组内的 12.3 版“app-magic”库的依赖关系。
implementation group: 'com.example.android', name: 'app-magic', version: '12.3'

注意:此类远程依赖项要求您声明 Gradle 应在其中查找库的相应远程仓库。如果本地不存在相应的库,那么当 build 需要它时(例如,当您点击 Sync Project with Gradle Files 图标 或运行 build 时),Gradle 会从远程站点提取它。

api

与compile对应,Gradle 会将依赖项添加到编译类路径和构建输出。当一个模块包含 api 依赖项时,会让 Gradle 了解该模块要以传递方式将该依赖项导出到其他模块,以便这些模块在运行时和编译时都可以使用该依赖。也就是会泄漏一些不应该不使用的实现。举个例子,A依赖B,B依赖C,如果都是使用api配置的话,A可以直接使用C中的类(编译时和运行时),而如果是使用implementation配置的话,在编译时,A是无法访问C中的类的

compileOnly

Gradle 只会将依赖项添加到编译类路径(也就是说,不会将其添加到构建输出)。如果您创建 Android 模块时在编译期间需要相应依赖项,但它在运行时可有可无,此配置会很有用

testImplementation

用于指定在项目测试代码(test目录下的代码)的依赖

androidTestImplementation

用于指定在androidTest目录下的依赖

annotationProcessor

用于注解处理器的依赖配置

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