Android Gradle系列-入門篇

前言

這篇文章定義為入門篇,將結(jié)合自己剛開始學(xué)習(xí)Android時(shí)的疑惑與現(xiàn)在對(duì)Gradle的認(rèn)識(shí),進(jìn)一步整理Gradle在Android中的整體結(jié)構(gòu)。

思考

當(dāng)我使用Android Studio時(shí),一直有幾個(gè)疑問圍繞著我:

  1. Android Studio是怎樣將Java與Kotlin代碼的編譯成APK文件?

  2. Gradle是怎樣將Java與Kotlin代碼編譯成APK文件?

后來知道Android Studio自身是不能夠編譯成APK的,它是集成了Gradle。通過研究Gradle,發(fā)現(xiàn)Gradle也只是一個(gè)構(gòu)建工具,真正編譯成APK的功能是由Android app plugins提供的。Gradle只是自動(dòng)化構(gòu)建工具,提供構(gòu)建時(shí)的各種生命周期,例如:building、testing、publishing等。所以Gradle不僅支持Android還支持C/C++、Scale等。

而這個(gè)plugin其實(shí)就是在project中的build.gradle中聲明的classpath

 1buildscript { 2    repositories { 3        // Gradle 4.1 and higher include support for Google's Maven repo using 4        // the google() method. And you need to include this repo to download 5        // Android Gradle plugin 3.0.0 or higher. 6        google() 7        ... 8    } 9    dependencies {10        classpath 'com.android.tools.build:gradle:3.4.0'11    }12}

所有每次對(duì)Android構(gòu)建進(jìn)行了優(yōu)化,我們都要來更新這個(gè)版本。

Scripts

有了上面的基礎(chǔ),當(dāng)我們新建一個(gè)Android項(xiàng)目時(shí),你將會(huì)看到如下與Gradle相關(guān)的文件:

你會(huì)看到文件名幾乎都有g(shù)radle字段,下面我會(huì)一一介紹它們的作用

Gradle Wrapper

首先是gradle-wrapper.properties文件,打開它你將會(huì)看到如下類似信息

1#Sat Jan 19 08:25:46 CST 20192distributionBase=GRADLE_USER_HOME3distributionPath=wrapper/dists4zipStoreBase=GRADLE_USER_HOME5zipStorePath=wrapper/dists6distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip

這個(gè)是gradle版本的配置項(xiàng),申明你當(dāng)前項(xiàng)目中使用的gradle版本。當(dāng)我們構(gòu)建項(xiàng)目的時(shí)候,它會(huì)根據(jù)版本自動(dòng)下載。并且保存到你的電腦本地中。如果你使用的是Mac,你可以使用如下命令查看你的所有已經(jīng)下載的gradle版本。

1ls ~/.gradle/wrapper/dists/

所以如果你不滿意當(dāng)前版本,也可以通過查看version of Gradle(https://gradle.org/releases/)修改到相應(yīng)的版本

settings.gradle

這個(gè)文件是項(xiàng)目與其子項(xiàng)目或者module間的配置。里面通過include函數(shù)來告訴該項(xiàng)目所包換的子項(xiàng)目或者依賴的module。例如剛新建項(xiàng)目時(shí)只有一個(gè)app子項(xiàng)目。

1include ':app'

所以settings.gradle是位于project的最外層,即與app同級(jí)。

build.gradle

現(xiàn)在我們已經(jīng)知道一個(gè)project可以包含一個(gè)或者多個(gè)sub-projects,而Android一般會(huì)將sub-projects當(dāng)做module,所以你會(huì)在這看到兩個(gè)build.gradle。根據(jù)后面的hint提示,發(fā)現(xiàn)它們分別來自與project與module。

首先我們來看project中的build.gradle,即位于根目錄下的文件

 1buildscript { //1 2 3    ext.objectboxVersion = '2.3.0' //4 4 5    repositories { //2 6        google() 7        jcenter() 8    } 9    dependencies { //310        classpath 'com.android.tools.build:gradle:3.3.2'11        classpath "io.objectbox:objectbox-gradle-plugin:$objectboxVersion"        12    }1314}1516allprojects { //517    repositories {18        google()19        jcenter()20    }21}2223task clean(type: Delete) { //624    delete rootProject.buildDir25}
  1. buildscript閉包是申明編譯該項(xiàng)目所需的相關(guān)配置

  2. 告知gradle這些配置將從google()與jcenter()中獲取

  3. 申明相關(guān)的plugin,例如Android Plugin for Gradle。

  4. 在gradle中有一個(gè)extra property屬性,允許我們通過它來申明一些變量,例如plugin的版本號(hào)。有一個(gè)特性就是這些變量在gradle中都是全局的。所以對(duì)于多個(gè)module時(shí),我們可以通過它來統(tǒng)一相關(guān)的版本號(hào)。最后在3中通過${name}來引用

  5. 因?yàn)榭赡苡卸鄠€(gè)sub-project,對(duì)于一些相同的配置,可以通過allprojects來進(jìn)行統(tǒng)一管理。

  6. 申明一個(gè)task,用來執(zhí)行相關(guān)任務(wù),這里是clean操作,目的是刪除build文件夾中的數(shù)據(jù)

下面是module中的build.gradle

 1apply plugin: 'com.android.application' 2apply plugin: 'io.objectbox' //1 3 4android { //2 5    compileSdkVersion 28 6    defaultConfig { 7        minSdkVersion 21 8        targetSdkVersion 27 9        versionCode 10000510        versionName "1.0.5"11        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"12    }13    buildTypes {14       release {15            minifyEnabled false16            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'17        }18    }19}2021dependencies { //322    implementation fileTree(include: ['*.jar'], dir: 'libs')23    implementation 'com.android.support:appcompat-v7:28.0.0'24    implementation 'com.android.support:support-v4:28.0.0'25}
  1. 通過調(diào)用apply函數(shù),引入我們需要依賴的plugin,這個(gè)就是我們?cè)诟鵥uild.gradle中申明的classpath

  2. android閉包是gradle最重要的配置申明,例如默認(rèn)的配置信息defaultConfig,包含minSdkVersion最小支持的android版本,versionCode與versionName等。這些配置都與編譯息息相關(guān),最好你應(yīng)該熟悉它們。你實(shí)在記不住的話,我這里也有秘籍,AppExtension(https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.AppExtension.html)這里面包含所有的配置項(xiàng)與所代表的意義。

  3. 這里的dependencies用來申明項(xiàng)目所依賴的第三方庫,而這些庫的獲取來源無需再次申明,因?yàn)槲覀円呀?jīng)在之前的根目錄的build.gradle中的allprojects閉包中進(jìn)行了申明。再者之前的ext全局變量也可以在這里使用。

gradle.properties

這個(gè)文件一般都是本地文件,主要用來對(duì)gradle構(gòu)建的一些個(gè)人配置項(xiàng)。例如gradle運(yùn)行是否并行,gradle的jvmargs大小、是否開啟daemon等等。它會(huì)在gradle運(yùn)行時(shí)注入到相應(yīng)的build.gradle中。

local.properties

這個(gè)文件也是本地文件,只不過它用來配置gradle之外的配置信息,例如ndk與sdk目錄,或者一些敏感的信息,例如插件開發(fā)打包上傳到遠(yuǎn)程倉庫這時(shí)可能需要賬號(hào)、密碼、api_key等,防止打包時(shí)暴露。

Gradle Tasks

gradle tasks是用來執(zhí)行特定的gradle任務(wù)的。我們可以直接點(diǎn)擊Android Studio右邊的Gradle按鈕,你會(huì)發(fā)現(xiàn)在Tasks下會(huì)列出該項(xiàng)目的所用可執(zhí)行的gradle任務(wù)。

image

或者你也可以在命令行中執(zhí)行如下命令,查看app下的所有tasks

1./gradlew app:tasks

我們順便點(diǎn)擊一個(gè),例如assembleDebug,我們將會(huì)在Run日志系統(tǒng)中看到如下執(zhí)行結(jié)果

根據(jù)輸出的日志,也標(biāo)明它是執(zhí)行了task: assembleDebug

當(dāng)然我們也可以在命令行執(zhí)行指定的task,例如要達(dá)到上面相同的效果,我們可以輸入如下命令

1./gradlew assembleDebug --console plain
  1. ./gradlew 代表的是使用Gradle Wrapper中的gradle,就是該項(xiàng)目本身的gradle版本,避免直接使用gradle命令

  2. assembleDebug是task的名稱

  3. --console plain輸出完整的日志

既然說到這里,再說一個(gè)初級(jí)者容易做的無意義的操作。有時(shí)會(huì)碰到一些問題而去點(diǎn)擊Clean Project,再點(diǎn)擊Rebuild Project。其實(shí)Clean Project是不必要的。我們可以直接先點(diǎn)擊Rebuild Project,查看日志

結(jié)果是它分別執(zhí)行了task: clean,assembleDebug。所以Rebuild Project就已經(jīng)包含了Clean Project,我們無需多此一舉執(zhí)行Clean Project。

最后

嗯,就這些。最后,希望這篇文章,能夠讓大家對(duì)gradle在項(xiàng)目中的結(jié)構(gòu)與所處的地位有一個(gè)更清晰的理解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容