Android知识-Gradle的相关知识

Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。基于JVM的构建工具,是一款通用灵活的构建工具,支持maven, Ivy仓库,支持传递性依赖管理,而不需要远程仓库或者是pom.xml和ivy.xml配置文件,基于Groovy,build脚本使用Groovy编写。接下来介绍一下android项目中gradle文件。

1.首先先从gradle-wrapper文件讲起,Wrapper是对Gradle的一层包装,便于在团队开发过程中统一Gradle构建的版本号,这样大家都可以使用统一的Gradle版本进行构建。里面的内容信息分别是

// 下载的Gradle压缩包解压后的主目录
distributionBase=GRADLE_USER_HOME
// 相对于distributionBase的解压后的压缩包的路劲
distributionPath=wrapper/dists
// 同distributionBase,只不过存放着zip压缩包
zipStoreBase=GRADLE_USER_HOME
// 同distributionPath,只不过存放着zip压缩包
zipStorePath=wrapper/dists
// Gradle发行版压缩包的下载地址
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip
distributionUrl一般下载后文件会存在下列的文件中

Android知识-Gradle的相关知识_第1张图片
这个就是gradle-wrapper的全部内容,有时候如果遇到下载gradle很慢的话可以直接用本地所有的,这样可以极大的节约时间

2.介绍完gradle-wrapper接着介绍一下settings.gradle,主要是用于初始化及工程树的配置,存放与根目录之下,设置文件大多数的作用都是为了配置自工程。在Gradle众多工程是通过工程树表示的,相当于我们在Android Studio看到的Project和Module概念一样。根工程相当于Android Studio的Project,一个根工程可以有很多自工程,也就是很多Module,这样就和Android Studio定义的Module概念对应上了。
在这里插入图片描述
例如这个工程就添加了一个module

3.接下来开始介绍Project的build.gradle,这个直接上代码说明

// buildscript中的声明是gradle脚本自身需要使用的资源。可以声明的资源包括依赖项、第三方插件、maven仓库地址等
// 需要注意的是buildscript中的声明是gradle脚本自身需要使用的资源,而allprojects声明的却是你所有module所需要使用的资源,
// 就是说如果你的每个module都需要用同一个第三库的时候,你可以在allprojects里面声明。
buildscript {
    // 顾名思义就是仓库的意思,而jcenter()、maven()和google()就是托管第三方插件的平台,例如我这里就添加了google()和jcenter()
    repositories {
        google()
        jcenter()
    }
    // 除了配置仓库之外,我们还需要在dependencies里面配置,把需要配置的依赖用classpath配置上,也代表着是Gradle需要的插件
    dependencies {
        classpath 'com.android.tools.build:gradle:3.3.2'
    }
}
// allprojects块的repositories用于多项目构建,为所有项目提供共同所需依赖包。而子项目可以配置自己的repositories以获取自己独需的依赖包。
allprojects {
    repositories {
        google()
        jcenter()
    }
}
// 如果运行gradle clean,则执行此处定义的task。该任务继承自Delete,删除根目录中的build目录。
// 相当于执行Delete.delete(rootProject.buildDir)。其实这个任务的执行就是可以删除生成的Build文件的,跟Android Studio的clean是一个道理。
task clean(type: Delete) {
    delete rootProject.buildDir
}

4.介绍完(Project)的build.gradle接下来介绍一下module下的buil.gradle,也是直接贴代码,如下:

// apply 引入Gradle插件,而 Gradle 插件大致分为分为两种:
// apply plugin:'×××':叫做二进制插件,二进制插件一般都是被打包在一个jar里独立发布的,
// 比如我们自定义的插件,再发布的时候我们也可以为其指定plugin id,
// 这个plugin id最好是一个全限定名称,就像你的包名一样;
// Android Gradle插件的分类其实是根据Android工程的属性分类的。
// 在Andriod中有3类工程,
// 一类是App应用工程,工程名是 com.android.application. ,它可以生成一个可运行的apk应用:
// 一类是Library库工程,工程名是 com.android.library. ,它可以生成AAR包给其他的App工程公用,就和我们的Jar一样,但是它包含了Android的资源等信息,是一个特殊的Jar包;
// 最后一类是Test测试工程,工程名是 com.android.test. ,用于对App工程或者Library库工程进行单元测试。


// apply from:'×××':叫做应用脚本插件,其实这不能算一个插件,它只是一个脚本。
// 应用脚本插件,其实就是把这个脚本加载进来,和二进制插件不同的是它使用的是from关键字.
// 后面紧跟的坫一个脚本文件,可以是本地的,也可以是网络存在的,如果是网络上的话要使用HTTP URL.
// 虽然不是一个真正的插件,但是不能忽视它的作用.它是脚本文件模块化的基础,我们可以把庞大的脚本文件.
// 进行分块、分段整理.拆分成一个个共用、职责分明的文件,然后使用apply from来引用它们
apply plugin: 'com.android.application'
apply from:'config.gradle'

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

    // 编译所依赖的Android SDK的版本,这里是API 28。
    compileSdkVersion sdkVersion
    // defaultConfig是默认的配置,它是一个ProductFlavor。ProductFlavor允许我们根据不同的情况同时生成多个不同的apk包。
    defaultConfig {
        // 配置我们的包名,包名是app的唯一标识,其实他跟AndroidManifest里面的package是可以不同的,他们之间并没有直接的关系。
        //package指的是代码目录下路径;applicationId指的是app对外发布的唯一标识,会在签名、申请第三方库、发布时候用到。
        applicationId "${apkName}"
        // 支持的Android系统的api level,这里是15,也就是说低于Android 15版本的机型不能使用这个app。
        minSdkVersion 15
        // 表明我们是基于哪个Android版本开发的,这里是28
        targetSdkVersion sdkVersion
        // 表明我们的app应用内部版本号,一般用于控制app升级,当然我在使用的bugly自动升级能不能接受到升级推送就是基于这个。
        versionCode versionCode
        // 表明我们的app应用的版本名称,一般是发布的时候写在app上告诉用户的
        versionName "${versionName}"
        // 用于配置该BuildType是否启用自动拆分多个Dex的功能。一般用程序中代码太多,超过了65535个方法的时候。
        multiDexEnabled true
        // 多平台编译,生成有so包的时候使用,包括四个平台'armeabi', 'x86', 'armeabi-v7a', 'mips'。一般使用第三方提供的SDK的时候,可能会附带so库。
        ndk {
            abiFilters "armeabi","x86"
        }
    }
    // 源代码集合,是Java插件用来描述和管理源代码及资源的一个抽象概念,是一个Java源代码文件和资源文件的集合,
    // 我们可以通过sourceSets更改源集的Java目录或者资源目录等。
    // 如下就是告诉了Gradle我的关于jni so包的存放路径就在app/libs上了,叫他编译的时候自己去找
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
    // 签名文件的配置
    signingConfigs {
        release {
            // 签名文件的存放地址
            storeFile file('D:/project/xxxx/xxxx.jks')
            // 签名证书文件的密码
            storePassword '密码'
            // 签名证书中秘钥别名
            keyAlias 'key文件名'
            // 签名证书中改密钥的密码
            keyPassword 'key密码'
        }
    }
    buildTypes {
        release {
            // 是否开启混淆,默认不混淆
            minifyEnabled true
            // 是否使用zipAlign工具压缩
            zipAlignEnabled true
            // 是否去除未利用的资源,默认false,表示不去除。需要开启了混淆才可以使用
            shrinkResources true
            // 混淆文件
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfigs.release
        }
        // debug模式的签名已经被配置好了,使用的就是Android SDK自动生成的debug证书,
        // 它一般位于$HOME/.android/debug.keystore,其key和密码是已经知道的
        // 不过有时候为了开发调试的方便我们会重新配置debug模式的签名
        debug {
            signingConfigs.release
        }
    }
    // Gradle的多渠道打包,你可以在不同的包定义不同的变量,实现自己的定制化版本的需求。
    productFlavors {

    }
}

dependencies {
    // 第一句implementation fileTree(include: ['*.jar'], dir: 'libs'),这样配置之后本地libs文件夹下的扩展名为jar的都会被依赖,非常方便。
    // 如果要引入某个本地module的话,那么需要用implementation project('×××')。
    // 如果引入网上仓库里面的依赖,我们需要这样写 implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:+'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
}

你可能感兴趣的:(Android,Gradle)