学新通技术网

【Gradle 学习】(五)Android 中的 Gradle 配置介绍

juejin 9 1
【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 进行配置,主要有三个重要的代码块:pluginandroiddependencies

# 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 的入口点。

默认情况下,只有 compileSdkVersionbuildtoolsVersion 这两个属性是必须的。

compileSdkVersion & buildToolsVersion

  • compileSdkVersion: 基于哪个 SDK 编译,这里的 Version 是 API LEVEL,是21
  • buildToolsVersion: 基于哪个构建工具版本进行构建的

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 的目录结构说明了相关构建文件的组成,这里只是学习了基本的框架,在项目的使用中会有更多扩展配置应用,比如默认配置项、签名、构建类型、产品定制等,这些就放在后面继续学习吧。

本文出至:学新通技术网

标签: