Benutzerdefinierte Build-Logik anwenden

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

Variantenabhängigkeiten in benutzerdefinierter Logik veröffentlichen

Eine Bibliothek kann Funktionen enthalten, die andere Projekte oder Unterprojekte möglicherweise verwenden möchten. Die Veröffentlichung einer Bibliothek ist der Vorgang, durch den sie ihren Nutzern zur Verfügung gestellt wird. Bibliotheken können steuern, auf welche Abhängigkeiten ihre Nutzer zur Kompilierungszeit 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 nutzen:

  • variant_nameApiElements: Diese Konfiguration enthält die transitiven Abhängigkeiten, die den Nutzern zum Kompilierungszeitpunkt 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 Konfigurationen des Java-Bibliothek-Plug-ins.

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 vorübergehend von Version 3 von Modul B abhängt, entsteht ein Abhängigkeitsversionskonflikt.

Um diesen Konflikt zu beheben, verwendet das Android-Gradle-Plug-in die folgende Strategie zur Abhängigkeitsauflösung: Wenn das Plug-in erkennt, dass sich verschiedene Versionen desselben Moduls in der Abhängigkeitsgrafik 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 Lösungsstrategie für den Kompilierungsklassenpfad einer bestimmten Variante.
  • variant_nameRuntimeClasspath: Diese Konfiguration enthält die Lösungsstrategie für den Laufzeitklassenpfad einer bestimmten Variante.

Das Android-Gradle-Plug-in enthält Getter, mit denen Sie auf die Konfigurationsobjekte jeder Variante zugreifen können. Daher können Sie die Variant API verwenden, um die Abhängigkeitsauflösung wie im folgenden Beispiel abzufragen:

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

Groovig

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