Android程序員應(yīng)該知道的 gradle知識(shí)(1)

Gradle 作為Android studio指定的自動(dòng)化管理構(gòu)建程序的工具,每個(gè)Android 程序員都應(yīng)該對其有最基本的了解,但是平時(shí)Android studio 已經(jīng)幫我們完成了大多數(shù)Gradle的配置,所以大多數(shù)人對Gradle理解的并不多,接下來就讓我們進(jìn)入Gradle的世界。

構(gòu)建流程(摘自https://developer.android.com/studio/build/

image.png

如圖 所示,典型 Android 應(yīng)用模塊的構(gòu)建流程通常依循下列步驟:

  1. 編譯器將您的源代碼轉(zhuǎn)換成 DEX(Dalvik Executable) 文件(其中包括運(yùn)行在 Android 設(shè)備上的字節(jié)碼),將所有其他內(nèi)容轉(zhuǎn)換成已編譯資源。
  2. APK 打包器將 DEX 文件和已編譯資源合并成單個(gè) APK。不過,必須先簽署 APK,才能將應(yīng)用安裝并部署到 Android 設(shè)備上。
  3. APK 打包器使用調(diào)試或發(fā)布密鑰庫簽署您的 APK:
    1. 如果您構(gòu)建的是調(diào)試版本的應(yīng)用(即專用于測試和分析的應(yīng)用),打包器會(huì)使用調(diào)試密鑰庫簽署您的應(yīng)用。Android Studio 自動(dòng)使用調(diào)試密鑰庫配置新項(xiàng)目。
    2. 如果您構(gòu)建的是打算向外發(fā)布的發(fā)布版本應(yīng)用,打包器會(huì)使用發(fā)布密鑰庫簽署您的應(yīng)用。要?jiǎng)?chuàng)建發(fā)布密鑰庫,請閱讀在 Android Studio 中簽署您的應(yīng)用。
  4. 在生成最終 APK 之前,打包器會(huì)使用 zipalign 工具對應(yīng)用進(jìn)行優(yōu)化,減少其在設(shè)備上運(yùn)行時(shí)的內(nèi)存占用。

構(gòu)建流程結(jié)束時(shí),您將獲得可用來進(jìn)行部署、測試的調(diào)試 APK,或者可用來發(fā)布給外部用戶的發(fā)布 APK。

目錄結(jié)構(gòu)

image.png

Android項(xiàng)目中最重要的就是 build.gradle, setting.gradle

setting.gradle

setting.gradle 是Gradle 的設(shè)置文件,位于項(xiàng)目的根目錄,用于指示 Gradle 在構(gòu)建應(yīng)用時(shí)應(yīng)將哪些模塊包括在內(nèi)。對大多數(shù)項(xiàng)目而言,該文件很簡單,只包括以下內(nèi)容:

include ':app'

如果有多個(gè)module項(xiàng)目的話

include ':app', ':app2'

頂級(jí)根目錄build.gradle

頂級(jí) build.gradle 文件位于項(xiàng)目根目錄,用于定義適用于項(xiàng)目中所有模塊的構(gòu)建配置。默認(rèn)情況下,這個(gè)頂級(jí)構(gòu)建文件使用 buildscript {} 代碼塊來定義項(xiàng)目中所有模塊共用的 Gradle 存儲(chǔ)區(qū)和依賴項(xiàng)。

/**
  buildscript{}是基礎(chǔ)配置,構(gòu)建開始的時(shí)候,所有子模塊都會(huì)讀取這個(gè)里面的內(nèi)容
*/
buildscript {
    repositories {  // 告訴Gradle 下載第三方庫的地址 
        jcenter()    // 代表 https://bintray.com/bintray/jcenter
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.1'
    }
}
//配置所有模塊的共同使用內(nèi)容
allprojects {
   repositories {
       jcenter()  //讓所有子模塊都從jcenter 獲取第三方包
   }
}

Gradle 插件和Gradle版本的關(guān)系

image.png

如上圖所示我們設(shè)置的是Gradle插件的版本號(hào),并不是Gradle的版本,最后的序號(hào)就是插件的版本號(hào),注意插件不是gradle,插件是根據(jù)gradle特性編寫為完成需求的jar包,插件依賴于gradle,下圖是插件和Gradle版本對應(yīng)的關(guān)系,也就是說,如果我們用3.1.0的插件,就必須使用Gradle4.4以上的版本。
image.png

https://developer.android.google.cn/studio/releases/gradle-plugin#updating-plugin
在該文件里可以查看Gradle的版本信息
image.png

模塊級(jí) build.gradle

build.gradle 文件位于每個(gè) <project>/<module>/ 目錄,用于配置適用于其所在模塊的構(gòu)建設(shè)置。您可以通過配置這些構(gòu)建設(shè)置來提供自定義打包選項(xiàng)(例如附加構(gòu)建類型和產(chǎn)品風(fēng)味),以及替換 main/ 應(yīng)用清單或頂級(jí) build.gradle 文件中的設(shè)置。

以下這個(gè)示例 Android 應(yīng)用模塊 build.gradle 文件概述了您應(yīng)該了解的部分基本 DSL 元素和設(shè)置。google提供的dsl查詢手冊

/**
告訴Gradle這個(gè)module的構(gòu)建類型,application 或者library
 */

apply plugin: 'com.android.application'

/**
 Android 構(gòu)建的參數(shù)
 */

android {
  compileSdkVersion 28
  buildToolsVersion "28.0.3"
  defaultConfig {
    applicationId 'com.example.myapp'
    // Defines the minimum API level required to run the app.
    minSdkVersion 15
    // Specifies the API level used to test the app.
    targetSdkVersion 28
    // Defies the version number of your app.
    versionCode 1
    // Defines a user-friendly version name for your app.
    versionName "1.0"
  }

  buildTypes {
    release {
        minifyEnabled true // Enables code shrinking for the release build type.
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
  }
  productFlavors {
    free {
      applicationId 'com.example.myapp.free'
    }

    paid {
      applicationId 'com.example.myapp.paid'
    }
  }

  splits {
    // Screen density split settings
    density {

      // Enable or disable the density split mechanism
      enable false

      // Exclude these densities from splits
      exclude "ldpi", "tvdpi", "xxxhdpi", "400dpi", "560dpi"
    }
  }
}

/**
 * The dependencies {} block in the module-level build configuration file
 * only specifies dependencies required to build the module itself.
 */

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

Gradle 還包括兩個(gè)屬性文件,位于項(xiàng)目根目錄,可用于指定適用于 Gradle 構(gòu)建工具包本身的設(shè)置:

gradle.properties
您可以在其中配置項(xiàng)目范圍 Gradle 設(shè)置,例如 Gradle 后臺(tái)進(jìn)程的最大堆大小。如需了解詳細(xì)信息,請參閱構(gòu)建環(huán)境

local.properties
為構(gòu)建系統(tǒng)配置本地環(huán)境屬性,例如 SDK 安裝路徑。由于該文件的內(nèi)容由 Android Studio 自動(dòng)生成并且專用于本地開發(fā)者環(huán)境,因此您不應(yīng)手動(dòng)修改該文件,或?qū)⑵浼{入您的版本控制系統(tǒng)。

Gradle 在執(zhí)行的時(shí)候大概進(jìn)行了如下幾步操作:

1 初始化構(gòu)建
2 配置構(gòu)建
3 執(zhí)行構(gòu)建
4 完成構(gòu)建或者失敗

在項(xiàng)目初始化構(gòu)建的時(shí)候,去讀取項(xiàng)目的setting.gradle,判斷需要構(gòu)建的項(xiàng)目,并在初始化的時(shí)候生成一個(gè)Gradle對象,我們可以在官網(wǎng)查到這個(gè)對象的的api和屬性。
初始化完成后,Gradle讀取到需要構(gòu)建的各個(gè)項(xiàng)目,便開始配置構(gòu)建工作,去讀取每個(gè)項(xiàng)目的build.gradle,并生成一個(gè)project對象,這個(gè)project對象對應(yīng)這個(gè)這個(gè)build.gradle。project的文檔,我們可以在build.gradle 文件里調(diào)用project對象。

image.png

每個(gè)項(xiàng)目也就是build.gradle里都有一個(gè)個(gè)task,執(zhí)行構(gòu)建的工作就是執(zhí)行這些task,在執(zhí)行這些task的過程,Gradle會(huì)把這個(gè)task任務(wù)的依賴任務(wù)也一個(gè)個(gè)執(zhí)行。我們可以在Android studio的Gradle 視圖里看到這些task
image.png

Android studio的安裝應(yīng)用按鈕,clean其實(shí)都是在幫我們執(zhí)行這些相應(yīng)的task 命令。

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

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

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