Gradle依賴詳解以及編譯問題解決

2021-09-09 08:29:41 字數 1914 閱讀 9954

依賴配置

目前 gradle 版本支援的依賴配置有:implementation、api、compileonly、runtimeonly 和 annotationprocessor。已經廢棄的配置有:compile、provided、apk、providedcompile。此外依賴配置還可以加一些配置項,例如 androidtestimplementation、debugapi 等等。

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

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

api:與 compile 對應,功能完全一樣,會新增依賴到編譯路徑,並且會將依賴打包到輸出(aar 或a pk)。與 implementation 不同,這個依賴可以傳遞,其他 module 無論在編譯時和執行時都可以訪問這個依賴的實現,也就是會洩漏一些不應該不使用的實現。舉個例子,a 依賴 b,b 依賴 c,如果都是使用 api 配置的話,a 可以直接使用 c 中的類(編譯時和執行時)。而如果是使用 implementation 配置的話,在編譯時,a 無法訪問 c 中的類。

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

runtimeonly:與 apk 對應。gradle新增依賴只打包到 apk,執行時使用,但不會新增到編譯路徑。這個沒有使用過。

annotationprocessor:與 compile 對應,用於註解處理器的依賴配置,這個沒用過。

檢視依賴樹

可以檢視單個module或者這個project的依賴,通過執行依賴的 gradle 任務,如下:

如何排除依賴

dependencies 中排除(細粒度)

compile('com.taobao.android:accs-huawei:1.1.2@aar')

全域性配置排除

configurations
禁用依賴傳遞

ompile('com.zhyea:ar4j:1.0') 

configurations.all

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

compile 'com.zhyea:ar4j:1.0@jar'
強制使用某個版本

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

compile('com.zhyea:ar4j:1.0') 

configurations.all

}

在打包時排除依賴

先看乙個示例:

task zip(type: zip) 

}into('')

}

**表示在打 zip 包的時候會過濾掉名稱中包含 「unwanted」 和 「log」 的 jar 包。這裡呼叫的 exclude 方法的引數和前面的例子不太一樣,前面的引數多是 map 結構,這裡則是乙個正規表示式字串。

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

task zip(type: zip) 

}into('')

}

主要是使用 dependencies 中排除和全域性配置排除

gradle依賴問題

1 查依賴 gradle 預設開啟了依賴傳遞意思就是 專案依賴了a,a又依賴了b和c,這時候,我們只需要寫一行 implementation a就行了,由傳遞依賴導致的衝突,預設是以最高版本的依賴為準,要想檢視整個專案的依賴傳遞關係,使用命令 結果 符號的含義 也可以在android studio左...

opencv 編譯庫依賴問題

如果pkg config找到了 lib pc 則就說明我們有 lib pc 庫。而 lib pc 裡則定義了 header和lib的目錄位置。opencv預設pkg config只會尋找 usr share pkgconfig pc 和 usr lib pkgconfig pc usr lib64 ...

Spring依賴迴圈問題解析

spring容器能夠順利例項化以建構函式方式注入方式配置的bean有乙個前提 bean建構函式入參引用的物件必須已經準備就緒。由於這個機制的限制,如果兩個bean都採用建構函式注入,而且都通過建構函式入參引用對方,就會發生類似於執行緒死鎖的迴圈問題。public class car public c...