1. 程式人生 > >Android 使用 Gradle 統一配置依賴管理

Android 使用 Gradle 統一配置依賴管理

       在介紹使用 Gradle 統一配置依賴管理前我們先來簡單介紹一下 Gradle, Gradle 是一個基於 JVM 的構建工具,也是一款非常靈活強大的構建工具,支援  jcenter、maven、Ivy 倉庫,支援傳遞性依賴管理(即 A 依賴 B,B 依賴 C,那麼 A 也就可以依賴 C,不用再單獨去依賴),而不需要遠端倉庫或者是 pom.xml 和 ivy.xml 配置檔案,拋棄了各種繁瑣,基於 Groovy,build 指令碼使用 Groovy 編寫

而在我們的 Android studio 中預設就是使用 Gradle 來構建管理我們的工程的,在我們的工程構建過程中通常會建立很多個 Module 來對我們的工程進行功能以及業務上的解耦(也就是模組化開發),這時候可能就會存在一個問題,就是每個 Module 以及 Module 中一些公用庫的依賴可能會出現版本不統一的問題,包括使用的編譯版本,SDK 的版本等,導致不能打包,這裡可以使用 Gradle 統一配置檔案來解決我們的問題

首先我們來看一下,正常情況下我們的專案目錄的 build.gradle 情況:

先看 app 下的 build.gradle:

//說明module的型別,com.android.application為程式,com.android.library為庫
apply plugin: 'com.android.application'

android {

    //編譯的 SDK 版本
    compileSdkVersion 25

    //編譯的 Tools 版本
    buildToolsVersion "25.0.2"

    //預設配置
    defaultConfig {

        //應用程式的包名
        applicationId "com.example.qiudengjiao.activitytest"

        //支援 SDK 的最低版本
        minSdkVersion 15

        //支援 SDK 的目標版本
        targetSdkVersion 25

        //版本號
        versionCode 1

        //版本名
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    //build 型別
    buildTypes {
        release {
            //混淆是否開啟,返回true則開啟
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

//在這裡進行庫的依賴
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })

    testCompile 'junit:junit:4.12'

    //support v7 支援庫
    compile 'com.android.support:appcompat-v7:25.1.0'
}


接下來我們再來看一下專案根目錄下的 build.gradle:

//構建指令碼
buildscript {

    repositories {

        //依賴的倉庫
        jcenter()
    }
    dependencies {
        
        //專案依賴的Gradle版本
        classpath 'com.android.tools.build:gradle:2.2.3'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

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



現在我們新增一個 Module 庫,來看一下我們 Module 庫下的 build.gradle:

apply plugin: 'com.android.library'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        minSdkVersion 13
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

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

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.0.0'
    testCompile 'junit:junit:4.12'
}

這裡我們來看一下和 app 目錄下的 build.gradle 有什麼區別:

app 目錄下的 build.gradle 是:apply plugin:com.android.application

Module 庫下的 build.gradle 是:apply plugin:com.android.library

其它的就是版本的不一樣了,要素是一樣的,這裡就是我們今天著重要來介紹的,這裡我們看到編譯的 SDK 版本和編譯的 Tools 版本以及支援 SDK 的最低版本等的版本號都是不一樣的,這裡我們就需要來統一,而我們總不能每次都來手動配置,當 Module 增多時則容易出錯

解決辦法:

方法一

在專案的根目錄的 build.gradle 裡進行統一配置如下:

/*在根目錄中配置公用供子模組呼叫*/
ext {
    //Android
    compileSdkVersion = 25
    buildToolsVersion = "25.0.2"
    minSdkVersion = 15
    targetSdkVersion = 25

    //Version
    supportLibrary = "25.1.0"

    //supportLibraries dependencies
    supportDependencies = [
            supportAppcompat: "com.android.support:appcompat-v7:${supportLibrary}",
    ]
}

配置完後工程根目錄的 build.gradle 情況:
//構建指令碼
buildscript {

    repositories {

        //依賴的倉庫
        jcenter()
    }
    dependencies {

        //專案依賴的Gradle版本
        classpath 'com.android.tools.build:gradle:2.2.3'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

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

/*在根目錄中配置公用供子模組呼叫*/
ext {
    //Android
    compileSdkVersion = 25
    buildToolsVersion = "25.0.2"
    minSdkVersion = 15
    targetSdkVersion = 25

    //Version
    supportLibrary = "25.1.0"

    //supportLibraries dependencies
    supportDependencies = [
            supportAppcompat: "com.android.support:appcompat-v7:${supportLibrary}",
    ]
}

接下來我們在 app 的 build.gradle 中進行呼叫如下:
apply plugin: 'com.android.application'

android {

    compileSdkVersion rootProject.ext.compileSdkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion

    defaultConfig {

        applicationId "com.example.qiudengjiao.activitytest"
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

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

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'junit:junit:4.12'
    compile rootProject.ext.supportDependencies.supportAppcompat
}

在 Module 的 build.gradle 中進行呼叫如下:
apply plugin: 'com.android.library'

android {

    compileSdkVersion rootProject.ext.compileSdkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion

    defaultConfig {

        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }

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

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    testCompile 'junit:junit:4.12'

    compile rootProject.ext.supportDependencies.supportAppcompat
}

這樣我們就完成了使用 Gradle 對專案中 app 下的 build.gradle 和 Module 中的 build.gradle 依賴進行統一配置的解決,以此類推,更多的 Module 也是如此配置,以後需要版本的更改我們只需要去根目錄 build.gradle 修改即可

方法二

因為每個人都有自己的配置習慣,這裡我們再提供一種配置以供大家參考,這裡我們在主專案的根目錄下建立 config.gradle 來配置需要的相關配置資訊如下:


config.gradle 裡面的配置資訊:

/**
 * 在主專案的根目錄下建立config.gradle檔案
 * 在這裡單獨處理統一依賴問題
 * 注意需要在根目錄的build.gradle中進行引入
 */
ext {
    android = [
            compileSdkVersion: 25,
            buildToolsVersion: "25.0.2",
            minSdkVersion    : 15,
            targetSdkVersion : 25
    ]

    //Version
    supportLibrary = "25.1.0"

    //supportLibraries dependencies
    supportDependencies = [
            supportAppcompat: "com.android.support:appcompat-v7:${supportLibrary}",
            supportV4       : "com.android.support:support-v4:${supportLibrary}",
            suppoutDesign   : "com.android.support:design:${supportLibrary}"
    ]
}

然後我們需要在根目錄的 build.gradle 中把 config.gradle 引入進來,這裡特別注意是在根目錄的 build.gradle 中引入

引入的程式碼為:

apply from: "config.gradle" 

引入後的根目錄 build.gradle 如下:
//在這裡引入config.gradle
apply from: "config.gradle"

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.3'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

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

接下來我們就可以在 Module 中引入使用了,如下:
apply plugin: 'com.android.library'

//android配置
def config = rootProject.ext.android

//相關庫依賴
def librarys = rootProject.ext.supportDependencies

android {
    compileSdkVersion config.compileSdkVersion
    buildToolsVersion config.buildToolsVersion

    defaultConfig {
        minSdkVersion config.minSdkVersion
        targetSdkVersion config.targetSdkVersion
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

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

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    testCompile 'junit:junit:4.12'

    //在這裡使用庫的依賴
    compile librarys.supportAppcompat
    compile librarys.supportV4
    compile librarys.suppoutDesign
}

到這裡我們就成功的引入到了 Module 的 build.gradle 中,以後每個 Module 中的引入都是這樣,實現了和方法一 同樣的功能,個人感覺第二種更好一點,大家自己選擇吧,畢竟各有所好,好了,到這裡就給大家分享完了在專案中使用 Gradle 統一配置依賴,希望對大家有用

如有錯誤請提出,多謝