您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Gradle 配置详解

前面我们一起学习了 Groovy 语言的语法基础,再由浅入深从 Gradle 的环境变量配置,到创建简单的 Gradle 项目。今天这节课我们为大家介绍一下 Android 项目中 Gradle 的配置。

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

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

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

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

// Top-level build file where you can add conuration 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 的,也就是顶级构建的。下面来分开讲解一下每个闭包:

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

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

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

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

buildscript {
    repositories {  //注释1
        maven { 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 { //注释2
        maven { 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 库。

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

这个我们直接看吧:

//注释1
apply plugin: 'com.android.application'
//注释2
android {
    compileSdkVersion 
    buildToolsVersion "29.0.2"
    defaultCon {
        applicationId "com.bthvi.myuiapplication"
        minSdkVersion 
        targetSdkVersion 
        versionCode 
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled @H__360@false
            proguardFiles 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分别对应如下三个语句和闭包:

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

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

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

下面我们详细介绍下:

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

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

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

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

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

    //签名
    signingCons {
        //你自己的keystore信息
        releaseCon {
            storeFile file(rootProject.ext.store_file)
            storePassword rootProject.ext.store_password
            keyAlias rootProject.ext.key_alias
            keyPassword rootProject.ext.key_password
            v1SigningEnabled @H__360@true
            v2SigningEnabled @H__360@true
        }
    }

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

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

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

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

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

#Sat Nov  :: CST 
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-.-all.zip

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

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

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

# Project-wide Gradle settings.
# IDE (e.g. Android Stu) users:
# Gradle settings conured through the IDE *will override*
# any settings specified in this file.
# For more details on how to conure 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 conured, 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=@H__360@true

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

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

# Project-wide Gradle settings.
# IDE (e.g. Android Stu) users:
# Gradle settings conured through the IDE *will override*
# any settings specified in this file.
# For more details on how to conure 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-
# 提高AndroidStu的并发性,使Gradle独立运行。
org.gradle.parallel=@H__360@true
org.gradle.daemon=@H__360@true

这两个其实就是 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 命令为例,我们只需要在 AndroidStu下输入如下命令:

//Windows系统
gradlew clean

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

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

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

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


联系我
置顶