使用 Fused Library 將多個 Android 程式庫發布為一個程式庫

在包含許多模組的專案中,如果想同時維持清楚的專案結構,並將 Android 程式庫發布給使用者,可能會遇到困難。在許多情況下,需要發布的程式庫數量會比預期多。

與 Android Gradle 外掛程式隨附的 Fused Library 外掛程式,可協助將多個 Android 程式庫模組封裝成單一可發布的 Android 程式庫。這樣一來,您就能視需要在建構中將程式庫的來源程式碼和資源模組化,同時避免在發布時洩漏專案結構。

以單一程式庫的形式發布有以下好處:

  • 簡化依附元件:以單一 AAR 取代多個程式庫依附元件,為使用者簡化專案設定和版本管理
  • 縮減程式庫大小:可能會改善程式碼縮減功能,進而縮小 AAR
  • 提升安全性:可更妥善控管已發布程式庫的內部實作細節

建立融合程式庫

如要建構融合式程式庫,您必須建立新的 Android 模組、新增依附元件,然後發布融合式程式庫。

新增融合程式庫模組

如要使用外掛程式,您必須在專案中新增新的 Android 模組:

在這個範例中,融合程式庫模組會稱為 myFusedLibrary

  1. android.experimental.fusedLibrarySupport=true 新增至 gradle.properties 檔案,即可啟用融合資料庫支援功能。
  2. include(":myFusedLibrary") 附加至 settings.gradle.kts 檔案。
  3. gradle/libs.versions.toml 檔案的 [plugins] 區段下方新增 android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" }
  4. 在頂層 build.gradle.kts 檔案的 plugins 區塊中新增 alias(libs.plugins.android.fusedlibrary) apply false
  5. 如要建立 myFusedLibrary 模組,請建立名為 myFusedLibrary 的新目錄 (在「My Application」上按一下滑鼠右鍵 > 依序點選「New」>「Directory」)。
  6. myFusedLibrary 模組中建立 build.gradle.kts 檔案 (在 myFusedLibrary 模組上按一下滑鼠右鍵 > 依序點選「New」>「File」)。
  7. 將下列內容貼到 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 來覆寫這些值。

Kotlin

 androidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } }
Java 資源 多個程式庫中不得含有相同路徑的 Java 資源檔案,否則會導致建構失敗。

已知問題

Fused Library 是新的外掛程式,我們正在解決已知問題,以滿足所有用途。

  • lint.jar 檔案未包含在融合的 AAR 中
  • 在其他 .aar 檔案中新增檔案依附元件
  • 不支援將 RenderScript 和 Prefab 構件融合

瞭解融合程式庫的依附元件

由於融合式程式庫沒有來源,且實際上會使用 Android 程式庫做為唯一來源,因此您必須瞭解來源。如要列出合併至產出項目的依附元件,以及建構產出項目所需的依附元件,請在融合的程式庫上執行 gradle :report 工作。這些工作會產生 JSON 報表,並儲存在融合程式庫的 build/reports 目錄中。

如要進一步瞭解內部外掛程式依附元件,請執行 gradle :dependencies 工作,查看外掛程式設定的狀態。