Android Gradle (一)Gradle的Android插件入門

本文首發(fā)于微信公眾號「后廠村碼農(nóng)」

相關(guān)文章
Gradle核心思想(一)為什么現(xiàn)在要用Gradle波附?
Gradle核心思想(二)Gradle入門前奏
Gradle核心思想(三)Groovy快速入門指南
Gradle核心思想(四)看似無用媒峡,實則重要的Gradle Wrapper
Gradle核心思想(五)通俗易懂的Gradle插件講解
Gradle核心思想(六)自定義Gradle插件的三種方式

前言

Gradle核心思想這個系列中我盡量避免了Gradle和Android之間的關(guān)聯(lián),這是因為在了解Gradle的核心思想后,可以更好的理解Android Gradle,因此這里強(qiáng)烈建議先閱讀Gradle核心思想系列瘫想。
Android Gradle或者Gradle for Android醋粟,實際上指的就是Gradle的Android插件靡菇,這一篇我們?nèi)雮€門重归。

1.什么是Gradle的Android插件

Gradle核心思想(五)通俗易懂的Gradle插件講解這篇文章中我們知道,Gradle有很多插件厦凤,為了支持Android項目的構(gòu)建鼻吮,谷歌為Gradle編寫了Android插件,新的Android構(gòu)建系統(tǒng)就是由Gradle的Android插件組成的较鼓,Gradle是一個高級構(gòu)建工具包椎木,它管理依賴項并允許開發(fā)者自定義構(gòu)建邏輯。Android Studio使用Gradle wrapper來集成Gradle的Android插件博烂。需要注意的是香椎,Gradle的Android插件也可以獨(dú)立于AndroidStudio運(yùn)行。
Android的官方網(wǎng)站提到了新的Android構(gòu)建系統(tǒng)主要有以下幾個特點(diǎn):

  • 代碼和資源易于重用
  • 無論是針對多個apk發(fā)行版還是針對不同風(fēng)格的應(yīng)用程序禽篱,都可以很容易創(chuàng)建應(yīng)用程序的多個不同版本畜伐。
  • 易于配置、擴(kuò)展和自定義構(gòu)建過程
  • 良好的IDE集成

Gradle的Android插件結(jié)合Android Studio成為了目前最為流行的Android構(gòu)建系統(tǒng)躺率。

2. Android Studio的模塊類型和項目視圖

Android Studio中的每個項目包含一個或多個含有源代碼文件和資源文件的模塊玛界,這些模塊可以獨(dú)立構(gòu)建、測試或調(diào)試悼吱,一個Android Studio的模塊類型可以有以下幾種:

Android應(yīng)用程序模塊
Android應(yīng)用程序模塊可能依賴于庫模塊慎框,盡管許多Android應(yīng)用程序只包含一個應(yīng)用程序模塊,構(gòu)建系統(tǒng)會將其生成一個APK后添。

Android 庫模塊
Android庫模塊包含可重用的特定于Android的代碼和資源笨枯,構(gòu)建系統(tǒng)會將其生成一個AAR。

App 引擎模塊
包含應(yīng)用程序引擎集成的代碼和資源遇西。

Java 庫模塊
包含可重用的代碼馅精,構(gòu)建系統(tǒng)會將其生成一個JAR包。

Android Studio3.3.2 中的Android項目視圖如下所示努溃。


Vep71s.png

所有構(gòu)建文件在 Gradle Scripts 層級下顯示硫嘶,大概介紹下這些文件的用處。

  • 項目build.gradle:配置項目的整體屬性梧税,比如指定使用的代碼倉庫沦疾、依賴的Gradle插件版本等等。
  • 模塊build.gradle:配置當(dāng)前Module的編譯參數(shù)第队。
  • gradle-wrapper.properites:配置Gradle Wrapper哮塞,可以查看Gradle核心思想(四)看似無用,實則重要的Gradle Wrapper這篇文章凳谦。
  • gradle.properties:配置Gradle的編譯參數(shù)忆畅。具體配置見Gradle官方文檔
  • settings.gradle:配置Gradle的多項目管理。
  • local.properties:一般用來存放該Android項目的私有屬性配置尸执,比如Android項目的SDK路徑家凯。

這篇文章主要介紹項目build.gradle和模塊build.gradle缓醋。

3.項目build.gradle

我們新建一個Android項目,它的項目build.gradle的內(nèi)容如下:

buildscript {
    repositories {
        google()
        jcenter()   
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.3.2' //1
    }
}

allprojects {
    repositories {
        google()
        jcenter()  
    }
}

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

注釋1處配置依賴的Gradle插件版本绊诲,Gradle插件屬于第三方插件送粱,因此這里在buildscrip塊中配置谷歌的Maven庫和JCenter庫,這樣Gradle系統(tǒng)才能找到對應(yīng)的Gradle插件掂之。
如果使用google()not found: 'google()'錯誤抗俄,可以用如下代碼替代:

maven { url 'https://maven.google.com' }

如果你還不理解Gradle插件,可以查看Gradle核心思想(五)通俗易懂的Gradle插件講解這篇文章世舰。

4.模塊build.gradle

新建一個Android項目动雹,它的模塊build.gradle的內(nèi)容如下:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.example.myapplication"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

4.1 Gradle的Android插件類型

apply引入的插件id為com.android.application,說明當(dāng)前模塊是一個應(yīng)用程序模塊跟压,Gradle的Android插件有多個類型分別為:

  • 應(yīng)用程序插件胰蝠,插件id為com.android.application,會生成一個APK裆馒。
  • 庫插件姊氓,插件id為com.android.library,會生成一個AAR喷好,提供給其他應(yīng)用程序模塊用。
  • 測試插件读跷,插件id為com.android.test梗搅,用于測試其他的模塊。
  • feature插件效览,插件id為com.android.feature无切,創(chuàng)建Android Instant App時需要用到的插件。
  • Instant App插件丐枉,插件id為com.android.instantapp哆键,是Android Instant App的入口。

4.2 Android塊

Android塊用于描述該Module構(gòu)建過程中所用到的所有參數(shù)瘦锹。

  • compileSdkVersion:配置編譯該模塊的SDK版本
  • buildToolsVersion:Android構(gòu)建工具的版本
4.2.1 defaultConfig塊

Android塊中的defaultConfig塊用于默認(rèn)配置籍嘹,常用的配置如下所示。

屬性 描述
applicationId 指定App的包名
minSdkVersion App最低支持的SDK版本
targetSdkVersion 基于哪個SDK版本開發(fā)
versionCode App內(nèi)部的版本號弯院,用于控制App升級
versionName App版本名稱辱士,也就是發(fā)布的版本號
testApplicationId 配置測試App的包名
testInstrumentationRunner 配置單元測試使用的Runner,默認(rèn)為android.test.InstrumentationTestRunner
proguardFile ProGuard混淆所使用的ProGuard配置文件
proguardFiles 同時配置多個ProGuard配置文件
signingConfig 配置默認(rèn)的簽名信息
4.2.2 buildTypes塊

buildTypes塊用于配置構(gòu)建不同類型的APK听绳。
當(dāng)我們新建一個項目時颂碘,在Android塊已經(jīng)默認(rèn)配置了 buildTypes塊:

 buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

在AS的Terminal中執(zhí)行g(shù)radlew.bat build命令,會在該模塊的build/outputs/apk目錄中生成release和debug的APK椅挣,雖然只配置了release 头岔,但release和debug是默認(rèn)配置塔拳,即使我們不配置也會生成。也可以修改默認(rèn)的release和debug峡竣,甚至可以自定義構(gòu)建類型蝙斜,比如:

 buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        debug {
            debuggable true
        }
        privitedebug{
            applicationIdSuffix ""
        }
    }

這時會在build/outputs/apk目錄中生成release、debug澎胡、privitedebug的APK孕荠。
buildTypes塊還可以配置很多屬性,常用的配置如下所示攻谁。

屬性 描述
applicationIdSuffix 配置applicationId的后綴
debuggable 表示是否支持?jǐn)帱c(diǎn)調(diào)試
jniDebuggable 表示是否可以調(diào)試NDK代碼
buildConfigField 配置不同的開發(fā)環(huán)境稚伍,比如測試環(huán)境和正式環(huán)境
shrinkResources 是否自動清理未使用的資源,默認(rèn)值為false
zipAlignEnabled 是否開啟開啟zipalign優(yōu)化戚宦,提高apk運(yùn)行效率
proguardFile ProGuard混淆所使用的ProGuard配置文件
proguardFiles 同事配置多個ProGuard配置文件
signingConfig 配置默認(rèn)的簽名信息
multiDexEnabled 是否啟用自動拆分多個Dex的功能
4.2.3 signingConfigs塊

用于配置簽名設(shè)置个曙,一般用來配置release模式。

屬性 描述
storeFile 簽名證書文件
storePassword 簽名證書文件的密碼
storeType 簽名證書的類型
keyAlias 簽名證書中密鑰別名
keyPassword 簽名證書中密鑰的密碼
signingConfigs {
        release {
            storeFile file('C:/Users/liuwangshu/.android/release.keystore')
            storePassword 'android'
            keyAlias 'androidreleasekey'
            keyPassword 'android'
           
        }
4.2.4 其他配置塊

android塊中除了前面講的defaultConfig塊受楼、buildTypes塊垦搬、signingConfigs塊還有其他的配置塊,這里列舉一些艳汽。

描述
sourceSets 配置目錄指向
productFlavors 多個渠道配置
lintOptions Lint配置
dexOptions DEX工具配置
adbOptions adb配置
packagingOptions 打包時的相關(guān)配置

更多的配置塊請參考官方文檔猴贰。

4.2.4 全局配置

如果有多個module的配置是一樣的,可以將這些配置提取出來河狐,也就是使用全局配置米绕。全局配置有多種方式,這里介紹其中的兩種馋艺。
1. 使用ext塊配置
在項目build.gradle中使用ext塊栅干,如下所示。

ext{
    compileSdkVersion =28
    buildToolsVersion ="28.0.3"
    minSdkVersion =15
    targetSdkVersion =28
}

在某個module的build.gradle中使用配置:

apply plugin: 'com.android.application'
android {
    compileSdkVersion rootProject.ext.compileSdkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion
    defaultConfig {
        applicationId "com.example.liuwangshu.hookinstrumentation"
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
  ...
}
...

2. 使用config.gradle配置
首先在根目錄下創(chuàng)建config.gradle文件來進(jìn)行配置捐祠。
config.gradle

ext{
    android=[
            applicationId:"com.example.liuwangshu.hookinstrumentation",
            compileSdkVersion :28,
            buildToolsVersion :"28.0.3",
            minSdkVersion : 15,
            targetSdkVersion : 28,
    ]

    dependencies =[
            "appcompat-v7" : "com.android.support:appcompat-v7:28.0.0",
            "constraint"  : "com.android.support.constraint:constraint-layout:1.1.3",
    ]
}

接著在項目build.gradle中添加apply from: "config.gradle"碱鳞,這樣項目的所有module都能用config.gradle中定義的參數(shù)。
最后在module的build.gradle中使用配置:

apply plugin: 'com.android.application'
android {
    compileSdkVersion rootProject.ext.android.compileSdkVersion
    buildToolsVersion rootProject.ext.android.buildToolsVersion
    defaultConfig {
        applicationId rootProject.ext.android.applicationId
        minSdkVersion rootProject.ext.android.minSdkVersion
        targetSdkVersion rootProject.ext.android.targetSdkVersion
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
   ...
dependencies {
    implementation rootProject.ext.dependencies["constraint"]
    implementation rootProject.ext.dependencies["appcompat-v7"]
    ...
}

4.2 dependencies 塊

dependencies 塊用于配置該module構(gòu)建過程中所依賴的所有庫踱蛀。Gradle插件3.4版本新增了 api 和 implementation 來代替 compile 配置依賴窿给,其中 api 和此前的 compile是一樣的。dependencies和api主要以下的區(qū)別:

  • implementation可以讓module在編譯時隱藏自己使用的依賴星岗,但是在運(yùn)行時這個依賴對所有模塊是可見的填大。而api與compile一樣,無法隱藏自己使用的依賴俏橘。
  • 如果使用api允华,一個module發(fā)生變化,這條依賴鏈上所有的module都需要重新編譯,而使用implemention靴寂,只有直接依賴這個module需要重新編譯磷蜀。

感謝
https://jeroenmols.com/blog/2017/06/14/androidstudio3/
http://google.github.io/android-gradle-dsl/current/
http://www.androiddocs.com/tools/building/plugin-for-gradle.html
http://www.reibang.com/p/8962d6ba936e
http://www.reibang.com/p/b6744e1e4f7c
《Android群英傳 神兵利器》

更多的內(nèi)容請關(guān)注我的獨(dú)立博客的知識體系:
http://liuwangshu.cn/system/


<div align=center>這里不僅分享大前端、Android百炬、Java等技術(shù)褐隆,還有程序員成長類文章。</div>
<div align=center><img src="https://user-gold-cdn.xitu.io/2019/10/29/16e14c62122499d7?w=234&h=231&f=jpeg&s=34771" width="260"/></div>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末剖踊,一起剝皮案震驚了整個濱河市庶弃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌德澈,老刑警劉巖歇攻,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異梆造,居然都是意外死亡缴守,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門镇辉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屡穗,“玉大人,你說我怎么就攤上這事忽肛〈迳埃” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵麻裁,是天一觀的道長箍镜。 經(jīng)常有香客問我,道長煎源,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任香缺,我火速辦了婚禮手销,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘图张。我一直安慰自己锋拖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布祸轮。 她就那樣靜靜地躺著兽埃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪适袜。 梳的紋絲不亂的頭發(fā)上柄错,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼售貌。 笑死给猾,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的颂跨。 我是一名探鬼主播敢伸,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼恒削!你這毒婦竟也來了池颈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤钓丰,失蹤者是張志新(化名)和其女友劉穎躯砰,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斑粱,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡弃揽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了则北。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片矿微。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖尚揣,靈堂內(nèi)的尸體忽然破棺而出涌矢,到底是詐尸還是另有隱情,我是刑警寧澤快骗,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布娜庇,位于F島的核電站,受9級特大地震影響方篮,放射性物質(zhì)發(fā)生泄漏名秀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一藕溅、第九天 我趴在偏房一處隱蔽的房頂上張望匕得。 院中可真熱鬧,春花似錦巾表、人聲如沸汁掠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽考阱。三九已至,卻和暖如春鞠苟,著一層夾襖步出監(jiān)牢的瞬間乞榨,已是汗流浹背秽之。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留姜凄,地道東北人政溃。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像态秧,于是被迫代替她去往敵國和親董虱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 所有Android插件的基本擴(kuò)展申鱼。 你不需要直接使用這個愤诱,你可以選擇下面幾個合適的直接使用 AppExtensio...
    我該忘了我自己w_u閱讀 3,367評論 0 5
  • 在 Android Studio 構(gòu)建的項目中,基于 Gradle 進(jìn)行項目的構(gòu)建捐友,同時使用 Android DS...
    Ant_way閱讀 7,365評論 0 16
  • 版權(quán)聲明:本文為博主原創(chuàng)文章淫半,未經(jīng)博主允許不得轉(zhuǎn)載。 https://blog.csdn.net/zhaoyanj...
    勤奮的pangdunhu閱讀 2,038評論 0 1
  • 什么是gradle Gradle 是新一代的自動化構(gòu)建工具匣砖,它是一個獨(dú)立的項目科吭,跟 AS、Android 無關(guān)猴鲫,官...
    Boreas_su閱讀 4,222評論 0 5
  • 1.介紹 如果你正在查閱build.gradle文件的所有可選項对人,請點(diǎn)擊這里進(jìn)行查閱:DSL參考 1.1新構(gòu)建系統(tǒng)...
    Chuckiefan閱讀 12,138評論 8 72