本文首發於微信公衆號「後廠村碼農」html
相關文章
Gradle核心思想(一)爲何如今要用Gradle?
Gradle核心思想(二)Gradle入門前奏
Gradle核心思想(三)Groovy快速入門指南
Gradle核心思想(四)看似無用,實則重要的Gradle Wrapper
Gradle核心思想(五)通俗易懂的Gradle插件講解
Gradle核心思想(六)自定義Gradle插件的三種方式前端
在Gradle核心思想這個系列中我儘可能避免了Gradle和Android之間的關聯,這是由於在瞭解Gradle的核心思想後,能夠更好的理解Android Gradle,所以這裏強烈建議先閱讀Gradle核心思想系列。 Android Gradle或者Gradle for Android,實際上指的就是Gradle的Android插件,這一篇咱們入個門。android
在Gradle核心思想(五)通俗易懂的Gradle插件講解這篇文章中咱們知道,Gradle有不少插件,爲了支持Android項目的構建,谷歌爲Gradle編寫了Android插件,新的Android構建系統就是由Gradle的Android插件組成的,Gradle是一個高級構建工具包,它管理依賴項並容許開發者自定義構建邏輯。Android Studio使用Gradle wrapper來集成Gradle的Android插件。須要注意的是,Gradle的Android插件也能夠獨立於AndroidStudio運行。 在 Android的官方網站提到了新的Android構建系統主要有如下幾個特色:git
Gradle的Android插件結合Android Studio成爲了目前最爲流行的Android構建系統。程序員
Android Studio中的每一個項目包含一個或多個含有源代碼文件和資源文件的模塊,這些模塊能夠獨立構建、測試或調試,一個Android Studio的模塊類型能夠有如下幾種:github
Android應用程序模塊 Android應用程序模塊可能依賴於庫模塊,儘管許多Android應用程序只包含一個應用程序模塊,構建系統會將其生成一個APK。api
Android 庫模塊 Android庫模塊包含可重用的特定於Android的代碼和資源,構建系統會將其生成一個AAR。bash
App 引擎模塊 包含應用程序引擎集成的代碼和資源。微信
Java 庫模塊 包含可重用的代碼,構建系統會將其生成一個JAR包。app
Android Studio3.3.2 中的Android項目視圖以下所示。
這篇文章主要介紹項目build.gradle和模塊build.gradle。
咱們新建一個Android項目,它的項目build.gradle的內容以下:
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系統才能找到對應的Gradle插件。 若是使用google()
報not found: 'google()'
錯誤,能夠用以下代碼替代:
maven { url 'https://maven.google.com' }
複製代碼
若是你還不理解Gradle插件,能夠查看Gradle核心思想(五)通俗易懂的Gradle插件講解這篇文章。
新建一個Android項目,它的模塊build.gradle的內容以下:
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'
}
複製代碼
apply引入的插件id爲com.android.application,說明當前模塊是一個應用程序模塊,Gradle的Android插件有多個類型分別爲:
Android塊用於描述該Module構建過程當中所用到的全部參數。
Android塊中的defaultConfig塊用於默認配置,經常使用的配置以下所示。
屬性 | 描述 |
---|---|
applicationId | 指定App的包名 |
minSdkVersion | App最低支持的SDK版本 |
targetSdkVersion | 基於哪一個SDK版本開發 |
versionCode | App內部的版本號,用於控制App升級 |
versionName | App版本名稱,也就是發佈的版本號 |
testApplicationId | 配置測試App的包名 |
testInstrumentationRunner | 配置單元測試使用的Runner,默認爲android.test.InstrumentationTestRunner |
proguardFile | ProGuard混淆所使用的ProGuard配置文件 |
proguardFiles | 同時配置多個ProGuard配置文件 |
signingConfig | 配置默認的簽名信息 |
buildTypes塊用於配置構建不一樣類型的APK。 當咱們新建一個項目時,在Android塊已經默認配置了 buildTypes塊:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
複製代碼
在AS的Terminal中執行gradlew.bat build命令,會在該模塊的build/outputs/apk目錄中生成release和debug的APK,雖然只配置了release ,但release和debug是默認配置,即便咱們不配置也會生成。也能夠修改默認的release和debug,甚至能夠自定義構建類型,好比:
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 | 表示是否支持斷點調試 |
jniDebuggable | 表示是否能夠調試NDK代碼 |
buildConfigField | 配置不一樣的開發環境,好比測試環境和正式環境 |
shrinkResources | 是否自動清理未使用的資源,默認值爲false |
zipAlignEnabled | 是否開啓開啓zipalign優化,提升apk運行效率 |
proguardFile | ProGuard混淆所使用的ProGuard配置文件 |
proguardFiles | 同事配置多個ProGuard配置文件 |
signingConfig | 配置默認的簽名信息 |
multiDexEnabled | 是否啓用自動拆分多個Dex的功能 |
用於配置簽名設置,通常用來配置release模式。
屬性 | 描述 |
---|---|
storeFile | 簽名證書文件 |
storePassword | 簽名證書文件的密碼 |
storeType | 簽名證書的類型 |
keyAlias | 簽名證書中密鑰別名 |
keyPassword | 簽名證書中密鑰的密碼 |
signingConfigs {
release {
storeFile file('C:/Users/liuwangshu/.android/release.keystore')
storePassword 'android'
keyAlias 'androidreleasekey'
keyPassword 'android'
}
複製代碼
android塊中除了前面講的defaultConfig塊、buildTypes塊、signingConfigs塊還有其餘的配置塊,這裏列舉一些。
塊 | 描述 |
---|---|
sourceSets | 配置目錄指向 |
productFlavors | 多個渠道配置 |
lintOptions | Lint配置 |
dexOptions | DEX工具配置 |
adbOptions | adb配置 |
packagingOptions | 打包時的相關配置 |
更多的配置塊請參考官方文檔。
若是有多個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配置 首先在根目錄下建立config.gradle文件來進行配置。 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中定義的參數。 最後在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"]
...
}
複製代碼
dependencies 塊用於配置該module構建過程當中所依賴的全部庫。Gradle插件3.4版本新增了 api 和 implementation 來代替 compile 配置依賴,其中 api 和此前的 compile是同樣的。dependencies和api主要如下的區別:
感謝 jeroenmols.com/blog/2017/0… google.github.io/android-gra… www.androiddocs.com/tools/build… www.jianshu.com/p/8962d6ba9… www.jianshu.com/p/b6744e1e4… 《Android羣英傳 神兵利器》