Gradle简介

Google 推荐使用的 Android Studio采用 Gradle 来构建项目。Gradle 是一个非常先进的项目构建工具。

一、Gradle

Gradle 是用了一种基于 Groovy 的领域特定语言(DSL,Domain Specific Language)来声明项目设置,摒弃了 XML(如 ANT 和 Maven)的各种繁琐配置。 

我们通过Android Studio创建的项目中,一般会出现1个settings.gradle和2个或者多个build.gradle 文件,

在Project视图模式下,一个在根目录下,一个在 app 目录下。

如果切换到Android视图模式下则全部在Gradle Scripts。
         
Project视图模式                                                       Android视图模式

 1、settings.gradle

这个 settings.gradle文件定义了哪些module 应该被加入到编译过程,对于单个module 的项目可以不用需要这个文件,但是对于 multimodule 的项目我们就需要这个文件,否则gradle 不知道要加载哪些项目。这个文件的代码在初始化阶段就会被执行。

rootProject.name='ActivityTest'
include ':app'

2、根目录下的 build.gradle

(1)repositories 闭包,声明了 jcenter() 的配置。那么这个jcenter是什么意思呢?其实它是一个代码托管仓库,

很多Android 开源项目都会选择将代码托管到jcenter上,声明了这行配置之后,我们就可以在项目中轻松引用任何jcenter上的开源项目了;

(2)dependencies 闭包,使用classpath声明了一个 Gradle 插件。 为什么要声明这个插件呢?因为Gradle并不是专广门为构建Android项目而开发的,Java、 C++等很多种项目都可以使用Gradle来构建。

因此如果我们要想使用它来构建Android项目,则需要声明com.android.tools.build:gradle:3.6.1这个插件。

其中,最后面的部分是插件的版本号,也就是AndroidStudio的版本的版本号,目前使用的AndroidStudio的版本是3.6.1。

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    
    repositories {
        google()
        jcenter()
        
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.6.1'
        

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        
    }
}

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

3、app 目录下的build.gradle

这个文件中的内容就要相对复杂一些了,下面我们一行行地进行分析。

(1)apply plugin,声明是 Android 应用程序还是库模块,有两种值可选:

  • com..android.application:表示这是一个应用程序模块;
  • com.android.library:表示这是一个库模块。

应用程序模块和库模块的最大区别在于,一个是可以直接运行的,一个只能作为代码库依附于别的应用程序模块来运行。

(2)android 闭包,配置构建项目的各种属性

  • compileSDKVersion:用于指定项目的编译 SDK 版本;
  • buildToolsVersion:用户指定项目构建工具的版本,如果有更新的版本时,Android Studio会进行提示;
  • defaultConfig闭包:默认配置:
    • applicationId 用于指定项目的包名,前面我们在创建项目的时候其实已经指定过包名了,如果你想在后面对其进行修改,那么就是在这里修改的;
    • minSdkVersion用于指定项目最低兼容的Android 系统版本,这里指定成15 表示最低兼容到Android 4.0系统;
    • targetSdkVersion 指定的值表示你在该目标版本上已经做过了充分的测试,系统将会为你的应用程序启用一些最新的功能和特性。比如说Android 6.0系统中引入了运行时权限这个功能,如果你将targetSdkVersion指定成23或者更高,那么系统就会为你的程序启用运行时权限功能,而如果你将targetSdkVersion指定成22,那么就说明你的程序最高只在Android5.1系统上做过充分的测试,Android 6.0系统中引人的新功能自然就不会启用了;
    • versionCode 用于指定项目的版本号;
    • versionName 用于指定项目的版本名,这两个属性在生成安装文件的时候非常重要,我们在后面都会学到;
  • buildTypes闭包:指定生成安装文件的配置,通常只会有两个子闭包,一个是debug,一个是release。 debug闭包用于指定生成测试版安装文件的配置,release闭包用于指定生成正式版安装文件的配置。另外,debug闭包是可以忽略不写的,因此我们看到上面的代码中就只有一个release闭包。下面来看一下release闭包中的具体内容吧,minifyEnabled用于指定是否对项目的代码进行混淆,true 表示混淆,false表示不混淆。proguardFiles 用于指定混淆时使用的规则文件,这里指定了两个文件,第一个proguard-android-optimize.txt是在Android SDK目录下的,里面是所有项目通用的混淆规则,第二个proguard-rules.pro是在当前项目的根目录下的,里面可以编写当前项目特有的混淆规则。需要注意的是,通过Android Studio直接运行项目生成的都是测试版安装文件,关于如何生成正式版安装文件我们将会在以后学习。

(3)dependencies 闭包,这个闭包的功能非常强大,它可以指定当前项目所有的依赖关系。

通常Android Studio项目一共有3种依赖方式:本地依赖、库依赖和远程依赖。

本地依赖可以对本地的Jar包或目录添加依赖关系,库依赖可以对项目中的库模块添加依赖关系,远程依赖则可以对jcenter库上的开源项目添加依赖关系。

apply plugin: 'com.android.application'

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.2"

    defaultConfig {
        applicationId "com.sdbi.activitytest"
        minSdkVersion 22
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation 'androidx.appcompat:appcompat:1.1.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

 

 二、Gradle Wrapper

wrapper的意思是“包装”,这是gradle包装。其实是这样的,因为gradle处于快速迭代阶段,经常发布新版本,如果我们的项目直接去引用,那么更改版本等会变得无比麻烦。

而且每个项目又有可能用不一样的gradle版本,这样去手动配置每一个项目对应的gradle版本就会变得麻烦,gradle的引入本来就是想让大家构建项目变得轻松,如果这样的话,

岂不是又增加了新的麻烦?所以android想到了包装,引入gradle-wrapper,通过读取配置文件中gradle的版本,为每个项目自动的下载和配置gradle,就是这么简单。

这样我们就不用关心如何去下载gradle,如何去配置进项目来。

Gradle 会根据build 文件的配置生成不同的task,我们可以直接单独执行每一个task。通过./gradlew tasks列出所有task。

如果通过同时还想列出每个task 对应依赖的其他task,可以使用./gradlew tasks -all。

其实每当我们在Android Studio点击 build、rebuild、clean菜单的时候,执行的就是一些gradle task.

Android tasks

 有四个基本的 task,Android 继承他们分别进行了自己的实现:

(1)assemble:对所有的 buildType 生成 apk 包。

(2)clean:移除所有的编译输出文件,比如apk

(3)check:执行lint检测编译。

(4)build:同时执行assemble和check命令

这些都是基本的命令,在实际项目中会根据不同的配置,会对这些task 设置不同的依赖。比如,默认的 assmeble 会依赖 assembleDebug 和assembleRelease,

如果直接执行assmeble,最后会编译debug,和release 的所有版本出来。如果我们只需要编译debug 版本,我们可以运行assembleDebug。

除此之外还有一些常用的新增的其他命令,比如 install命令,会将编译后的apk 安装到连接的设备。

(5)install:将编译后的apk 安装到连接的设备

(6)uninstall:卸载apk

posted @ 2020-03-08 19:40  熊猫Panda先生  阅读(642)  评论(0编辑  收藏  举报