快速了解Android Studio的Gradle

jopen 9年前發布 | 22K 次閱讀 Android Studio

前言在閱讀本文章之前,期望你已經了解了這些內容:

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

  • gradle task的基本概念和寫法

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

Gradle Scripts

使用AndroidStudio新建一個Android項目,一直默認直到創建完成,然后點開AndroidStudio左邊的Project面板,可以看到如下工程組織:

快速了解Android Studio的Gradle

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

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

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

  • 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.proproguard是一個用來混淆java代碼的開源項目,Android項目把它集成了進來,先不管。

  • 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來安裝,可以安裝多個版本,如圖:

    快速了解Android Studio的Gradle

官方建議這里指定的構建工具的版本最好大于等于目標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界面上。

參考鏈接:

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!