Android開發:build.gradle 配置指南

前言

做爲Android開發,咱們幾乎天天都在和builg.gradle打交道,可是你真的知道build.gradle裏的每一行代碼有什麼用嗎?以及builg.gradle到底有哪些做用?本文旨在全面的向你們介紹builg.gradle的做用與使用方法。android

通用配置

在咱們新建項目時,Android Studio 會自動爲咱們生成兩個build.gradle文件,一個位於根目錄,一個位於app文件夾下,下面是gradle文件的構成圖:bash

MyApp
 ├── build.gradle
 └── app
       └── build.gradle
複製代碼

根目錄的build.gradle

該gradle文件是定義在這個工程下的全部模塊的公共屬性,它默認包含兩個個方法:app

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()兩個順序致使的問題,具體記不清了,之後再遇到再更新~maven

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來生成對應渠道信息的包,如:gradle

android { 
    productFlavors {
        xiaomi {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
            applicationId "com.wiky.gradle.xiaomi" //配置包名

        }
        huawei {
            manifestPlaceholders =[UMENG_CHANNEL_VALUE:"huawei"]
        }
        //...
    } 
}

複製代碼
相關文章
相關標籤/搜索