美文网首页安卓开发博客
【andorid】gradle相关知识点总结

【andorid】gradle相关知识点总结

作者: 当时不是寻常 | 来源:发表于2017-12-05 17:05 被阅读453次

    0、看一下基本配置的意思

    // Top-level build file where you can add configuration options common to all sub-projects/modules.
     
    buildscript {
        //构建过程依赖的仓库
        repositories {
        jcenter()
    }
    //构建过程需要依赖的库
    dependencies {
         //下面声明的是gradle插件的版本
         classpath 'com.android.tools.build:gradle:1.1.0'
         // NOTE: Do not place your application dependencies here; they belong
         // in the individual module build.gradle files
    }
    }
    //这里面配置整个项目依赖的仓库,这样每个module就不用配置仓库了
    allprojects {
         repositories {
              jcenter()
         }
    }
    

    注:大家可能很奇怪,为什么仓库repositories需要声明两次,这其实是由于它们作用不同,buildscript中的仓库是gradle脚本自身需要的资源,而allprojects下的仓库是项目所有模块需要的资源。所以大家千万不要配错了。

    //声明插件,这是一个android程序,如果是android库,应该是com.android.library
    apply plugin: 'com.android.application'
    android {
         //安卓构建过程需要配置的参数
         compileSdkVersion 21//编译版本
         buildToolsVersion "21.1.2"//buildtool版本
    
         defaultConfig {//默认配置,会同时应用到debug和release版本上
         applicationId "com.taobao.startupanim"//包名
         minSdkVersion 15
         targetSdkVersion 21
         versionCode 1
         versionName "1.0"
     }
     buildTypes {
         //这里面可以配置debug和release版本的一些参数,比如混淆、签名配置等
         release {
             //release版本
             minifyEnabled false//是否开启混淆
             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//混淆文件位置
         }
     }
    }
    dependencies {
         //模块依赖
         compile fileTree(dir: 'libs', include: ['*.jar'])//依赖libs目录下所有jar包
         compile 'com.android.support:appcompat-v7:21.0.3'//依赖appcompat库
    }
    

    defaultConfig中是一些基本配置,它会同时应用到debug/release版本上。buildTypes结点很重要,这里可以配置构建的版本的一些参数,默认有两个构建版本release/debug,当然你可以自定义一个构建版本,比如叫foo,然后通过gradlew assembleFoo就可以生成对应的apk了。

    1、IDE创建好,要了解默认的Android工程有哪些task,可以运行一下指令:

    gradle task [--all]
    

    2、常用配置

    apply plugin: 'com.android.application'
    android {
        compileSdkVersion 23 // 编译sdk版本
        buildToolsVersion "23.0.2" // 构建工具版本
    
        defaultConfig {
            applicationId "com.yuqirong.koku" // 应用包名
            minSdkVersion 15 // 最低适用sdk版本
            targetSdkVersion 23 // 目标sdk版本
            versionCode 1 // 版本号
            versionName "1.0" // 版本名称
        }
        buildTypes {
            release {
                minifyEnabled true // 开启混淆
                zipAlignEnabled true // 对齐zip
                shrinkResources false // 删除无用资源
                debuggable false // 是否debug
                versionNameSuffix "_release" // 版本命名后缀
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' // 混淆文件
            }
    
            debug {
                zipAlignEnabled false
                shrinkResources false
                minifyEnabled false
                versionNameSuffix "_debug"
                signingConfig signingConfigs.debug
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        testCompile 'junit:junit:4.12'
        compile 'com.android.support:appcompat-v7:23.2.1'
        compile 'com.android.support:design:23.2.1'
    }
    

    3、签名配置

    signingConfigs {
        
        release { // 正式版本的签名
            storeFile file("../koku.jks") // 密钥文件位置
            storePassword "xxxxxxxxx" // 密钥密码
            keyAlias "koku" // 密钥别名
            keyPassword "xxxxxxxxx" // 别名密码
        }
        
        debug { // debug版本的签名
            // no keystore
        }
    }
    

    使用时只要在 buildTypes 的 release 中加一句 signingConfig signingConfigs.release 就好了。

    如果你觉得把密钥密码和别名密码放在 app/build.gradle 里不安全,那么可以把相关密码放到不加入版本控制系统的 gradle.properties 文件:

    KEYSTORE_PASSWORD=xxxxxxxxxx
    KEY_PASSWORD=xxxxxxxxx
    

    对应的 signingConfigs 配置:

    signingConfigs {
        release {
            try {
                storeFile file("../koku.jks")
                storePassword KEYSTORE_PASSWORD
                keyAlias "koku"
                keyPassword KEY_PASSWORD
            }catch (ex) {
                throw new InvalidUserDataException("You should define KEYSTORE_PASSWORD and KEY_PASSWORD in gradle.properties.")
            }
        }
    }
    

    4、Java 编译版本配置:

    compileOptions { // java 版本
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    

    这里需要注意下,如果 Java 编译版本为1.8的话,另外在 defaultConfig 里要配置 Jack 编译器:

    jackOptions {
        enabled true
    }
    

    5、Lint 检查配置:

    lintOptions {
        abortOnError false // 是否忽略lint报错
    }
    

    6、多渠道信息配置:

    productFlavors {
        xiaomi {}
        googleplay {}
        wandoujia {}
    }
    

    7、如何自定义配置文件。为了方便管理,可以在根目录下新建 config.gradle 文件

    root
      --module1
        --build.gradle
      --module2
        --build.gradle
      ...
      --build.gradle
      --config.gradle
    

    在 config.gradle 中添加如下代码(具体情况根据自己项目来定):

    ext {
        android = [
                compileSdkVersion: 23,
                buildToolsVersion: "24.0.0 rc1",
                applicationId    : "com.sivan.rxretrofitdemo",
                minSdkVersion    : 16,
                targetSdkVersion : 23,
                versionCode      : 1,
                versionName      : "1.0"
        ]
    
        dependencies = [
                "appcompat-v7"       : "com.android.support:appcompat-v7:23.3.0",
                "rxjava"             : "io.reactivex:rxjava:1.1.3",
                "rxandroid"          : "io.reactivex:rxandroid:1.1.0",
                "retrofit"           : "com.squareup.retrofit2:retrofit:2.0.0-beta4",
                "gson"               : "com.google.code.gson:gson:2.6.2",
                "converter-gson"     : "com.squareup.retrofit2:converter-gson:2.0.0-beta4",
                "adapter-rxjava"     : "com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4",
                "butterknife"        : "com.jakewharton:butterknife:7.0.1",
                "logging-interceptor": "com.squareup.okhttp3:logging-interceptor:3.0.1"
        ]
    }
    

    在 root 目录下的build.gradle 中加上apply from: "config.gradle"

    image.png
    • android 节点的使用
    android {
        compileSdkVersion rootProject.ext.android.compileSdkVersion
        buildToolsVersion rootProject.ext.android.buildToolsVersion
    
        defaultConfig {
            applicationId rootProject.ext.android.applicationId
            minSdkVersion rootProject.ext.android.minSdkVersion
            targetSdkVersion rootProject.ext.android.targetSdkVersion
            versionCode rootProject.ext.android.versionCode
            versionName rootProject.ext.android.versionName
        }
    
    }
    
    • dependencies 节点的使用
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile rootProject.ext.dependencies["appcompat-v7"]
        compile rootProject.ext.dependencies["rxjava"]
        compile rootProject.ext.dependencies["rxandroid"]
        compile rootProject.ext.dependencies["gson"]
        compile rootProject.ext.dependencies["converter-gson"]
        compile rootProject.ext.dependencies["adapter-rxjava"]
        compile rootProject.ext.dependencies["retrofit"]
        compile rootProject.ext.dependencies["butterknife"]
    }
    

    以后再对依赖包升级的时候直接修改 config.gradle 文件就 OK 了

    8、如果是gradle.properties文件就直接使用

    对依赖进行统一管理的另一种方法是使用配置文件 gradle.properties(通常 IDE 会自动生成此文件),在此文件中添加键值对:

    LOGGING_INTERCEPTOR=com.squareup.okhttp3:logging-interceptor:3.0.1
    CARD_VIEW=com.android.support:cardview-v7:23.3.0
    

    在 Module 的 build.gradle 中使用:

    dependencies {
        compile LOGGING_INTERCEPTOR
        compile CARD_VIEW
    }
    

    9、根目录下的 gradle 文件夹

    gradle 文件夹中主要是 gradle-wrapper.properties 文件比较重要,主要用来声明 Gradle 目录以及 Gradle 下载路径等:

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

    10、根目录下的 build.gradle

    根目录下的 build.gradle 主要作用就是定义项目中公共属性,比如有依赖仓库、 Gradle 构建版本等:

    buildscript {
        repositories {
            jcenter()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:2.2.1'
            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        }
    }
    
    allprojects {
        repositories {
            jcenter()
            mavenCentral()
        }
    }
    
    task clean(type: Delete) {
        delete rootProject.buildDir
    }
    setting.gradle
    

    11、setting.gradle 的作用就是一些模块被包含后,会在这里进行申明:

    include ':app'

    12、gradle和gradlew区别

    Gradlew是包装器,是为了解决不同项目gradle版本不同而推出的,它自动下载包装里定义好的gradle 版本,保证编译环境统一,gradle 是用本地的gradle。

    • gradlew build 和 gradle build 有区别吗?
      使用gradle wrapper是gradle官方推荐的build方式,而gradlew正是运行了wrapper task之后生成的(运行wrapper task是Android Studio自动做的)。使用gralde wrapper的一个好处就是每个项目可以依赖不同版本的gradle,构建的时候gradle wrapper会帮你自动下载所依赖的版本的gradle。而如果你使用gradle build的话,同时你又有多个项目使用不同版本的gradle,那就需要你手动在自己的机器上配置多个版本的gradle,稍微麻烦一些

    • 避免每次工程都下载gradle可以使用gradle命令打包而不是gradlew
      方法:配置gradle到环境变量;工程中使用自己配置变量的gradle即可。
      先找到gralde的根目录,在系统变量里添加两个环境变量:

    变量名为:GRADLE_HOME,变量值就为gradle的根目录;

    比如变量值为:
    D:androidandroid-studio-ide-143.2739321-windowsandroid-studiogradlegradle-2.10

    还有一个在系统变量里PATH里面添加gradle的bin目录

    比如:
    D:androidandroid-studio-ide-143.2739321-windowsandroid-studiogradlegradle-2.10\bin

    这样就配置完了,执行以下这个命令:gradle assembleRelease,看看是不是可以了。

    13、设置GRADLE_USER_HOME的几种方法
    Android Studio的gradle在缓存处理上有时候会莫名其妙的出问题,必要时需要手动删除缓存,然后重新编译。有时也有出于其他考虑指定gradle缓存路径。

    在gradle的安装目录,编辑bin文件夹下的gradle文件,然后找到如下语句:

    # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script
    

    在这句话的下面加上如下这一句:

    GRADLE_OPTS=-Dgradle.user.home=/yourpath/gradle/gradle_cache
    

    即设置GRADLE_OPTS这个变量即可.这种修改方法尤其适合需要用gradle脚本就行编译的环境中,本文就采用这种方法。

    • 方法1

    通过修改AndroidStudio的设置项,找到gradle相关的设置:

    image

    直接修改Service directory path即可。这种方法适合只使用AndroidStudio进行编译的环境。

    • 方法2,修改gradle.properties文件

    在其中增加一句:

    gradle.user.home=D:/Cache/.gradle

    缺点:每个项目都要这么加一次.

    • 方法3,设置GRADLE_USER_HOME环境变量

    /etc/profile~/.bash_profile增加如下:

    export GRADLE_USER_HOME=D:/Cache/.gradle

    • 方法4,通过gradle自带参数

    gradle -g D:/Cache/.gradle build build

    可以通过gradle --help查看各参数的含义。

    总结

    个人推荐修改bin/gradle文件的方法 或 方法3.

    14、gradle-wrapper.properties中各属性的含义

    1. gradle-wrapper.properties

    每一个用gradle编译的工程,都会有一个gradle\wrapper目录。该目录下有2个文件:gradle-wrapper.jargradle-wrapper.properties

    其中gradle-wrapper.properties的内容如下:

    distributionBase=GRADLE_USER_HOME
    distributionPath=wrapper/dists
    zipStoreBase=GRADLE_USER_HOME
    zipStorePath=wrapper/dists
    distributionUrl=https\://services.gradle.org/distributions/gradle-3.1-bin.zip
    

    注:目前最新的是3.3版。

    1.1 distributionUrl

    distributionUrl是要下载的gradle的地址,使用哪个版本的gradle,就在这里修改。

    gradle的3种版本:

    1. gradle-xx-all.zip是完整版,包含了各种二进制文件,源代码文件,和离线的文档。例如,https://services.gradle.org/distributions/gradle-3.1-all.zip

    2. gradle-xx-bin.zip是二进制版,只包含了二进制文件(可执行文件),没有文档和源代码。例如,https://services.gradle.org/distributions/gradle-3.1-bin.zip

    3. gradle-xx-src.zip是源码版,只包含了Gradle源代码,不能用来编译你的工程。例如,https://services.gradle.org/distributions/gradle-3.1-src.zip

    如果只是为了编译,可以不用完整版,只需要二进制版即可,例如,gradle-3.1-bin.zip。

    1.2 其他4个属性

    zipStoreBasezipStorePath组合在一起,是下载的gradle-3.1-bin.zip所存放的位置。
    zipStorePathzipStoreBase指定的目录下的子目录。

    distributionBasedistributionPath组合在一起,是解压gradle-3.1-bin.zip之后的文件的存放位置。
    distributionPathdistributionBase指定的目录下的子目录。

    下载位置可以和解压位置不一样。

    zipStoreBasedistributionBase有两种取值:GRADLE_USER_HOMEPROJECT

    其中,GRADLE_USER_HOME表示用户目录。
    在windows下是%USERPROFILE%/.gradle,例如C:\Users\<user_name>\.gradle\
    Linux下是$HOME/.gradle,例如~/.gradle

    PROJECT表示工程的当前目录,即gradlew所在的目录。

    15、app/build.gradle 配置文件

    一般来说,新建的一个项目,在 app 目录会生成一个 build.gradle 文件,app 目录基本是项目的一个主要目录了,所有的功能开发都是在这个目录下,自然该目录下的 build.gradle 也是整个项目最重要的配置文件,这个文件对全新的项目来说会包含三部分

    最顶部的 apply plugin 声明
    android {} 节点
    dependencies {} 节点
    apply plugin 声明

    最顶部有一行代码是这样的:

    apply plugin: 'com.android.application'    
    

    代表该项目是一个 Android 项目,而且一个 Android 项目只有一句这个声明,别问为什么这样写,这是规范。

    如果你的项目有引用一些 module ,你可以理解成通过源码的方式引用一些 android library ,那么你的 module 开头需要声明是一个 android library ,那需要这样写:

    apply plugin: 'com.android.library'    
    

    是不是很容易理解?

    16、 BuildType

    • 1.1默认buildType
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    
    // release版本中设置了开启混淆,并且定义了混淆文件的位置
    

    默认情况下还有一个debug版本,我们也可以添加对debug版本的一些设置

    buildTypes {
        debug {
            minifyEnabled false
        }
    }
    
    // debug版本中关闭混淆
    
    • 1.2自定义buildType

    除了默认的构建版本,还可以创建自己的构建版本

    buildTypes {
        custom.initWith(buildTypes.debug)
        custom {
            applicationIdSuffix  ".custom"
            versionNameSuffix  "-custom"    }}
    // custom使用initWith方法复制debug版本并创建了一个新的构建版本,相当于继承了debug版本
    // custom版本中添加applicationId后缀,添加versionName后缀
    

    其他属性的设置可以查看buildType的文档。

    17、定义变量

    Groovy作为一门动态语言,所以肯定是支持动态类型。那么在定义变量的时候是可以不指定变量类型的。

    使用def关键字来定义变量,但是def关键字也是可以省略的。例如:

    def a = 1           //使用def关键字定义变量a
    a = 1               //省略def同样可以
    def int a = 1       //指定变量类型
    int a = 1       //省略def关键字,并指定变量类型
    

    但是这并没有突出动态语言的特性,既然是动态语言,那么变量a可以是任意类型的,比如:

    def a = 1       //声明的时候是一个int类型
    a = 'hello groovy'      //然后赋值一个String
    assert a instanceof String      //断言测试是没有问题的
    

    但是如果在定义变量的时候指定了变量类型,那么这个变量就不在是动态变量,例如:

    def int a = 1       //声明变量的时候指定变量a是一个int型
    a = 'hello groovy'      //将一个String赋值给a的时候会报错
    

    18、String

    Groovy里面的String比较的变态,因为他的表达方式太多,下面一一列举一下String几种形式:

    def v = '支持占位符'
    
    def a = '单引号形式'
    def b = "双引号形式,${v}"
    def c = '''三个单引号形式
    支持多行
    不支持占位符'''
    def d = """三个双引号形式
    支持多行
    支持占位符,${v}"""
    def e = /反斜杠形式
    支持多行
    支持占位符,${v}/
    def f = $/美刀反斜杠形式
    支持多行
    支持占位符,${v}/$
    

    String的形式虽然很多,但是还是建议你只使用'和"这两种形式,以防别人看不懂你写的代码,并不是大家都有同样的Groovy语法基础,如果你一定要用的话,也请你注释清楚这是什么意思。

    19、List

    Groovy中的List使用的是java.util.List,默认使用ArrayList,如果你想要使用LinkedList需要特别指明;List是动态的,里面可以同时放不同类型的数据。

    //动态类型,可以同时存放任意类型的值
    def list = [0, "list", 1.2, false]      
    
    //指定LinkedList的两种方式
    LinkedList linkedList = [1, 2, 3]
    def linkedList2 = [1, 2, 3] as java.util.LinkedList
    
    //根据下标获得list数据的方式
    assert list.get(2) == 1.2
    assert list[2] == 1.2
    

    20.Array数组

    在Groovy中,使用Array数组和使用List最大的区别就是,Array数组必须指定类型。

    //声明数组的两种方式,必须指定类型
    def String[] arrStr = ["a", "b", "c"]
    def arrNum = [1, 2, 3] as int[]
    //创建一个有界限范围的空数组
    def String[] arrStr2 = new String[2]
    
    //二维数组
    def int[][] matrix2 = [[1, 2], [3, 4]]
    

    21.Map

    Groovy中的Map使用非常的简单。

    //定义一个map
    def person = [name: '阿,希爸', age: 30, sex: 'male']
    //获取对应的key值
    assert person['name'] == '阿,希爸'
    assert person.age == 30
    assert person.get('sex') == 'male'
    
    //修改key对应的值
    person.age == 31
    //添加新的键值对
    person.country =  '中国'
    person.put('province', '安徽')
    
    //空map
    def emptyMap = [:]
    
    

    ================================================

    22.Gradle Warpper

    为什么我在Github下了一个项目导入要这么久?

    Gradle到底在干点啥浪费了我这么多青春?

    一般这种情况的罪魁祸首是Gradle Wapper,他的主要作用是来适配不同的Gradle版本的。

    比如你在github上面下了一个项目,项目的目录结构大概是这样的:

    .
    ├── app
    ├── build.gradle
    ├── gradle
    │   └── wrapper
    │       ├── gradle-wrapper.jar
    │       └── gradle-wrapper.properties
    ├── gradle.properties
    ├── gradlew
    ├── gradlew.bat
    └── settings.gradle
    
    

    其中gradlew文件是Linux和MacOS环境下运行的,gradlew.bat是window环境下运行的。而定义项目的执行版本在/gradle/wrapper/gradle-wrapper.properties文件中,内容如下:

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

    这文件是说我这个项目需要你用2.10版本的gradle来编译。

    如果你当前AndroidStudio所使用的Gradle版本与文件中指定的不一致,Gradle会去下载对应的版本,下载好了用这个版本去编译。

    一个Gradle的压缩文件大概50M以上,如果你的网络环境差一点,是比较痛苦的。

    解决这个问题的方法有两个,一个是让gradle-wrapper.properties中的Gradle版本与当前AndroidStudio所使用的Gradle版本一致,一个是自己下载好所需要的版本。但是两个方法都会有一些问题,我们来一个一个分析。

    使用同一个版本的Gradle

    首先查看你当前AndroidStudio所使用的Gradle是什么版本,然后将gradle-wrapper.properties中的Gradle改成同一个版本。

    查看AndroidStudioGradle版本的方法如下图:

    image.png

    这里建议将Gradle home配置成本地环境。也就是说自己下载一个Gradle然后配置到系统环境中,这样在终端就可以使用了。

    上图中所使用的Gradle版本是2.14.1。而刚才我们列出来的gradle-wrapper.properties中的Gradle版本是2.10。

    gradle-wrapper.properties中的Gradle版本是2.14.1就可以避免去下载2.10版本。但是这样做有风险,如果新的版本对旧版本的一些语法不在支持了,那么就会编译错误,结果会得不偿失,除非你对版本变更了解的非常透彻,能够手动将文件变动的地方重新修改,那么用这种方法没有问题。但是如果你不了解,建议不要采用这种方法。

    接着介绍第二种。

    手动下载Gradle版本

    既然对Gradle的版本变更不熟悉,我们就按照gradle-wrapper.properties文件中的配置内容,使用下载工具去下载,来避免他下载过慢的问题,而且如果我们积累了比较常用的版本,也就不用每次都去下载了。

    gradle-wrapper.properties中基本都给出来了下载链接,https://services.gradle.org/distributions/可以查看所有版本。

    如果你的网络访问这个页面或者使用下载工具还是下载很慢的话,可以到androiddevtools上面去下载相关的安装包。

    但是这种做法也有一个问题,那就是他的下载机制。还是用刚才的栗子。

    目前我的AndroidStudio使用的Gradle是2.14.1。

    我的gradle-wrapper.properties中的Gradle版本是2.10。

    那么执行编译,Gradle会先到gradle-wrapper.properties配置的目标路径下去找这个文件是否存在,其中的GRADLE_USER_HOME一般是对应下图中的Service directory path

    image.png

    那么连起来就是/Users/username/.gradle/wrapper/dists这个目录,为了后面引用我们给这个路径起名叫做wrapperPath

    如果路径下不存在这个版本的目录,那么Gradle会去创建相关文件目录,并开始下载对应版本的压缩包。内容如下图。

    image.png

    如果你现在嫌他下载太慢,删除gradle-2.10-all目录,然后将自己下载的压缩文件解压出来以为就万事大吉了,那就太天真了,当年我就是这么天真的。

    我们先来看他下载好了是什么样的。


    image.png

    我们可以看到多了一个gradle-2.10-all.zip.part变成了gradle-2.10-all.zip.ok。同时多了文件压缩包和解压出来的对应文件目录。并且在一个目录名为看似一串随机码的目录下。

    解释一下,Gradle会在 /wrapperPath/gradle-2.10-all/随机码/ 目录下去检查是否有一个gradle-2.10-all.zip.ok文件,如果有就直接编译,即使你将gradle-2.10这个目录删除了,他的编译会报错,但是他还是不会去下载。

    如果没有这个文件,那么Gradle就会开始去下载gradle-2.10-all.zip文件,gradle-2.10-all.zip.part文件就是正在下载的gradle-2.10-all.zip文件,下载完成自动解压,在执行编译。

    其中的随机码目录根据官方的介绍应该是由SHA-256 hash生成的,只是我的猜想。

    如果我们想要骗过他就让他先执行下载,生成相关的文件目录,然后将你下载好的压缩包解压后放进去,在创建一个gradle-2.10-all.zip.ok文件,就可以了。

    image.png

    我将1.7以后的版本都手动配置好了。

    以上,相信你能够填上Gradle Wrapper给你挖的坑了。

    23.加速编译过程

    • 3.1 Gradle Daemon

    Gradle Daemon是一个长期在后台执行的一个进程,用来避免每次开始编译在JVM启动Gradle所消耗的时间,同时也会在内存中保存一些你的项目数据来加速编译过程。Gradle3.0默认是开启Daemon的。

    想要开启Daemon功能可以在.gradle/gradle.properties文件中添加org.gradle.daemon = true。

    • 3.2 Gradle Parallel

    Gradle Parallel一般是对多个项目使用并行编译,他会在配置阶段对项目进行预编译,分析项目之间的依赖关系,而且已经编译过的项目,如果没有更改,直接用上次编译好的去构建目标项目,例如我们Android开发时在libraries里面的项目,只要编译一次就可以了,不会每次都去编译。

    可以通过在项目根目录下的gradle.properties中添加org.gradle.parallel=true来开启此功能。

    • 3.3 Configuration on demand

    Configuration on demand简单的说就是能够缩短multi-projects的配置时间。

    可以通过在项目根目录下的gradle.properties中添加org.gradle.configureondemand=true来开启此功能。

    • 3.4 增加jvm进程的最大堆内存

    通过修改项目根目录下的gradle.properties中的org.gradle.jvmargs属性来设置。根据你的配置可以改成org.gradle.jvmargs=-Xmx2048m 或者 org.gradle.jvmargs=-Xmx3072m

    • 3.5 使用固定版本的依赖项

    如果你在依赖项中使用了动态版本配置,那么编译的时候会去检查是否有更新的版本,如果有就会下载新版本的依赖项。所以尽量使用固定版本的依赖,减少 + 号的使用。

    24、dependencies 节点

    我们先来看下 dependencies 节点,dependencies 是 denpendency 的复数,意为依赖的意思,所以这里就是用来管理依赖的地方。这里以我的开源项目 9GAG 为例,依赖一般有三种:


    image.png

    我们知道我们可以在 AS 中直接依赖 jar 文件,靠的就是这行代码 compile fileTree(dir: ‘libs’, include: [‘*.jar’]) ,意思是编译 libs 目录下的所有 jar 包,当然你可以更改这个目录。

    第二种就比较常见了,现在大家都已经很熟悉了,就是直接依赖远程项目名字 + 版本号,至于该项目是放在哪里的呢?一般是放在 jcenter 和 maven 仓库的,这个可以在项目根目录下的 build.gradle 指定远程仓库地址,甚至可以在本地搭建一个私有仓库,然后指定本地仓库地址。

    如果文章当中有任何不正确的地方,还请广大读者纠正,非常感谢!

    相关文章

      网友评论

      • 搬砖的乐趣:哇老哥这文章是真的6 , 差不多把常见的问题都说清楚了 , 我怎么没早点发现 , 最近自己尝试productFlavors时文章里面涉及到的差不多都了解了 , 要是早点看到 , 当初就不用花那么久
        孙晓刚_0dcd:常用的基本都涵盖了。可以。
        当时不是寻常:@搬砖的乐趣 谢谢支持,我也是碰到了新知识点就不断往上面更新的:blush:

      本文标题:【andorid】gradle相关知识点总结

      本文链接:https://www.haomeiwen.com/subject/cerxixtx.html