前言
作為Android開發,我們幾乎每天都在和builg.gradle
打交道,但是你真的知道build.gradle
裡的每一行程式碼有什麼用嗎?以及builg.gradle
到底有哪些作用?本文旨在全面的向大家介紹builg.gradle
的作用與使用方法。
通用配置
在我們新建專案時,Android Studio 會自動為我們生成兩個build.gradle
檔案,一個位於根目錄,一個位於app
資料夾下,下面是gradle檔案的構成圖:
MyApp
├── build.gradle
└── app
└── build.gradle
複製程式碼
根目錄的build.gradle
該gradle檔案是定義在這個工程下的所有模組的公共屬性,它預設包含兩個個方法:
buildscript {//這裡是gradle指令碼執行所需依賴,分別是對應的maven庫和外掛
repositories {
google()//可以引用google上的開源專案
jcenter()//宣告瞭jcenter()配置,可以引用 jcenter 上的開源專案
}
dependencies {
//此處是 android 的外掛 gradle 及其版本號
classpath 'com.android.tools.build:gradle:3.5.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
//這裡是專案本身需要的依賴,比如專案所需的 maven 庫
repositories {
google()
jcenter()
}
}
// 這是一個 task 任務,執行 clean project 時執行此 task。可以理解為一個函式
// 該任務繼承自 Delete,刪除根目錄中的 build 目錄。
// 相當於執行 Delete.delete(rootProject.buildDir)。
task clean(type: Delete) {
delete rootProject.buildDir
}
複製程式碼
buildscript 方法是定義了全域性的相關屬性,repositories 定義了 jcenter 作為倉庫。一個倉庫代表著你的依賴包的來源,例如 maven 倉庫。dependencies 用來定義構建過程。實際開發時,缺少某些倉庫來源是會出錯的,我記得還有一次是google()、jcenter()兩個順序導致的問題,具體記不清了,以後再遇到再更新~
allprojects 方法可以用來定義各個模組的預設屬性,你可以不僅僅侷限於預設的配置,未來你可以自己創造 tasks 在 allprojects 方法體內,這些 tasks 將會在所有模組中可見。
app資料夾下的build.gradle檔案
// 宣告是Android程式,
//com.android.application 表示這是一個應用程式模組
//com.android.library 標識這是一個庫模組
//而這區別:前者可以直接執行,後者只能被匯入別的應用作為一個模組。
apply plugin: 'com.android.application'
android {//配置專案構建的各種屬性
compileSdkVersion 29 //編譯時使用 Android版本
buildToolsVersion "29.0.1" //編譯時使用的構建工具的版本
defaultConfig {
applicationId "com.skyworth.myapplication" //專案包名
minSdkVersion 23 //最低相容Android版本
targetSdkVersion 29 //目標版本
versionCode 1 //版本號
versionName "1.0" //版本名
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" //表明要使用AndroidJUnitRunner進行單元測試
}
buildTypes {// 自動化打包配置
release {
minifyEnabled false //是否混淆
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' //混淆用的規則檔案
}
}
}
dependencies {
//各種依賴,包括本地的jar包
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
}
複製程式碼
以上就是我們最常見的常規配置,但是往往我們都有更復雜的需求,下面簡單介紹幾個常見的問題及其解決程式碼。
如何修改編譯生成的 apk 的名字?
一般情況下,預設配置生成的 apk 檔名叫做app-debug.apk
。但是我們在開發中為了方便最好是要對這些 apk 進行區分命名的,下面程式碼就是為我們生成 apk 進行了合理的命名。例如:HelloWorld_1.0_debug.apk
,由 APP 名稱 + 版本號 + 簽名名稱
組成。
// 設定apk的名稱
android.applicationVariants.all { variant ->
variant.outputs.all { output ->
outputFileName ="LocalMedia_${defaultConfig.versionName}_${variant.name}.apk"
}
}
複製程式碼
遇到依賴衝突怎麼辦?
當專案中依賴的第三方庫越來越多時,有可能會出現兩個依賴庫中存在同一個(名稱)檔案。如果這樣,Gradle 在打包時就會提示錯誤(警告)。那麼就可以根據提示,然後使用以下方法將重複的檔案剔除,比較常用的是通過 exclude 去除重複的檔案,例如:
defaultConfig {
//省略
packagingOptions {
exclude "lib/mips/libRSSupport.so"
exclude 'lib/arm64-v8a/libRSSupport.so'
exclude 'lib/armeabi-v7a/librsjni.so'
exclude 'lib/x86/libRSSupport.so'
exclude 'lib/x86_64/libRSSupport.so'
exclude 'lib/armeabi-v7a/libRSSupport.so'
exclude 'lib/arm64-v8a/librsjni.so'
exclude 'lib/x86/librsjni.so'
exclude 'lib/x86_64/librsjni.so'
}
}
複製程式碼
如何多渠道配置?
這個配置是經常會使用到的,通常在適配多個渠道的時候,需要為特定的渠道做部分特殊的處理,比如設定不同的包名、應用名等。場景:當我們使用友盟統計時,通常需要設定一個渠道ID,那麼我們就可以利用productFlavors來生成對應渠道資訊的包,如:
android {
productFlavors {
xiaomi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
applicationId "com.wiky.gradle.xiaomi" //配置包名
}
huawei {
manifestPlaceholders =[UMENG_CHANNEL_VALUE:"huawei"]
}
//...
}
}
複製程式碼