天天看點

淺談Gradle(一)

什麼是Gradle,我打開idea,在設定裡面會有一個選項是build tools,這個選項裡有3個選項,ant,maven和gradle。

是以gradle就是build tools,簡稱建構工具。ant,maven和gradle就是java中常用的建構工具。

那什麼是建構工具呢,按照我的了解,建構工具就是把代碼變成應用的工具,比如gradle能把項目代碼變成apk檔案。這也就是應用和網頁其中一個不同的地方。

一.Product與task

第一次看到Android中預設配置的gradle我也看不懂,就完全不懂寫的是什麼,感覺亂亂的,深入了解後才看懂一些皮毛。

一個Android項目如果要編譯的話,至少要有一個子產品的build.gradle,而每個子產品的build.gradle就是Gradle 的一個Project,預設情況下我門有個app的build.gradle,這個就是一個Project。

一個Project裡頭包含多個task(任務),一個task又包含多個action。是以Gradle 抽象來說是由至少一個Project組成,Project由多個task組成,task由多個action組成。還有一點就是這個Project具體執行的task是由具體的Plugin決定的。比如我們app的build.gradle最上方會寫着apply plugin: 'com.android.application'

如果你用指令gradlew tasks tools ,你就可以檢視全部task,mac記得在前面加.\

有個我不清楚的地方是,有的人說是用gradle,但是我這是用gradlew才有效果,我不知道這兩個指令的差別。

順帶一說,常用的task有assemble、check、build、clean,task可以用指令來執行。

注意:如果你看到gradlew這個指令,那就是對建構工具進行操作的指令。

二.編譯過程

Android的編譯過程很複雜,不是我這種渣渣能看得懂的,我隻知道項目經過編譯後得到dex檔案和資源檔案。

編譯什麼的,一聽就有點不了解的意思。apk是通過代碼進行先編譯後打包得到的,這樣講就大概覺得編譯有點意思。

在别人寫的部落格中有說到,Gradle編譯分為三個階段:

(1)初始化階段:建立 Project 對象

(2)配置階段:建立project下的task

(3)執行階段:執行task

是以為什麼在子產品化中每個子產品能單獨編譯,因為每個子產品在初始化階段會得到一個Project 。

淺談Gradle(一)

image.png

三.Android Gradle結構

Gradle在AS中有3個基本的組成,一個是settings.gradle,一個是總項目的build.gradle,還有各個子產品的build.gradle

1.settings.gradle

這個檔案很簡單,主要用來來配置多項目建構。通俗點講就是你要建構的項目中需要包含哪些子產品。

2.頂層build.gradle

一般檔案結構是這樣

淺談Gradle(一)

官方也給出了各個部分作用

淺談Gradle(一)

看看我們as給我們配的

buildscript {
    repositories {
        jcenter()//設定之後可以在項目中輕松引用jcenter上的開源項目
    }
    dependencies {
        // 添加插件
        classpath 'com.android.tools.build:gradle:2.2.3'

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

allprojects {
    repositories {
        jcenter()//代碼托管庫:設定之後可以在項目中輕松引用jcenter上的開源項目
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}
           

好吧,不裝逼了,其實我也很好奇為什麼會有兩個repositories

3.子產品中的build.gradle
//說明是app程式,執行的是app的task
apply plugin: 'com.android.application'

// android程式相關的配置
android {
    compileSdkVersion 26//編譯的SDK版本
    buildToolsVersion "26.0.1"//編譯的Tools版本

    // 預設配置
    defaultConfig {
        applicationId "com.example.kylinarm.biyemonk"//應用程式的包名
        minSdkVersion 158//支援的最低版本
        targetSdkVersion 26//支援的目标版本
        versionCode 1//需要建構的應用的版本
        versionName "1.0"//需要建構的應用的版本名
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    // 這個我在打包那說過,正式包和測試包的配置
    buildTypes {
        //正式包,你開心也可以多寫個debug測試包的配置
        release {
            minifyEnabled false//是否混淆(true為混淆)
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//混淆檔案
        }
    }
}

//依賴,這個沒什麼好說的
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:26.0.0-alpha1'
    testCompile 'junit:junit:4.12'
    compile project(':baselibrary')
    compile project(':componentlibrary')
    compile 'com.jakewharton:butterknife:5.1.1'
}
           

在android{}的配置中,不光隻有defaultConfig、buildTypes 這些,還有其它的,我這就不多說,用到再說,因為我總共也隻用過那幾種,并不知道全部的配置。

四.總結

這裡主要講的是淺談,gradle的知識内容很多,有些都出了一本書專門講gradle,我懂的也不多,就懂它的一個大概的一些基本的原理,某些功能比如說打包,我也是需要具體去查怎麼使用。

我總結對gradle的了解:

(1)gradle是一個build tools,主要功能是執行task

(2)Android配置中的配置内容要記住,因為它事關項目的建構

(3)gradle建構的一個過程,也就是它的生命周期

繼續閱讀