在開發庫模塊和相關應用時,請注意以下行爲和限制。
向 Android 應用模塊添加對庫模塊的引用後,您可以設置它們的相對優先級。在構建時,庫會按照優先級由低到高的順序逐一與應用合併。
-
資源合併衝突
構建工具會將庫模塊中的資源與相關應用模塊的資源合併。如果這兩個模塊中都定義了給定的資源 ID,系統會使用應用中的資源。
如果多個 AAR 庫之間發生衝突,系統會使用依賴項列表中首先列出的庫(靠近
dependencies
塊頂部)中的資源。爲了避免常用的資源 ID 發生資源衝突,請考慮使用對模塊具有唯一性(或在所有項目模塊之間具有唯一性)的前綴或其他一致的命名方案。
-
在多模塊構建中,系統會將 JAR 依賴項視爲傳遞依賴項
在向輸出 AAR 的庫項目添加 JAR 依賴項時,JAR 會由庫模塊進行處理,並與其 AAR 打包在一起。
不過,如果您的項目包含庫模塊,並且此模塊已被應用模塊使用,應用模塊便會將庫的本地 JAR 依賴項視爲傳遞依賴項。在這種情況下,本地 JAR 將由使用它的應用模塊進行處理,而不是由庫模塊進行處理。這是爲了加快庫代碼更改導致的增量構建的速度。
由本地 JAR 依賴項導致的所有 Java 資源衝突都必須在使用相應庫的應用模塊中解決。
-
庫模塊可以依賴於外部 JAR 庫
您可以開發一個依賴於外部庫(例如 Google 地圖外部庫)的庫模塊。在這種情況下,相關應用必須針對包含此外部庫的目標(例如 Google API 插件)進行構建。另外也要注意,庫模塊和相關應用都必須在其清單文件的
<uses-library>
元素中聲明外部庫。 -
應用模塊的
minSdkVersion
必須等於或大於庫定義的版本庫是作爲相關應用模塊的一部分進行編譯的,因此,庫模塊中使用的 API 必須與應用模塊支持的平臺版本兼容。
-
每個庫模塊都會創建自己的 R 類
在您構建相關應用模塊時,庫模塊會先編譯到 AAR 文件中,然後再添加到應用模塊中。因此,每個庫都有自己的
R
類,並根據庫的軟件包名稱命名。所需的所有軟件包中都會創建從主模塊和庫模塊生成的R
類,包括主模塊的軟件包和庫的軟件包。 -
庫模塊可以包含自己的 ProGuard 配置文件
如果有用於構建和發佈 AAR 的庫項目,您可以向庫的構建配置添加 ProGuard 配置文件,並且 Android Gradle 插件規則適用於您指定的 ProGuard 規則。構建工具會將此文件嵌入到爲庫模塊生成的 AAR 文件中。在您將庫添加到應用模塊後,庫的 ProGuard 文件會附加到應用模塊的 ProGuard 配置文件 (
proguard.txt
)。通過將 ProGuard 文件嵌入到庫模塊中,您可以確保依賴於相應庫的應用模塊不必手動更新其 ProGuard 文件即可使用此庫。當 Android Studio 構建系統構建您的應用時,它會同時使用來自應用模塊和庫的指令。因此無需按照單獨的步驟在庫上運行代碼縮減器。
如需向庫項目添加 ProGuard 規則,您必須使用
consumerProguardFiles
屬性(位於庫的build.gradle
文件的defaultConfig
塊內)指定文件名稱。例如,以下代碼段會將lib-proguard-rules.txt
設爲庫的 ProGuard 配置文件:
android {
defaultConfig {
consumerProguardFiles 'lib-proguard-rules.txt'
}
...
}
不過,如果庫模塊是要編譯到 APK 中的多模塊構建的一部分,並且不會生成 AAR,您應該只在使用相應庫的應用模塊上運行代碼縮減。如需詳細瞭解 ProGuard 規則及其用法,請參閱縮減、混淆處理和優化應用。