詳解Android使用Gradle統(tǒng)一配置依賴管理
在介紹使用 Gradle 統(tǒng)一配置依賴管理前我們先來(lái)簡(jiǎn)單介紹一下 Gradle, Gradle 是一個(gè)基于 JVM 的構(gòu)建工具,也是一款非常靈活強(qiáng)大的構(gòu)建工具,支持 jcenter、maven、Ivy 倉(cāng)庫(kù),支持傳遞性依賴管理(即 A 依賴 B,B 依賴 C,那么 A 也就可以依賴 C,不用再單獨(dú)去依賴),而不需要遠(yuǎn)程倉(cāng)庫(kù)或者是 pom.xml 和 ivy.xml 配置文件,拋棄了各種繁瑣,基于 Groovy,build 腳本使用 Groovy 編寫
而在我們的 Android studio 中默認(rèn)就是使用 Gradle 來(lái)構(gòu)建管理我們的工程的,在我們的工程構(gòu)建過(guò)程中通常會(huì)創(chuàng)建很多個(gè) Module 來(lái)對(duì)我們的工程進(jìn)行功能以及業(yè)務(wù)上的解耦(也就是模塊化開(kāi)發(fā)),這時(shí)候可能就會(huì)存在一個(gè)問(wèn)題,就是每個(gè) Module 以及 Module 中一些公用庫(kù)的依賴可能會(huì)出現(xiàn)版本不統(tǒng)一的問(wèn)題,包括使用的編譯版本,SDK 的版本等,導(dǎo)致不能打包,這里可以使用 Gradle 統(tǒng)一配置文件來(lái)解決我們的問(wèn)題
首先我們來(lái)看一下,正常情況下我們的項(xiàng)目目錄的 build.gradle 情況:
先看 app 下的 build.gradle:
//說(shuō)明module的類型,com.android.application為程序,com.android.library為庫(kù) apply plugin: 'com.android.application' android { //編譯的 SDK 版本 compileSdkVersion 25 //編譯的 Tools 版本 buildToolsVersion "25.0.2" //默認(rèn)配置 defaultConfig { //應(yīng)用程序的包名 applicationId "com.example.qiudengjiao.activitytest" //支持 SDK 的最低版本 minSdkVersion 15 //支持 SDK 的目標(biāo)版本 targetSdkVersion 25 //版本號(hào) versionCode 1 //版本名 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } //build 類型 buildTypes { release { //混淆是否開(kāi)啟,返回true則開(kāi)啟 minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } //在這里進(jìn)行庫(kù)的依賴 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 支持庫(kù) compile 'com.android.support:appcompat-v7:25.1.0' }
接下來(lái)我們?cè)賮?lái)看一下項(xiàng)目根目錄下的 build.gradle:
//構(gòu)建腳本 buildscript { repositories { //依賴的倉(cāng)庫(kù) jcenter() } dependencies { //項(xiàng)目依賴的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 }
現(xiàn)在我們添加一個(gè) Module 庫(kù),來(lái)看一下我們 Module 庫(kù)下的 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' }
這里我們來(lái)看一下和 app 目錄下的 build.gradle 有什么區(qū)別:
app 目錄下的 build.gradle 是:apply plugin:com.android.application
Module 庫(kù)下的 build.gradle 是:apply plugin:com.android.library
其它的就是版本的不一樣了,要素是一樣的,這里就是我們今天著重要來(lái)介紹的,這里我們看到編譯的 SDK 版本和編譯的 Tools 版本以及支持 SDK 的最低版本等的版本號(hào)都是不一樣的,這里我們就需要來(lái)統(tǒng)一,而我們總不能每次都來(lái)手動(dòng)配置,當(dāng) Module 增多時(shí)則容易出錯(cuò)
解決辦法:
方法一
在項(xiàng)目的根目錄的 build.gradle 里進(jìn)行統(tǒng)一配置如下:
/*在根目錄中配置公用供子模塊調(diào)用*/ 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 情況:
//構(gòu)建腳本 buildscript { repositories { //依賴的倉(cāng)庫(kù) jcenter() } dependencies { //項(xiàng)目依賴的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 } /*在根目錄中配置公用供子模塊調(diào)用*/ 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}", ] }
接下來(lái)我們?cè)?app 的 build.gradle 中進(jìn)行調(diào)用如下:
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 中進(jìn)行調(diào)用如下:
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 對(duì)項(xiàng)目中 app 下的 build.gradle 和 Module 中的 build.gradle 依賴進(jìn)行統(tǒng)一配置的解決,以此類推,更多的 Module 也是如此配置,以后需要版本的更改我們只需要去根目錄 build.gradle 修改即可
方法二
因?yàn)槊總€(gè)人都有自己的配置習(xí)慣,這里我們?cè)偬峁┮环N配置以供大家參考,這里我們?cè)谥黜?xiàng)目的根目錄下創(chuàng)建 config.gradle 來(lái)配置需要的相關(guān)配置信息如下:
config.gradle 里面的配置信息:
/** * 在主項(xiàng)目的根目錄下創(chuàng)建config.gradle文件 * 在這里單獨(dú)處理統(tǒng)一依賴問(wèn)題 * 注意需要在根目錄的build.gradle中進(jìn)行引入 */ 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 引入進(jìn)來(lái),這里特別注意是在根目錄的 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 }
接下來(lái)我們就可以在 Module 中引入使用了,如下:
apply plugin: 'com.android.library' //android配置 def config = rootProject.ext.android //相關(guān)庫(kù)依賴 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' //在這里使用庫(kù)的依賴 compile librarys.supportAppcompat compile librarys.supportV4 compile librarys.suppoutDesign }
到這里我們就成功的引入到了 Module 的 build.gradle 中,以后每個(gè) Module 中的引入都是這樣,實(shí)現(xiàn)了和方法一 同樣的功能,個(gè)人感覺(jué)第二種更好一點(diǎn),大家自己選擇吧,畢竟各有所好,好了,到這里就給大家分享完了在項(xiàng)目中使用 Gradle 統(tǒng)一配置依賴,希望對(duì)大家有用,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
ViewPager 與 Fragment相結(jié)合實(shí)現(xiàn)微信界面實(shí)例代碼
這篇文章主要介紹了ViewPager 與 Fragment相結(jié)合實(shí)現(xiàn)微信界面實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-07-07Android9?雙屏異顯實(shí)現(xiàn)方式思路
這篇文章主要為大家介紹了Android9?雙屏異顯實(shí)現(xiàn)方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06Android中解決RecyclerView各種點(diǎn)擊事件的方法
這篇文章主要介紹了Android中解決RecyclerView各種點(diǎn)擊事件的方法,完美解決RecyclerView點(diǎn)擊事件、長(zhǎng)按事件、子項(xiàng)點(diǎn)擊事件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05Android開(kāi)發(fā)中多進(jìn)程共享數(shù)據(jù)簡(jiǎn)析
這篇文章主要為大家簡(jiǎn)單分析Android開(kāi)發(fā)中多進(jìn)程共享數(shù)據(jù),怎么做才能讓這兩邊共享數(shù)據(jù),感興趣的小伙伴們可以參考一下2016-04-04android簡(jiǎn)易文件管理器實(shí)例(列表式文件目錄)
下面小編就為大家?guī)?lái)一篇android簡(jiǎn)易文件管理器實(shí)例(列表式文件目錄)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04Android學(xué)習(xí)之AppWidget高級(jí)效果
這篇文章主要為大家詳細(xì)介紹了Android學(xué)習(xí)之AppWidget高級(jí)效果的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-08-08Android開(kāi)發(fā)實(shí)現(xiàn)抽屜菜單
這篇文章主要為大家詳細(xì)介紹了Android開(kāi)發(fā)實(shí)現(xiàn)抽屜菜單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11如何利用Flutter實(shí)現(xiàn)酷狗流暢Tabbar效果
這篇文章主要給大家介紹了關(guān)于如何利用Flutter實(shí)現(xiàn)酷狗流暢Tabbar效果的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-02-02