Zastosuj niestandardową logikę kompilacji

W tej sekcji omówiliśmy zaawansowane tematy, które przydadzą się, gdy chcesz rozszerzyć wtyczkę Gradle na Androida lub napisać własną.

Publikowanie zależności wariantów w ramach logiki niestandardowej

Biblioteka może zawierać funkcje, których mogą chcieć używać inne projekty lub podprojekty. Publikowanie biblioteki to proces udostępniania biblioteki użytkownikom. Biblioteki mogą kontrolować, do których zależności mają dostęp użytkownicy w czasie kompilacji i wykonania.

Istnieją 2 osobne konfiguracje zawierające zależności uogólnione każdej ścieżki klas, których użytkownicy muszą używać do korzystania z biblioteki w sposób opisany poniżej:

  • variant_nameApiElements: ta konfiguracja zawiera zależności transitive dostępne dla użytkowników w momencie kompilacji.
  • variant_nameRuntimeElements: ta konfiguracja zawiera zależności transitive dostępne dla konsumentów w czasie działania.

Więcej informacji o zależnościach między różnymi konfiguracjami znajdziesz w artykule Konfiguracje wtyczki Java Library.

Niestandardowe strategie rozwiązywania zależności

Projekt może zawierać zależność od 2 różnych wersji tej samej biblioteki, co może prowadzić do konfliktów zależności. Jeśli np. Twój projekt zależy od wersji 1 modułu A i wersji 2 modułu B, a moduł A zależy w drugim stopniu od wersji 3 modułu B, powstaje konflikt wersji zależności.

Aby rozwiązać ten konflikt, wtyczka Gradle na Androida stosuje następującą strategię rozwiązywania zależności: gdy wykryje, że w grafu zależności występują różne wersje tego samego modułu, domyślnie wybiera tę o najwyższym numerze wersji.

Ta strategia może jednak nie zawsze działać zgodnie z oczekiwaniami. Aby dostosować strategię rozwiązywania zależności, użyj tych konfiguracji, aby rozwiązać konkretne zależności wariantu, które są potrzebne do wykonania zadania:

  • variant_nameCompileClasspath: ta konfiguracja zawiera strategię rozdzielczości dla ścieżki kompilacji danej wersji.
  • variant_nameRuntimeClasspath: ta konfiguracja zawiera strategię rozdzielczości dla ścieżki klasyfikacji czasu wykonywania danej wersji.

Wtyczka Android Gradle zawiera metody dostępu, które umożliwiają uzyskiwanie dostępu do obiektów konfiguracji poszczególnych wariantów. Dlatego możesz użyć interfejsu API wariantów, aby zapytać o rozwiązanie zależności, jak pokazano w przykładzie poniżej:

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