AndroidStudio gradle安装配置详解-透过现象看本质

7,817 阅读3分钟

背景

相信很多人第一次安装androidstudio跑工程时候,会遇到一个问题:android sutdio第一次打开一个工程巨慢怎么办? 或者是gradle project sync filded错误

有没有想过androidstudio是如何找到我们的gardle的?

原理

关于gradle的配置分为几个部分

1.gardle的下载和配置以及原理 2.gradle插件的下载和配置以及原理 3.gradle配置文件的语法和原理

我们这次主要讨论前两个问题

关于gradle插件和gradle版本,官网曾有概述:

The Android Studio build system is based on Gradle, and the Android plugin for Gradle adds several features that are specific to building Android apps. Although the Android plugin is typically updated in lock-step with Android Studio, the plugin (and the rest of the Gradle system) can run independent of Android Studio and be updated separately.

大意就是gradle插件的版本号跟随androidstudio的版本和gradle版本号有一定的对应关系,希望大家都使用最新的版本。

gradle的安装和配置原理

androidstudio是如何加载我们的gradle的?

1.Android Studio打开一个工程时,首先会读取gradle-wrapper.properties 文件,从而知道这个工程需要哪个版本的gradle ,然后就会去保存gradle的文件夹GRADLE_USER_HOME 去找看存不存在这个版本的gradle。 2.不存在则会去distributionUrl 去下载

涉及gradle-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

distributionUrl

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

gradle的3种版本:

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

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

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

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

其他4个属性

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

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

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

zipStoreBase和distributionBase有两种取值:GRADLE_USER_HOME和PROJECT。

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

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

举例:各项属性的整体含义

例1,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

各项属性的整体含义,如下:

(1) 去 https://services.gradle.org/distributions/gradle-3.1-bin.zip 下载gradle的3.1版本,只包含binary的版本。

(2) 下载的gradle-3.1-bin.zip存放到C:\Users<user_name>.gradle\wrapper\dists目录中。 (注:具体还有2级目录,即全路径为C:\Users<user_name>.gradle\wrapper\dists\gradle-3.1-bin<url-hash>\,gradle-3.1-bin目录是根据下载的gradle的文件名来定的,目录名是根据distribution url路径字符串计算md5值得来的,具体参考PathAssembler.java中的rootDirName()和getHash(),PathAssembler.java的位置见本文最后的参考路径)

(3) 解压gradle-3.1-bin.zip,将解压后的文件存放到C:\Users<user_name>.gradle\wrapper\dists中。(注:具体还有2级目录,同上)

解决方案

既然搞清楚了原理,也知道打开慢的原因是卡在下载gradle这一步,那么我们就自己下载gralde,然后配置上去 (1) 修改gradle-wrapper.properties 修改gradle-wrapper.properties 中的 distributionUrl,改成我们想要的版本,只改后面的版本就可以了,前面的部分不要改。具体版本看下面链接:

Gradle下载地址:https://services.gradle.org/distributions/

(2) 打开项目 这个时候AS将自动下载gradle,并创建好目录。这时直接干掉Android Studio并退出,因为这一步是为了得到AS自动创建的下载目录,定位到下面的目录: Linux:

~/.gradle/wrapper/dists

windows:

C:\users{user name}.gradle\wrapper\dists

进入对应的gradle版本文件夹下,会发现有一个一串乱码的文件夹 (2) 下载gradle 从上面的Gradle下载地址,下载对应版本的gradle,本例中为gradle-2.4-all.zip,然后删除上图中的gradle-2.4-all.zip.part文件,将下载的gradle-2.4-all.zip复制到上图中一串乱码的文件夹下,注意不要解压。这样我们就跳过了下载gradle这一步。

(3) 重新开启Android Studio,打开工程,ok,一下子就打开了.

androidstudio的gradle设置也会影响gardle加载

这里写图片描述

逐个选项介绍

  • 若选中Use default gradle wrapper(recommended),则设置的Gradle位置为Service directory path中的路径;

  • 若选中Use local gradle distribution,则设置的Gradle位置为Gradle home中的路径。

注:Service directory path是全局级的,Use default gradle wrapper(recommended)与Use local gradle distribution是项目级的,优先级高于全局级的设置。

Service directory path个人理解其实就是gradle-wrapper.properties文件中,变量GRADLE_USER_HOME的具体值,可以设置,当然也有默认值,根据操作系统不同,默认值也会不同: 在windows下是%USERPROFILE%/.gradle,例如C:\Users<user_name>.gradle\。 在linux下是$HOME/.gradle,例如~/.gradle

offline work是在一次成功编译之后使用,可以提高编译速度(前提是本地没有需要新加载的依赖包)

加载顺序(有待商榷,欢迎讨论)

1.根据gradle-wrapper.properties确定gradle版本号 2.选中Use default gradle wrapper(recommended),默认根据gradle-wrapper.properties文件加载:首先会读取gradle-wrapper.properties 文件,从而知道这个工程需要哪个版本的gradle ,然后就会去保存gradle的文件夹GRADLE_USER_HOME 去找看存不存在这个版本的gradle。不存在则会去distributionUrl 去下载 3.选中Use local gradle distribution,直接根据这个目录去加载

gardle插件

gradle插件和gradle是两个独立的东西,gradle插件版本是由项目最外层的build.gradle文件决定的

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

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

修改gradle插件版本之后,sync一下代码就可以了

Android Studio Gradle插件版本和Gradle版本之间有一定的对应关系。

Gradle插件版本一般继承自Android Studio的版本

直接看官网

这里写图片描述

建议:不要写版本号+这种形式

对用关系

这里写图片描述

总结

gardle的安装和配置是每个Android程序员都会遇到的,但是多多少少都会有一些困惑,理清他们背后的逻辑,对于我们的开发有很大的帮助。

参考: https://blog.jetbrains.com/idea/2013/04/gradle-improvements-at-121/ https://blog.csdn.net/u013553529/article/details/55011602 https://www.jianshu.com/p/33089ca7c98e https://blog.csdn.net/fuchaosz/article/details/51567808

转载请注明原创地址!