Benutzerdefinierte Build-Logik anwenden

In diesem Abschnitt werden erweiterte Themen beschrieben, die nützlich sind, wenn Sie das Android Gradle-Plug-in erweitern oder ein eigenes Plug-in schreiben möchten.

Variantenabhängigkeiten in benutzerdefinierter Logik veröffentlichen

Eine Bibliothek kann Funktionen haben, die andere Projekte oder Teilprojekte verwenden möchten. Beim Veröffentlichen einer Bibliothek wird die Bibliothek für die Nutzer verfügbar gemacht. Bibliotheken können steuern, auf welche Abhängigkeiten ihre Nutzer zur Kompilierungs- und Laufzeit Zugriff haben.

Es gibt zwei separate Konfigurationen, die die transitiven Abhängigkeiten jedes Klassenpfads enthalten, die von Nutzern verwendet werden müssen, um die Bibliothek wie unten beschrieben zu verwenden:

  • variant_nameApiElements: Diese Konfiguration enthält die transitiven Abhängigkeiten, die Nutzern zur Kompilierungszeit zur Verfügung stehen.
  • variant_nameRuntimeElements: Diese Konfiguration enthält die transitiven Abhängigkeiten, die Nutzern zur Laufzeit zur Verfügung stehen.

Weitere Informationen zu den Beziehungen zwischen den verschiedenen Konfigurationen finden Sie unter Java-Bibliotheks-Plug-in-Konfigurationen.

Benutzerdefinierte Strategien zur Auflösung von Abhängigkeiten

Ein Projekt kann eine Abhängigkeit von zwei verschiedenen Versionen derselben Bibliothek enthalten, was zu Abhängigkeitskonflikten führen kann. Wenn Ihr Projekt beispielsweise von Version 1 von Modul A und Version 2 von Modul B abhängt und Modul A transitive Abhängigkeit von Version 3 von Modul B hat, liegt ein Konflikt bei der Abhängigkeitsversion vor.

Um diesen Konflikt zu lösen, verwendet das Android Gradle-Plug-in die folgende Strategie zur Abhängigkeitsauflösung: Wenn das Plug-in erkennt, dass sich verschiedene Versionen desselben Moduls im Abhängigkeitsgraphen befinden, wird standardmäßig die Version mit der höchsten Versionsnummer ausgewählt.

Diese Strategie funktioniert jedoch möglicherweise nicht immer wie gewünscht. Wenn Sie die Strategie zur Abhängigkeitsauflösung anpassen möchten, verwenden Sie die folgenden Konfigurationen, um bestimmte Abhängigkeiten einer Variante aufzulösen, die für Ihre Aufgabe erforderlich sind:

  • variant_nameCompileClasspath: Diese Konfiguration enthält die Auflösungsstrategie für den Compile-Classpath einer bestimmten Variante.
  • variant_nameRuntimeClasspath: Diese Konfiguration enthält die Auflösungsstrategie für den Laufzeit-Classpath einer bestimmten Variante.

Das Android Gradle-Plug-in enthält Getter, mit denen Sie auf die Konfigurationsobjekte der einzelnen Varianten zugreifen können. So können Sie die Abhängigkeitsauflösung mit der Variant API abfragen, wie im folgenden Beispiel gezeigt:

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 {
            ...
        }
    }
}