AndroidStudio gradle安裝配置詳解-透過現象看本質

背景

相信不少人第一次安裝androidstudio跑工程時候,會遇到一個問題:android sutdio第一次打開一個工程巨慢怎麼辦? 或者是gradle project sync filded錯誤java

有沒有想過androidstudio是如何找到咱們的gardle的?linux

原理

關於gradle的配置分爲幾個部分

1.gardle的下載和配置以及原理 2.gradle插件的下載和配置以及原理 3.gradle配置文件的語法和原理android

咱們此次主要討論前兩個問題

關於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.windows

大意就是gradle插件的版本號跟隨androidstudio的版本和gradle版本號有必定的對應關係,但願你們都使用最新的版本。bash

gradle的安裝和配置原理

androidstudio是如何加載咱們的gradle的?

1.Android Studio打開一個工程時,首先會讀取gradle-wrapper.properties 文件,從而知道這個工程須要哪一個版本的gradle ,而後就會去保存gradle的文件夾GRADLE_USER_HOME 去找看存不存在這個版本的gradle。 2.不存在則會去distributionUrl 去下載app

涉及gradle-wrapper.properties這個文件,咱們先介紹一下(瞭解的能夠略過)ide

其中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

gradle的3種版本:ui

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

轉載請註明原創地址!

相關文章
相關標籤/搜索