本文首發(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項目視圖如下所示努溃。
所有構(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>