在模組眾多的專案中,您可能難以將 Android 程式庫發布給使用者,同時維持清楚的專案結構。在許多情況下,需要發布的程式庫比預期多。
Android Gradle 外掛程式隨附的 Fused Library 外掛程式,可協助將多個 Android 程式庫模組封裝成單一可發布的 Android 程式庫。這樣一來,您就能在建構作業中,視需要將程式庫的原始碼和資源模組化,同時避免在發布後公開專案結構。
以單一程式庫形式發布可帶來以下好處:
- 簡化依附元件:以單一 AAR 取代多個程式庫依附元件,為使用者簡化專案設定和版本管理
- 縮減程式庫大小:可改善程式碼縮減功能,進而縮小 AAR
- 提升安全性:可更妥善控管已發布程式庫的內部實作詳細資料
建立合併媒體庫
如要建構合併程式庫,您必須建立新的 Android 模組、新增依附元件,然後發布合併程式庫。
新增融合程式庫模組
如要使用這個外掛程式,請在專案中新增 Android 模組:
在本範例中,融合程式庫模組會稱為 myFusedLibrary
。
- 在
gradle.properties
檔案中新增android.experimental.fusedLibrarySupport=true
,啟用融合程式庫支援功能。 - 將
include(":myFusedLibrary")
附加至settings.gradle.kts
檔案。 - 在
gradle/libs.versions.toml
檔案的[plugins]
區段下方新增android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" }
。 - 在頂層
build.gradle.kts
檔案的 plugins 區塊中新增alias(libs.plugins.android.fusedlibrary) apply false
。 - 如要建立
myFusedLibrary
模組,請建立名為myFusedLibrary
的新目錄 (依序在「My Application」上按一下滑鼠右鍵 >「New」>「Directory」)。 - 在
myFusedLibrary
模組中建立build.gradle.kts
檔案 (在myFusedLibrary
模組上按一下滑鼠右鍵 >「New」>「File」)。 - 將下列內容貼到
myFusedLibrary/build.gradle.kts
檔案中:
Kotlin
plugins { alias(libs.plugins.android.fusedlibrary) `maven-publish` } androidFusedLibrary { namespace = "com.example.myFusedLibrary" minSdk = 21 } dependencies { }
Groovy
plugins { id 'fused-library' } androidFusedLibrary { namespace 'com.example.myFusedLibrary' minSdk 21 } dependencies { }
新增依附元件
融合程式庫的核心功能是將依附元件組合在一起。外掛程式支援新增本機專案依附元件和外部程式庫。如要指定要封裝的依附元件,請使用 include
設定。
不會封裝遞移依附元件。
例如:
Kotlin
dependencies { include(project(":image-rendering")) include("mycoolfonts:font-wingdings:5.0") }
Groovy
dependencies { include project(':image-rendering') include 'mycoolfonts:font-wingdings:5.0' }
發布合併程式庫
發布融合程式庫前,請先熟悉發布 Android 程式庫。發布合併程式庫與發布 Android 程式庫類似,但有幾項主要差異,您必須考量這些差異,才能正確發布合併程式庫:
- 此外,凡是套用 Fused Library 外掛程式的模組,都必須套用 Maven Publish 外掛程式。
- 發布項目必須繼承自
fusedLibraryComponent
,因為這會提供編譯融合程式庫構件所需的依附元件。
以下是發布項目的設定範例:
Kotlin
plugins { alias(libs.plugins.android.fusedlibrary) `maven-publish` } androidFusedLibrary { … } dependencies { … } publishing { publications { register<MavenPublication>("release") { groupId = "my-company" artifactId = "my-fused-library" version = "1.0" from(components["fusedLibraryComponent"]) } } }
Groovy
plugins { id 'fused-library' id 'maven-publish' } androidFusedLibrary { … } dependencies { … } publishing { publications { release(MavenPublication) { groupId = "my-company" artifactId = "my-fused-library" version = "1.0" afterEvaluate { from components.fusedLibraryComponent } } }
發布融合程式庫以進行測試
您應根據 Android 應用程式或 Android 程式庫中發布的融合程式庫進行測試。建議的方法是將融合程式庫及其專案依附元件發布至本機 Maven 存放區。
如要將合併程式庫構件發布至本機存放區,請定義類似下列的設定:
Kotlin
plugins { alias(libs.plugins.android.fusedlibrary) `maven-publish` } repositories { maven { name = "myLocalRepo" url = uri(layout.buildDirectory.dir("myLocalRepo")) } }
Groovy
plugins { id 'fused-library' id 'maven-publish' } repositories { maven { name 'myLocalRepo' url layout.buildDirectory.dir('myLocalRepo') } }
上傳合併後的程式庫
如要發布合併後的程式庫,請參閱「上傳程式庫」。
行為和安全措施
合併 Android 程式庫的過程相當複雜,外掛程式可能難以判斷優先順序。舉例來說,如果兩個程式庫具有相同的類別路徑,在融合程式庫時就會導致建構失敗。如果不同程式庫中有名稱相同的資源,資源合併時會考量選取資源時指定的依附元件順序。
- 如要新增為依附元件,融合程式庫只能以 Android 程式庫構件 AAR 形式發布。
- 不支援合併使用資料繫結的程式庫。
- 您無法在單一合併程式庫中合併多個建構類型和產品變種版本。為不同變體建立個別的融合程式庫。
為平衡所需設定量和易用性,外掛程式會在發生模稜兩可的衝突時導致建構失敗,或在融合構件時使用啟發式方法。下表詳細說明如何融合構件:
類型 | 行為 |
---|---|
類別 | 如果程式庫具有相同的類別路徑,在融合程式庫時就會導致建構失敗。 |
Android 資源 | 如果選取不同位置中名稱相同的資源,資源合併作業會考量指定的依附元件順序。 |
AAR 中繼資料 | 系統會合併 AAR 中繼資料版本,並優先採用每個依附元件程式庫中的最高值。系統提供 DSL,可覆寫這些值。KotlinandroidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } } |
Java 資源 | 多個程式庫中不得有路徑相同的 Java 資源檔案,否則建構作業會失敗。 |
已知問題
Fused Library 是新外掛程式,目前已知有問題,我們正在努力解決,以滿足所有用途。
- 無法產生來源 JAR 檔案
- 在其他 .aar 檔案中新增檔案依附元件
- 不支援融合 RenderScript 和 Prefab 構件
瞭解融合程式庫的依附元件
由於融合程式庫沒有來源,且實際上只使用 Android 程式庫做為來源,因此瞭解來源非常重要。如要列出合併至結果構件的依附元件,以及建構構件所需的依附元件,請在合併的程式庫上執行 gradle :report
工作。這項工作會產生 JSON 報表,並儲存在融合程式庫的 build/reports
目錄中。
如要進一步瞭解內部外掛程式依附元件,請執行 gradle :dependencies
工作,查看外掛程式設定的狀態。