日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一文彻底搞清 Gradle 依赖【转】

發(fā)布時間:2025/5/22 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一文彻底搞清 Gradle 依赖【转】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

來源:曾是放牛娃

www.jianshu.com/p/59fd653a54d2

轉自:https://mp.weixin.qq.com/s?__biz=MzA3MDMyMjkzNg==&mid=2652262838&idx=1&sn=e160fb15de0518fd207fedf5835b3814&chksm=84dc6e21b3abe73735a917ee8c79b3b422f460bb198c3dbc23e0ab776c846ca4fdc22a94e57d&mpshare=1&scene=24&srcid=1221sg5Pt9j9t1TKKqVZgbDz#rd

?

?

?

之前對Android Gradle構建的依賴一直傻傻分不清,這段時間正好接入集團的一個二方庫,踩了很多坑,也順帶把Gradle依賴這塊搞清楚了,主要整理了下Gradle依賴的類型、依賴配置、如何查看依賴、依賴沖突如何解決。

?

依賴類型

?

dependencies DSL標簽是標準Gradle API中的一部分,而不是Android Gradle插件的特性,所以它不屬于android標簽。

?

依賴有三種方式,如下面的例子:

?

apply?plugin:?'com.android.application'

android?{?...?}

dependencies?{
????//?Dependency?on?a?local?library?module
????implementation?project(":mylibrary")

????//?Dependency?on?local?binaries
????implementation?fileTree(dir:?'libs',?include:?['*.jar'])

????//?Dependency?on?a?remote?binary
????implementation?'com.example.android:app-magic:12.3'
}

?

本地library模塊依賴

?

implementation?project(":mylibrary")

?

這種依賴方式是直接依賴本地庫工程代碼的(需要注意的是,mylibrary的名字必須匹配在settings.gradle中include標簽下定義的模塊名字)。

?

本地二進制依賴

?

implementation?fileTree(dir:?'libs',?include:?['*.jar'])

這種依賴方式是依賴工程中的 module_name/libs/目錄下的Jar文件(注意Gradle的路徑是相對于build.gradle文件來讀取的,所以上面是這樣的相對路徑)。

如果只想依賴單個特定本地二進制庫,可以如下配置:

implementation?files('libs/foo.jar',?'libs/bar.jar')

遠程二進制依賴

implementation?'com.example.android:app-magic:12.3'

上面是簡寫的方式,這種依賴完整的寫法如下:

implementation?group:?'com.example.android',?name:?'app-magic',?version:?'12.3'

group、name、version共同定位一個遠程依賴庫。需要注意的點是,version最好不要寫成"12.3+"這種方式,除非有明確的預期,因為非預期的版本更新會帶來構建問題。遠程依賴需要在repositories標簽下聲明遠程倉庫,例如jcenter()、google()、maven倉庫等。

依賴配置

目前Gradle版本支持的依賴配置有:implementation、api、compileOnly、runtimeOnly和annotationProcessor,已經廢棄的配置有:compile、provided、apk、providedCompile。此外依賴配置還可以加一些配置項,例如AndroidTestImplementation、debugApi等等。

常用的是implementation、api、compileOnly三個依賴配置,含義如下:

  • implementation
    與compile對應,會添加依賴到編譯路徑,并且會將依賴打包到輸出(aar或apk),但是在編譯時不會將依賴的實現(xiàn)暴露給其他module,也就是只有在運行時其他module才能訪問這個依賴中的實現(xiàn)。使用這個配置,可以顯著提升構建時間,因為它可以減少重新編譯的module的數(shù)量。建議,盡量使用這個依賴配置。

  • api
    與compile對應,功能完全一樣,會添加依賴到編譯路徑,并且會將依賴打包到輸出(aar或apk),與implementation不同,這個依賴可以傳遞,其他module無論在編譯時和運行時都可以訪問這個依賴的實現(xiàn),也就是會泄漏一些不應該不使用的實現(xiàn)。舉個例子,A依賴B,B依賴C,如果都是使用api配置的話,A可以直接使用C中的類(編譯時和運行時),而如果是使用implementation配置的話,在編譯時,A是無法訪問C中的類的。

  • compileOnly
    與provided對應,Gradle把依賴加到編譯路徑,編譯時使用,不會打包到輸出(aar或apk)。這可以減少輸出的體積,在只在編譯時需要,在運行時可選的情況,很有用。

  • runtimeOnly
    與apk對應,gradle添加依賴只打包到APK,運行時使用,但不會添加到編譯路徑。這個沒有使用過。

  • annotationProcessor
    與compile對應,用于注解處理器的依賴配置,這個沒用過。

查看依賴樹

可以查看單個module或者這個project的依賴,通過運行依賴的Gradle任務,如下:

1、View -> Tools Windows -> Gradle(或者點擊右側的Gradle欄);

2、展開 AppName -> Tasks -> android,然后雙擊運行AndroidDependencies。運行完,就會在Run窗口打出依賴樹了。

?

依賴沖突解決

隨著很多依賴加入到項目中,難免會出現(xiàn)依賴沖突,出現(xiàn)依賴沖突如何解決?

定位沖突

依賴沖突可能會報類似下面的錯誤:

Program?type?already?present?com.example.MyClass

通過查找類的方式(command + O)定位到沖突的依賴,進行排除。

如何排除依賴

1、dependencies中排除(細粒度)

compile('com.taobao.android:accs-huawei:1.1.2@aar')?{
????????transitive?=?true
????????exclude?group:?'com.taobao.android',?module:?'accs_sdk_taobao'
}

2、全局配置排除

configurations?{
????compile.exclude?module:?'cglib'
????//全局排除原有的tnet?jar包與so包分離的配置,統(tǒng)一使用aar包中的內容
????all*.exclude?group:?'com.taobao.android',?module:?'tnet-jni'
????all*.exclude?group:?'com.taobao.android',?module:?'tnet-so'
}

3、禁用依賴傳遞

compile('com.zhyea:ar4j:1.0')?{
????transitive?=?false
}

configurations.all?{
????transitive?=?false
}

還可以在單個依賴項中使用@jar標識符忽略傳遞依賴:

compile?'com.zhyea:ar4j:1.0@jar'

4、強制使用某個版本

如果某個依賴項是必需的,而又存在依賴沖突時,此時沒必要逐個進行排除,可以使用force屬性標識需要進行依賴統(tǒng)一。當然這也是可以全局配置的:

compile('com.zhyea:ar4j:1.0')?{
????force?=?true
}

configurations.all?{
????resolutionStrategy?{
????????force?'org.hamcrest:hamcrest-core:1.3'
????}
}

5、在打包時排除依賴

先看一個示例:

task?zip(type:?Zip)?{
????into('lib')?{
????????from(configurations.runtime)?{
????????????exclude?'*unwanted*',?'*log*'
????????}
????}
????into('')?{
????????from?jar
????????from?'doc'
????}
}

代碼表示在打zip包的時候會過濾掉名稱中包含“unwanted”和“l(fā)og”的jar包。這里調用的exclude方法的參數(shù)和前面的例子不太一樣,前面的參數(shù)多是map結構,這里則是一個正則表達式字符串。

也可以使用在打包時調用include方法選擇只打包某些需要的依賴項:

task?zip(type:?Zip)?{
????into('lib')?{
????????from(configurations.runtime)?{
????????????include?'*ar4j*',?'*spring*'
????????}
????}
????into('')?{
????????from?jar
????????from?'doc'
????}
}

主要是使用dependencies中排除和全局配置排除。

轉載于:https://www.cnblogs.com/longjunhao/p/10160831.html

總結

以上是生活随笔為你收集整理的一文彻底搞清 Gradle 依赖【转】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。