套用自訂建構邏輯

本節說明當您想要擴充 Android Gradle 外掛程式或自行編寫外掛程式時實用的進階主題。

將變化版本依附元件發布至自訂邏輯

程式庫具有可供其他專案或子專案使用的功能。發布程式庫是提供程式庫給消費者的過程。程式庫可控管消費者在編譯時間和執行階段期間可存取哪些依附元件。

有兩種不同的設定會沿用每個類別路徑的遞移依附元件,讓消費者必須依下列說明使用程式庫:

  • variant_nameApiElements:這項設定會沿用消費者在編譯期間可用的遞移依附元件。
  • variant_nameRuntimeElements:這項設定會沿用執行階段提供給消費者的遞移依附元件。

如要進一步瞭解不同設定之間的關係,請參閱「Java 程式庫外掛程式設定」。

自訂依附元件解決策略

專案可能包含相同程式庫中兩個不同版本的依附元件,進而產生依附元件衝突。舉例來說,假使專案依附了模組 A 的第 1 版和模組 B 的第 2 版,而 A 模組間接仰賴模組 B 的第 3 版,則會產生依附元件版本衝突。

為解決這項衝突,Android Gradle 外掛程式採用下列依附元件解決方案:當外掛程式檢測到同一個模組的不同版本在依附元件圖形中時,根據預設,會選擇版本編號最高的那個。

然而,這項策略不一定每次都能如預期運作。如要自訂依附元件解決策略,請使用下列設定來解決工作需要的某個變數的特定依附元件:

  • variant_nameCompileClasspath:此設定包含特定變數的編譯類別路徑的解析度策略。
  • variant_nameRuntimeClasspath:此設定包含特定變數執行階段類別路徑的解析度策略。

您可透過 Android Gradle 外掛程式取得 getter,以便存取每個變數的設定物件。因此,您可以使用變數 API 查詢依附元件解析度,如下方範例所示:

Kotlin

android {
    applicationVariants.all {
        // Return compile configuration objects of a variant.
        compileConfiguration.resolutionStrategy {
        // Use Gradle's ResolutionStrategy API
        // to customize how this variant resolves dependencies.
            ...
        }
        // Return runtime configuration objects of a variant.
        runtimeConfiguration.resolutionStrategy {
            ...
        }
        // Return annotation processor configuration of a variant.
        annotationProcessorConfiguration.resolutionStrategy {
            ...
        }
    }
}

Groovy

android {
    applicationVariants.all { variant ->
        // Return compile configuration objects of a variant.
        variant.getCompileConfiguration().resolutionStrategy {
        // Use Gradle's ResolutionStrategy API
        // to customize how this variant resolves dependencies.
            ...
        }
        // Return runtime configuration objects of a variant.
        variant.getRuntimeConfiguration().resolutionStrategy {
            ...
        }
        // Return annotation processor configuration of a variant.
        variant.getAnnotationProcessorConfiguration().resolutionStrategy {
            ...
        }
    }
}