快速瞭解AndroidStudio的Gradle

前言
在閱讀本文章以前,指望你已經瞭解了這些內容:html

  • gradle是什麼,它有哪些基本特性java

  • gradle task的基本概念和寫法android

本人使用的環境:
LUbuntu 14.04,AndroidStudio 1.3.2,其自帶Gradle 2.4api

Gradle Scripts

使用AndroidStudio新建一個Android項目,一直默認直到建立完成,而後點開AndroidStudio左邊的Project面板,能夠看到以下工程組織:
圖片描述服務器

先簡單粗暴的來看看這些文件是什麼鬼。閉包

  • build.gradle (Project: MyApplication)
    這是Android項目根目錄下的build.gradle,此文件名是一個約定名字,gradle將依賴它來構建項目。一個項目能夠包括多個工程,gradle能夠構建多個工程,每一個工程子目錄均可以有build.gradle文件,如同make構建工具與Makefile文件的關係。咱們作的大部分工做,也就是編寫和組織build.gradle文件。app

  • build.gradle (Module: app)
    這是Android項目根目錄/app/build.gradle,app是一個gradle工程,這裏的build.gradle文件就是用來描述如何構建app工程,gradle能夠支持構建多個工程,並設置工程之間的依賴關係。ide

  • gradle-wrapper.properties
    Gradle Wrapper 是Android對gradle的使用進行一些必要的封裝而成的腳本——gradlew(位於項目根目錄下,用於命令行使用,在集成環境中很是有用),它會自動檢測當前項目指定的gradle版本是否存在,若是不存在則本身下載(保存在~/.gradle/wrapper/)。因此每個Android項目下都有本身的gradle軟件包,官方建議把這些包也提交進源碼管理系統中,這樣編譯此項目的系統(如持續集成服務器)不須要事先(手動)安裝gradle。 gradle-wrapper.properties裏的配置影響Gradle Wrapper的運做,其中distributionUrl屬性指定從哪裏下載gradle,固然,若是咱們不想讓它本身下載,能夠用distributionPath指定手工下載的本地的gradle包。(進階:具它wrapper相關的設置參見:Wrapper API
    另外,Android默認建立了一個叫wrapper的gralde task,經過使用這個task,就能夠在工程的build.gradle裏面訪問和修改wrapper屬性。工具

  • proguard-rules.pro
    proguard是一個用來混淆java代碼的開源項目,Android項目把它集成了進來,先無論。gradle

  • gradle.properties
    由於gradle是java程序,它將在JVM環境中運行,此文件用來指定gradle如何運行(或叫構建環境),包括:

    1. 開啓gradle的daemon並行構建模式,設置JVM內存參數,加速構建。

    2. 能夠自定義屬性(key和value),這些屬性能夠傳遞給gradle的java程序,也能夠被build.grade訪問。

gradle提供了多種方法爲構建環境添加屬性:

  1. 命令行執行gradle帶\-D參數,\-D參數也會傳遞給java(這裏指運行gradle的java程序)

  2. 寫在gradle.properties文件裏面,並且每一個子工程目錄下均可以有本身的gradle.properties文件

  3. 寫在GRADLE_USER_HOME環境變量所指目錄下的gradle.properties中。

  4. 寫在以ORG_GRADLE_PROJECT_開頭的環境變量裏。
    以上方式能夠同時使用,gradle按以上列出的順序(優先級從低到高)進行分析,若屬性有衝突,保留優先級高的配置。

    1. 設置代理。

      如今此文件默認什麼都沒配置,先無論。

  • settings.gradle
    這個文件也是gradle約定命名的,默認只有一行代碼include ':app',表示當前項目只有一個模塊(咱們習慣叫工程,gradle習慣叫模塊),app是目錄名,同時也做爲工程名。當有多個工程的時候,能夠在此添加。

  • local.properties
    默認內容是Android SDK和NDK的配置路徑,這是我以前在AndroidStudio配置過的,此文件不須要咱們修改,在IDE的設置會自動覆蓋此文件的設置,此文件不該該commit到源碼管理系統中,由於它是我的環境的配置。

好,下面咱們具體來看build.gradle文件。

根目錄的build.gradle

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

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

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

allprojects {
    repositories {
        jcenter()
    }
}

這是一個最頂層的gradle工程。gradle工程在gradle系統中用一個project對象)表示,它有以下一些元素:
allprojects { }
artifacts { }
buildscript { }
configurations { }
dependencies { }
repositories { }
sourceSets { }
subprojects { }
publishing { }
下面咱們只對相關的進行探索。

Gradle Plugins
Gradle內核集成了不少插件(好比編譯java代碼的插件),使用插件,咱們只須要作不多的工做就能夠完成常規的構建任務。以.jar文件打包成的插件叫二進制插件,在使用這種插件以前,得把它添加到當前構建腳本的classpath中。

buildscript
buildscript是gradle工程中定義的一個方法,能夠傳入一個語句塊(有人叫閉包),這個語句塊返回一個ScriptHandler對象。查看ScriptHandler對象的API得知,ScriptHandler包含兩個方法:repositories和dependencies,調用dependencies設置構建時依賴什麼東西,調用repositories設置這些依賴來自哪裏的倉庫。如今明白了,上面的代碼其實就是爲Android的gradle插件指定位置和版本。

allprojects
這也是gradle的特性,gradle支持在根build.gradle裏使用allprojects,事先對整個構建可能包含的全部工程進行統一的配置,上面的代碼就是給全部工程都配置了jcenter倉庫,這樣工程所依賴的第三方庫在構建過程當中都會被自動下載。若是多個工程(子工程)有相同的行爲或屬性要配置,使用這個是很方便的。

app工程下的build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "22.0.1"

    defaultConfig {
        applicationId "example.jk.myapplication"
        minSdkVersion 19
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.2.0'
}

apply plugin
apply plugin: 'com.android.application'應用Android的gradle插件到當前構建腳本,此插件其實繼承自gradle的application插件,使用application插件,能夠經過添加task來運行或把Java項目構建爲基於命令行的程序。
Android gradle插件具備application插件的功能,同時會應用java插件和distribution插件,後兩個插件用來自動化編譯和發佈java程序的。

android
這個Android gradle插件提供的元素,用於配置android相關的構建選項,包括:

  • compileSdkVersion 指定構建時使用的Android SDK版本

  • buildToolsVersion 指定構建工具的版本,構建工具可使用Android SDK Manager來安裝,能夠安裝多個版本,如圖:
    圖片描述

官方建議這裏指定的構建工具的版本最好大於等於目標SDK版本(targetSdkVersion)。

defaultConfig元素裏的配置對應AndroidManifest.xml文件,優先級比AndroidManifest.xml文件裏的配置高。gradle支持對一個項目構建多種版本,好比試用版 、商業版,每一個版本能夠有本身的defaultConfig。

buildTypes元素默認定義了debug和release兩種構建,debug構建出來的APK將包含調試符號,而且以debug key進行簽名,而release類型的默認是沒有簽名的。minifyEnabled爲true表示啓用自動清除無用代碼,用於軟件包瘦身。proguardFiles指定了代碼混淆使用的相關文件。

工程依賴

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.2.0'
}

這裏的dependencies是gradle工程定義的元素,指定此工程依賴什麼。compile這個方法指定要添加什麼來編譯主程序,這些東西將最終被打包進APK中。
fileTree(dir: 'libs', include: ['*.jar'])將返回一個文件樹對象,這些文件位於app/libs目錄,並以.jar結尾。

整句代碼的意思就是把當前工程目錄的libs目錄下全部jar文件加入編譯時classpath中,並打包進APK。這是本地二進制庫依賴的寫法。
compile 'com.android.support:appcompat-v7:22.2.0'表示依賴位於倉庫中的appcompat庫及其版本,位於Android Support Library中,若是本地沒有安裝Android Support Library,使用Android SDK Manager進行下載。(進階:固然,還能夠指定依賴其它工程,以及除compile外的其它依賴類型,具體見《依賴管理介紹》

至此,咱們已經大概瞭解了AndroidStudio默認工程有關gradle的腳本。其實AndroidStudio IDE提供了不少設置,這些設置修改後,AndroidStudio會自動更新相關的build.gradle和*.properties文件。若是咱們手工編輯build.gradle文件,AndroidStudio將提示咱們進行sync(同步)操做,以便這些配置反映到IDE界面上。

參考連接:

相關文章
相關標籤/搜索