Android程序員應該知道的 gradle知識(1)

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

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

image.png

如圖 所示,典型 Android 應用模塊的構建流程通常依循下列步驟:

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

構建流程結束時,您將獲得可用來進行部署、測試的調試 APK,或者可用來發(fā)布給外部用戶的發(fā)布 APK。

目錄結構

image.png

Android項目中最重要的就是 build.gradle, setting.gradle

setting.gradle

setting.gradle 是Gradle 的設置文件,位于項目的根目錄,用于指示 Gradle 在構建應用時應將哪些模塊包括在內。對大多數項目而言,該文件很簡單,只包括以下內容:

include ':app'

如果有多個module項目的話

include ':app', ':app2'

頂級根目錄build.gradle

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

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

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

Gradle 插件和Gradle版本的關系

image.png

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

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

模塊級 build.gradle

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

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

/**
告訴Gradle這個module的構建類型,application 或者library
 */

apply plugin: 'com.android.application'

/**
 Android 構建的參數
 */

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 還包括兩個屬性文件,位于項目根目錄,可用于指定適用于 Gradle 構建工具包本身的設置:

gradle.properties
您可以在其中配置項目范圍 Gradle 設置,例如 Gradle 后臺進程的最大堆大小。如需了解詳細信息,請參閱構建環(huán)境

local.properties
為構建系統配置本地環(huán)境屬性,例如 SDK 安裝路徑。由于該文件的內容由 Android Studio 自動生成并且專用于本地開發(fā)者環(huán)境,因此您不應手動修改該文件,或將其納入您的版本控制系統。

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

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

在項目初始化構建的時候,去讀取項目的setting.gradle,判斷需要構建的項目,并在初始化的時候生成一個Gradle對象,我們可以在官網查到這個對象的的api和屬性。
初始化完成后,Gradle讀取到需要構建的各個項目,便開始配置構建工作,去讀取每個項目的build.gradle,并生成一個project對象,這個project對象對應這個這個build.gradle。project的文檔,我們可以在build.gradle 文件里調用project對象。

image.png

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

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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評論 6 541
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 99,324評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,018評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,417評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,783評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,960評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 49,522評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,267評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,471評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,698評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,204評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,436評論 2 378

推薦閱讀更多精彩內容