gradle引入子module配置_原創 | 看完此文,你對Gradle的理解又升級了

前言

這一篇來介紹一些Gradle進階的內容,當然進階內容非常多,這篇文章就總結一些相對重要的、常用的一些知識點,比如Gradle的簽名配置和依賴管理。

1.Android簽名文件配置

在一般公司中,當團隊比較小的時候,App的簽名信息都是放到項目中的,甚至會上傳到github上,這樣做很是方便。但隨著團隊人數的增多,這樣做的風險會越來越大,因為簽名信息是重要的資源,這樣就不能將簽名上傳到github上,也就不應該在build.gradle中直接配置簽名。

主要有以下的幾種解決方法:

1.自定義一個簽名配置文件

2.本地~/.gradle/gradle.properties文件中配置簽名信息

1.1 自定義簽名信息文件

首先,在工程的目錄下新建一個文件夾,內部存儲簽名文件和簽名信息文件。簽名文件為gradledemo.jks,簽名信息文件為keystore.properties。keystore.properties中的配置如下所示。

STORE_FILE=../signfiles/gradledemo.jksKEY_ALIAS=gradleSTORE_PASSWORD=jinjiesanbuquKEY_PASSWORD=jinjiesanbuqu

當然不要忘了在.gitignore中將gradledemo.jks和keystore.properties忽略掉。接著在模塊build.gradle中進行配置,如果還不清楚什么是模塊build.gradle和項目build.gradle,看寫給Android開發的Gradle知識體系這篇文章。

在模塊build.gradle中加入如下代碼。

apply plugin: 'com.android.application'android { ...}def setSigningProperties(){ def propFile = file('../signfiles/keystore.properties') if (propFile.canRead()){ def Properties props = new Properties() props.load(new FileInputStream(propFile)) if (props!=null && props.containsKey('STORE_FILE') && props.containsKey('STORE_PASSWORD') &&props.containsKey('KEY_ALIAS') && props.containsKey('KEY_PASSWORD')) { android.signingConfigs.release.storeFile = file(props['STORE_FILE']) android.signingConfigs.release.storePassword = props['STORE_PASSWORD'] android.signingConfigs.release.keyAlias = props['KEY_ALIAS'] android.signingConfigs.release.keyPassword = props['KEY_PASSWORD'] } else { throw new Exception("some key missing") } }else { throw new Exception("keystore.properties not found:" + propFile.absolutePath) }}

setSigningProperties方法用于讀取keystore.properties文件中的簽名文件的信息。

最后在模塊build.gradle中的signingconfigs塊中調用setSigningProperties方法就可以了。

apply plugin: 'com.android.application'android { ... signingConfigs { release { setSigningProperties() } }}

1.2 本地添加簽名信息文件

還可以將簽名文件和簽名信息文件放到本地中。比如簽名文件放到~/.gradle/gradledemo.jks,簽名信息文件放到~/.gradle/keystore.properties。這樣簽名文件和簽名信息文件都不會提交到github上。

keystore.properties的內容如下。

GRADLEDOME_RELEASE_STORE_FILE=~/.gradle/release-key.keystoreGRADLEDOM_RELEASE_KEY_ALIAS=key-aliasGRADLEDOM_RELEASE_STORE_PASSWORD=passGRADLEDOM_RELEASE_KEY_PASSWORD=pass

在模塊build.gradle中的signingconfigs塊中配置簽名,如下所示。

signingConfigs { release { storeFile file(GRADLEDOME_RELEASE_STORE_FILE) storePassword GRADLEDOME_RELEASE_STORE_PASSWORD keyAlias GRADLEDOME_RELEASE_KEY_ALIAS keyPassword GRADLEDOME_RELEASE_KEY_PASSWORD } }

除了這兩點,還可以將簽名文件和簽名信息文件放在專門打包的服務器上,在打包的時候讀取即可。這個涉及的內容就多了,就不在本文進行說明了。

2.Gradle的庫依賴

現在一個Android項目都是需要去引入其他的庫,比如jar、aar、Module等等,現在我們分別來介紹下。下面例子的代碼如果不特意說明均是寫在模塊build.gradle中的。

Gradle的本地庫依賴

關于jar依賴可以按照如下這么寫,可以指定一個也可以指定多個jar。

//依賴引入libs下所有的jarimplementation fileTree(dir:'libs',include:['*.jar'])//指定依賴某一個或幾個jarimplementation files('libs/XXX.jar','libs/XXX.jar')

aar依賴需要額外增加一些語句,如下所示。

android { ... repositories {  flatDir { dirs "libs" } }} dependencies {implementation fileTree(dir:'libs',include:['*.aar'])implementation(name:'XXX',ext:'aar')}

Gradle的本地Module依賴

當項目中有多個Module時,我們需要在settings.gradle中引入,如下所示。

include ':app'include ':library1', ':library2'

接著在模塊build.gradle引入。

implementation project(':library1')

Gradle的遠程庫依賴

當在Android Studio中新建一個項目時,會在項目build.gradle有如下代碼:

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

這些代碼都是默認的,在buildscript和allprojects塊中,通過repositories來引入谷歌的Maven庫和JCenter庫。首先會從谷歌的Maven庫去尋找相應的庫,如果找不到會從JCenter庫中去尋找。

然后在模塊build.gradle加入如下的代碼,就可以引入遠程庫。

implementation group:'com.android.support',name:'appcompat-v7',version:'28.0.0'//簡寫implementation 'com.android.support:appcompat-v7:28.0.0'

3.Gradle的庫依賴管理

隨著Gradle依賴的庫越來越多,那么必然會產生一些問題,比如依賴沖突的問題,為了解決依賴沖突,我們需要先了解Gradle的庫依賴管理的幾個技術點。

3.1 Gradle的依賴傳遞

Gradle默認是支持依賴傳遞的,所以當用到Gradle依賴時一定會涉及到它,是必須要知道的一個知識點。

那什么是依賴傳遞呢?舉一個最簡單的例子。

projectC依賴projectB,projectB依賴projectA,那么projectC就依賴了projectA。

依賴傳遞會產生一些問題,比如重復依賴、依賴錯誤等問題,那么我們可以通過transitive來禁止依賴傳遞。

 implementation('com.xxx.xxx:xxx:3.6.3') { transitive false }

上面禁止了com.xxx.xxx:xxx:3.6.3庫的依賴傳遞,還可以使用如下語句來關閉當前模塊的所有庫的依賴傳遞:

configurations.all { transitive = false}

只不過這樣就需要手動添加當前模塊的每個庫的依賴項,一般不會這么做。

3.2 Gradle的依賴檢查

有了依賴檢查,我們可以解決依賴產生的問題。依賴檢查有很多種方式,分別來介紹下。

使用Gradle的命令行

可以直接使用Gradle的命令行來進行依賴檢查,拿Windows平臺來說,使用cmd進入項目的根目錄,執行gradle :app:dependencies即可,其中app是我們新建工程時默認的模塊的名稱。日志輸出很多,下面截取一部分:

+--- com.android.support:appcompat-v7:28.0.0| +--- com.android.support:support-annotations:28.0.0 //1| +--- com.android.support:support-compat:28.0.0 //2| | +--- com.android.support:support-annotations:28.0.0| | +--- com.android.support:collections:28.0.0| | | --- com.android.support:support-annotations:28.0.0| | +--- android.arch.lifecycle:runtime:1.1.1| | | +--- android.arch.lifecycle:common:1.1.1| | | | --- com.android.support:support-annotations:26.1.0 -> 28.0.0 //3| | | +--- android.arch.core:common:1.1.1| | | | --- com.android.support:support-annotations:26.1.0 -> 28.0.0| | | --- com.android.support:support-annotations:26.1.0 -> 28.0.0| | --- com.android.support:versionedparcelable:28.0.0| | +--- com.android.support:support-annotations:28.0.0| | --- com.android.support:collections:28.0.0 (*)

上面是appcompat-v7:28.0.0庫的依賴樹的一小部分,appcompat-v7:28.0.0依賴了注釋1處和注釋2的庫,注釋2處的庫又依賴了com.android.support:support-annotations:28.0.0和com.android.support:collections:28.0.0,因此當我們引入appcompat-v7:28.0.0時,會自動下載所有它依賴傳遞的庫。注釋3處說明,Gradle在依賴傳遞時,會自動提升依賴傳遞的庫的版本,默認使用最高版本的庫。

使用Gradle面板

除了命令行,還可以使用Android Studio中的右側的Gradle面板,找到app模塊,展開后找到help目錄中的dependencies,如下圖所示。

c50b134ddbe62803a446a08604a9f79d.png

雙擊或者右鍵選擇第一個選項即可執行命令,日志就會在AS中Run窗口中打印出來。

現在再舉個例子,拿我們熟悉的retrofit舉例,在模塊build.gradle中引入retrofit:

implementation 'com.squareup.retrofit2:retrofit:2.6.0'

執行依賴檢查命令,打印的關于retrofit的日志如下:

+--- com.squareup.retrofit2:retrofit:2.6.0| --- com.squareup.okhttp3:okhttp:3.12.0| --- com.squareup.okio:okio:1.15.0

可以很清楚看到retrofit:2.6.0依賴okhttp:3.12.0,而okhttp:3.12.0依賴okio:1.15.0。

這時我們使用3.1小節的transitive試試,修改build.gradle:

 implementation ('com.squareup.retrofit2:retrofit:2.6.0') { transitive false }

執行依賴檢查命令,打印的關于retrofit的日志如下:

+--- com.squareup.retrofit2:retrofit:2.6.0

使用Gradle View插件

如果你覺得前兩種方式查看不方便、不直觀,還可以使用Android Studio的Gradle View插件。

在AS中選擇File-->Settings-->Plugins中搜索gradle view,找到Gradle View插件安裝并重啟AS,如下圖所示。

3e9f5831dc3b2e1a5ccd6e7a7ec0b342.png

接下來選擇View-–>Tools Windows--Gradle View,這時就可以在AS的底部發現Gradle View窗口,里面會顯示當前項目的所有依賴樹,如下圖所示。

b59e198b2aafd3e2dd8ade326db7b732.png

3.3 Gradle的依賴沖突

依賴沖突產生的原因多是庫的版本問題,舉個例子,如果在build.gradle中這么寫:

 implementation 'com.squareup.retrofit2:retrofit:2.6.0' implementation 'com.squareup.okio:okio:1.14.0'

在3.2小節中,我們知道retrofit:2.6.0依賴的okio的版本是1.15.0,而這里引入的okio的版本為1.14.0,引入的版本不同就會產生依賴沖突。依賴沖突的解決的關鍵有兩點,一個是Gradle的依賴檢查,這個在3.2小節已經講過了,另一個是利用Gradle的關鍵字,合理利用它們是解決依賴沖突的關鍵,在3.1小節已經介紹了 transitive,現在介紹其余的。

3.3.1 force

有時候我們不是想要排除某個庫,而是需要強制使用統一的庫的版本,force可以強制設置模塊的庫的版本,在模塊build.gradle中加入如下代碼。

configurations.all { resolutionStrategy { force 'com.squareup.okio:okio:2.1.0' }}dependencies {...}

強制當前模塊的okio的版本為2.1.0,使用依賴檢查來查看下retrofit的依賴:

+--- com.squareup.retrofit2:retrofit:2.6.0| --- com.squareup.okhttp3:okhttp:3.12.0| --- com.squareup.okio:okio:1.15.0 -> 2.1.0--- com.squareup.okio:okio:1.14.0 -> 2.1.0

可以看到okio的版本都被強制升級到了2.1.0,這樣就可以解決一些依賴沖突的問題。

3.3.2 exclude

有些時候需要排除庫依賴傳遞中涉及的庫,此時不能靠關閉依賴傳遞來解決問題,這時可以使用exclude。

我們知道com.android.support:appcompat-v7:28.0.0依賴于com.android.support:support-annotations:28.0.0、com.android.support:support-compat:28.0.0、com.android.support:cursoradapter:28.0.0等庫,這時我們不想再依賴support-annotations庫,可以這么寫。

configurations { all*.exclude group: 'com.android.support', module: 'support-annotations'}dependencies {...}

使用依賴檢查來查看com.android.support:appcompat-v7:28.0.0的依賴:

+--- com.android.support:appcompat-v7:28.0.0| +--- com.android.support:support-compat:28.0.0| | +--- com.android.support:collections:28.0.0| | +--- android.arch.lifecycle:runtime:1.1.1| | | +--- android.arch.lifecycle:common:1.1.1| | | --- android.arch.core:common:1.1.1| | --- com.android.support:versionedparcelable:28.0.0| | --- com.android.support:collections:28.0.0| +--- com.android.support:collections:28.0.0| +--- com.android.support:cursoradapter:28.0.0

和3.2節的日志對比下,可以發現com.android.support:appcompat-v7:28.0.0不再依賴com.android.support:support-annotations:28.0,目的達到了。

原文:http://liuwangshu.cn/application/android-gradle/2-gradle-dependency.html作者:劉望舒來源:博客園

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/529892.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529892.shtml
英文地址,請注明出處:http://en.pswp.cn/news/529892.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ajax發送私信,$.ajax()方法詳解

jquery中的ajax方法參數總是記不住,這里記錄一下。1.url:要求為String類型的參數,(默認為當前頁地址)發送請求的地址。2.type:要求為String類型的參數,請求方式(post或get)默認為get。注意其他http請求方法,例如put和delete也可以…

怎樣制作線段動畫_OPPO又開發布會!這兩個PPT動畫太炫了,榮獲網友清一色好評...

前兩天,OPPO在線上發布了find X2系列,觀看發布會直播的時候,真的有被發布會的開場驚艷到,視覺體驗太震撼了。這是我隨便錄的一個動畫,滿滿的視覺沖擊力:在看完發布會之后,我對整場發布會印象最深…

文件服務器的文件設置只讀,服務器設置文件為只讀

服務器設置文件為只讀 內容精選換一換有,該NTP服務器僅限于在華為云控制臺上購買的彈性云服務器安裝使用。如需在購買的彈性云服務器上安裝NTP服務器,您可以選擇使用華為云控制臺自己提供的NTP服務器,也可以選擇其他NTP服務器。安裝NTP服務器…

matlab三位畫圖_matlab 3D繪圖詳解(示例代碼)

1、三維曲線: plot3() →plot3(X1,Y1,Z1,...) →plot3(X1,Y1,Z1,LineSpec,...) →plot3(...,‘PropertyName‘,PropertyValue,...) →h = plot3(...) plot3( )的用法與plot( )類似,只是多了一個 Z 數組。舉例: >> t=[0:0.2:10*pi]; >> x=2*t; >> y=sin(t)…

手機修改ntp服務器地址,修改手機ntp服務器ip地址

修改手機ntp服務器ip地址 內容精選換一換本文介紹使用云手機服務時需要了解的基本概念。云手機是一臺包含原生安卓操作系統,具有虛擬手機功能的云服務器,簡單來說,云手機云服務器Android OS。您可以遠程實時控制云手機,實現安卓AP…

圖像控制點 形變_基于控制點的圖象變形方法及其應用

基于控制點的圖象變形方法及其應用楊金鐘;劉政凱;俞能海;吳皓【期刊名稱】《中國圖象圖形學報》【年(卷),期】2001(006)011【摘要】根據人臉,特別是根據人臉在人眼變形中對形狀和細節的要求,提出了用光滑不等距插值和空間可變線性插值方法來實現基于控制點網格的數字圖象變形的…

window10維護不了華為服務器,win10怎么打開云服務器異常

win10怎么打開云服務器異常 內容精選換一換本節介紹如何查看云服務器的mac地址。云服務器的mac地址不支持修改。登錄Linux云服務器。執行以下命令,查看云服務器的mac地址。ifconfig查看MAC地址ifconfig登錄Linux云服務器。執行以下命令,查看云服務器的ma…

命令行cd到_前端(只)需要掌握這些命令行(就還行了)

練習windows 用戶在任意目錄使用 shift 右鍵 打開 cmd 或者 powershell;或通過其他方式打開命令行cd ~/Desktop 回車恭喜你在命令行里進入了桌面輸入命令 mkdir demo1cd demo1 進入目錄cd .. 回退到桌面rm -rf demo1 刪除目錄,其中 -r 表示遞歸地刪除路…

怎么在win7鏈接無線網絡連接服務器,Win7系統網絡連接一直顯示正在獲取網絡地址但是連不上網解決方法...

電腦上不了網的原因很多,比如是網絡設置問題、路由器問題、運營商問題。最近一個Win7用戶,網絡連接一直顯示,正在獲取網絡地址但是連不上網,但是其它電腦可以上網,那么說明是電腦設置問題,那么該如何解決呢…

工況密度和標況密度怎么換算_什么是載流量?導線的載流量與電流密度怎么計算?圖文詳解!...

(1)導線規格在國標《GB/T3956-2008 電纜的導體》中,我們能看到國家對電纜導線的截面積進行標準化。按照國標規定,標稱的電纜導線規格如下(單位mm2):0.5、0.75、1、1.5、2.5、4、6、10、16、25、35、50、70、95、120、150、185、240、300、400…

assume用法及意思_詞匯精選:assume的用法和辨析

一、詳細釋義:v.假定;臆斷 [T]例句:You assume his innocence before hearing the evidence against him.在未聽到對他不利的證言之前,你假定他是無罪的。例句:I assume that it is so.我假定它是這樣。例句&#xff1…

把iconfront的資源放cdn訪問_詳解mpvue小程序中怎么引入iconfont字體圖標

前言iconfont阿里巴巴矢量圖標庫是我很喜歡的一個網站,可以下載/在線編輯/上傳自己需要的矢量圖標,也支持團隊協作,那么在mpvue項目中如何引入呢?將圖標加入購物車搜索關鍵詞可以是中文也可以是英文下載素材點擊網站右上角的購物車…

卸載cuda_NVIDIA驅動和CUDA安裝

切換到集成顯卡(X.Org X server)2. 卸載舊驅動sudo apt-get --purge remove nvidia* sudo apt autoremove # To remove CUDA Toolkit: $ sudo apt-get --purge remove "*cublas*" "cuda*" # To remove NVIDIA Drivers: $ sudo apt-g…

html加粗字體打印失效_論文格式要求及字體大小

點擊上方“藍字”帶你去看小星星論文既是探討問題進行學術研究的一種手段,又是描述學術研究成果進行學術交流的一種工具。下面小編為大家整理了論文格式要求及字體大小,歡迎閱讀。1 02封面題目:小二號黑體加粗居中。各項內容:四號…

deepfakes怎么用_[mcj]deepfakesApp使用說明(1)

在眾多AI換臉軟件中Fakeapp是傳播最廣,操作最簡單的一款,當然他同樣也是源于Deepfakes。 這款軟件在設計上的確是花了一些心事,只需稍加點撥,哪怕是再小白的人也能學會。下面我就做一個入門教程吧。跟著這個教程來,你肯…

alert 標題_[SwiftUI 知識碎片] Button、Image 和 Alert

譯自 Buttons and images更多內容,歡迎關注公眾號:Swift花園喜歡文章?不如來個 ?三連?關注專欄,關注我 Button 和 Image在 SwiftUI 中,按鈕可以由兩種方式創建,取決于它們的外觀。最簡單的方式…

兩個mysql表對比_mysql實用技巧之比較兩個表是否有不同數據的方法分析

本文實例講述了mysql比較兩個表是否有不同數據的方法。分享給大家供大家參考,具體如下:在數據遷移中,我們經常需要比較兩個表,以便在一個表中標識另一個表中沒有相應記錄的記錄。例如,我們有一個新的數據庫&#xff0c…

mysql數據存儲到指定位置_Mysql數據庫表分區存儲到指定磁盤路徑

. 前提:mysql5.6.6以上的版本以上的版本才支持單表指定目錄,且目錄權限是MySQL:mysql。 在mysql中數據文件存放于在my.cnf中datadir指定的路徑,使用的表引擎不同產生的文件格式、表文件個數也會有所差異。 mysql的表引擎有多種,…

roslyn分析字符串代碼_.NET 5 源代碼生成器——MediatR——CQRS

在這篇文章中,我們將探索如何使用.NET 5中的新source generator特性,使用MediatR庫和CQRS模式自動為系統生成API。中介者模式中介模式是在應用程序中解耦模塊的一種方式。在基于web的應用程序中,它通常用于將前端與業務邏輯的解耦。在.NET平臺…

mysql跟memcache的區別_MySQL-mysql Memory Storage Engine 和memcache到底有何不同?各自的優缺點是什么?...

Memory存儲引擎將表的數據存放在內存中,默認使用哈希索引,memcache同樣是使用哈希的方式將數據存在內存中,不過它們還是有比較大的區別的,我列幾條:1.MEMORY表使用固定的記錄長度格式,像VARCHAR這樣的可變長…