在包含許多模組的專案中,如果想同時維持清楚的專案結構,並將 Android 程式庫發布給使用者,可能會遇到困難。在許多情況下,需要發布的程式庫數量會比預期多。
與 Android Gradle 外掛程式隨附的 Fused Library 外掛程式,可協助將多個 Android 程式庫模組封裝成單一可發布的 Android 程式庫。這樣一來,您就能視需要在建構中將程式庫的來源程式碼和資源模組化,同時避免在發布時洩漏專案結構。
以單一程式庫的形式發布有以下好處:
- 簡化依附元件:以單一 AAR 取代多個程式庫依附元件,為使用者簡化專案設定和版本管理
- 縮減程式庫大小:可能會改善程式碼縮減功能,進而縮小 AAR
- 提升安全性:可更妥善控管已發布程式庫的內部實作細節
建立融合程式庫
如要建構融合式程式庫,您必須建立新的 Android 模組、新增依附元件,然後發布融合式程式庫。
新增融合程式庫模組
如要使用外掛程式,您必須在專案中新增新的 Android 模組:
在這個範例中,融合程式庫模組會稱為 myFusedLibrary
。
- 將
android.experimental.fusedLibrarySupport=true
新增至gradle.properties
檔案,即可啟用融合資料庫支援功能。 - 將
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 程式庫類似,但您必須考量一些重要差異,才能正確發布融合式程式庫:
- 您也必須將 Maven Publish 外掛程式套用至已套用 Fused Library 外掛程式的任何模組。
- 發布項目必須繼承自
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。
- 不支援使用資料繫結的 Fusing 程式庫。
- 您無法在單一融合程式庫中融合多個建構類型和產品變種版本。為不同變化版本建立個別的融合程式庫。
為了平衡所需的設定量和易用性,外掛程式會在模糊的衝突中導致建構失敗,或是在融合構件時使用經驗法則。如需瞭解如何融合成果物,請參閱下表:
類型 | 行為 |
---|---|
類別 | 具有相同類別路徑的程式庫會在融合程式庫時導致建構失敗。 |
Android 資源 | 資源合併作業會在選取不同資源時,考量指定的依附元件順序。 |
AAR 中繼資料 | 系統會根據各依附元件程式庫中最高的值,優先合併 AAR 中繼資料版本。我們提供 DSL 來覆寫這些值。KotlinandroidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } } |
Java 資源 | 多個程式庫中不得含有相同路徑的 Java 資源檔案,否則會導致建構失敗。 |
已知問題
Fused Library 是新的外掛程式,我們正在解決已知問題,以滿足所有用途。
lint.jar
檔案未包含在融合的 AAR 中- 在其他 .aar 檔案中新增檔案依附元件
- 不支援將 RenderScript 和 Prefab 構件融合
瞭解融合程式庫的依附元件
由於融合式程式庫沒有來源,且實際上會使用 Android 程式庫做為唯一來源,因此您必須瞭解來源。如要列出合併至產出項目的依附元件,以及建構產出項目所需的依附元件,請在融合的程式庫上執行 gradle :report
工作。這些工作會產生 JSON 報表,並儲存在融合程式庫的 build/reports
目錄中。
如要進一步瞭解內部外掛程式依附元件,請執行 gradle :dependencies
工作,查看外掛程式設定的狀態。