Publikowanie wielu bibliotek Androida jako jednej za pomocą biblioteki połączonej

W projektach z wieloma modułami rozpowszechnianie bibliotek Androida wśród użytkowników przy jednoczesnym zachowaniu przejrzystej struktury projektu może być trudne. W wielu przypadkach trzeba opublikować znacznie więcej bibliotek niż zamierzano.

Wtyczka Fused Library dołączona do wtyczki Androida do obsługi Gradle pomaga w pakowaniu wielu modułów biblioteki Androida w jedną bibliotekę Androida, którą można opublikować. Umożliwia to modułowe dzielenie kodu źródłowego i zasobów biblioteki w kompilacji zgodnie z Twoimi potrzebami, a jednocześnie zapobiega ujawnieniu struktury projektu po jego rozpowszechnieniu.

Dystrybucja w postaci pojedynczej biblioteki może przynieść te korzyści:

  • Uproszczone zależności: zastępuje wiele zależności biblioteki jednym plikiem AAR, co usprawnia konfigurację projektu i zarządzanie wersjami dla użytkowników.
  • Mniejszy rozmiar biblioteki: może poprawić zmniejszanie kodu, co prowadzi do mniejszych plików AAR.
  • Większe bezpieczeństwo: może zapewniać lepszą kontrolę nad szczegółami wewnętrznej implementacji opublikowanych bibliotek.

Tworzenie biblioteki połączonej

Aby utworzyć połączoną bibliotekę, musisz utworzyć nowy moduł Androida, dodać zależności, a następnie opublikować połączoną bibliotekę.

Dodawanie nowego modułu biblioteki połączonej

Aby używać wtyczki, musisz dodać do projektu nowy moduł Androida:

W tym przykładzie moduł biblioteki połączonej będzie się nazywać myFusedLibrary.

  1. Włącz obsługę połączonej biblioteki, dodając android.experimental.fusedLibrarySupport=true do pliku gradle.properties.
  2. Dodaj include(":myFusedLibrary") do pliku settings.gradle.kts.
  3. Dodaj android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" } w sekcji [plugins] w pliku gradle/libs.versions.toml.
  4. Dodaj alias(libs.plugins.android.fusedlibrary) apply false w bloku wtyczek w pliku build.gradle.kts najwyższego poziomu.
  5. Aby utworzyć moduł myFusedLibrary, utwórz nowy katalog o nazwie myFusedLibrary (kliknij prawym przyciskiem myszy „Moja aplikacja” > Nowy > Katalog).
  6. Utwórz plik build.gradle.kts w module myFusedLibrary (kliknij prawym przyciskiem myszy moduł myFusedLibrary > Nowy > Plik).
  7. Wklej ten kod do pliku 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 {

}

Dodawanie zależności

Główną funkcją biblioteki połączonej jest łączenie zależności. Wtyczka umożliwia dodawanie lokalnych zależności projektu i bibliotek zewnętrznych. Aby określić zależności, które mają zostać spakowane, użyj konfiguracji include. Zależności pośrednie nie są pakowane.

Na przykład:

Kotlin

dependencies {
    include(project(":image-rendering"))
    include("mycoolfonts:font-wingdings:5.0")
}

Groovy

dependencies {
    include project(':image-rendering')
    include 'mycoolfonts:font-wingdings:5.0'
}

Publikowanie połączonej biblioteki

Zanim opublikujesz bibliotekę scaloną, zapoznaj się z informacjami o publikowaniu biblioteki Androida. Publikowanie biblioteki połączonej jest podobne do publikowania biblioteki Androida, ale istnieją pewne kluczowe różnice, które musisz wziąć pod uwagę, aby prawidłowo opublikować bibliotekę połączoną:

  • Wtyczkę Maven Publish Plugin należy też zastosować w przypadku każdego modułu, w którym zastosowano wtyczkę FusedLibrary.
  • Publikacja musi dziedziczyć po fusedLibraryComponent, ponieważ zapewnia to wymagane zależności potrzebne do skompilowania artefaktu biblioteki scalonej.

Oto przykład konfiguracji publikacji:

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

Publikowanie połączonej biblioteki na potrzeby testów

Testy należy przeprowadzać w oparciu o opublikowaną bibliotekę połączoną z aplikacji na Androida lub biblioteki Androida. Zalecana metoda to opublikowanie połączonej biblioteki i jej zależności projektu w lokalnym repozytorium Maven.

Aby opublikować artefakty połączonej biblioteki w repozytorium lokalnym, zdefiniuj konfigurację podobną do tej:

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')
    }
}

Przesyłanie połączonej biblioteki

Aby rozpowszechniać połączoną bibliotekę, zapoznaj się z sekcją Przesyłanie biblioteki.

Działanie i zabezpieczenia

Łączenie bibliotek Androida jest skomplikowane, co może utrudniać wtyczce określanie priorytetów. Na przykład 2 biblioteki z tą samą ścieżką klasy spowodują błąd kompilacji podczas łączenia biblioteki. Scalanie zasobów będzie uwzględniać kolejność zależności określoną podczas wybierania zasobu o tej samej nazwie w różnych bibliotekach.

  • Połączone biblioteki można publikować tylko jako artefakt biblioteki Androida AAR, aby można było dodać je jako zależność.
  • Łączenie bibliotek, które korzystają z powiązania danych, nie jest obsługiwane.
  • W ramach jednej połączonej biblioteki nie można łączyć wielu typów kompilacji i wersji produktu. Utwórz osobne biblioteki połączone dla różnych wariantów.

Aby zachować równowagę między ilością wymaganej konfiguracji a łatwością użycia, wtyczka w przypadku niejednoznacznych konfliktów przerywa kompilację lub podczas łączenia artefaktów używa heurystyki. Szczegóły dotyczące łączenia artefaktów znajdziesz w tej tabeli:

Typ Działanie
Zajęcia Biblioteki o tej samej ścieżce klasy spowodują błąd kompilacji podczas łączenia biblioteki.
Zasoby na Androida Scalanie zasobów będzie uwzględniać kolejność zależności określoną podczas wybierania zasobu o tej samej nazwie w różnych.
Metadane AAR Wersje metadanych AAR są scalane przez nadanie priorytetu najwyższej wartości z każdej biblioteki zależności. Aby zmienić te wartości, możesz użyć języka DSL.

Kotlin

 androidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } }
Materiały dotyczące Javy Pliki zasobów Java w wielu bibliotekach o identycznych ścieżkach są niedozwolone i spowodują błąd kompilacji.

Znane problemy

Fused Library to nowa wtyczka, w której występują znane problemy. Pracujemy nad ich rozwiązaniem, aby umożliwić wszystkie przypadki użycia.

  • Nie można wygenerować źródłowych plików JAR
  • Dodawanie zależności plików od innych plików .aar
  • Brak obsługi łączenia artefaktów RenderScript i Prefab

Określanie zależności połączonej biblioteki

Biblioteka połączona nie ma źródeł i korzysta tylko z bibliotek Androida. Ważne jest, aby wiedzieć, skąd pochodzą poszczególne elementy. Aby wyświetlić listę zależności scalonych w wynikowym artefakcie i zależności potrzebnych do jego utworzenia, uruchom zadanie gradle :report w przypadku scalonej biblioteki. Zadanie generuje raport JSON, który jest zapisywany w katalogu build/reports połączonej biblioteki.

Aby uzyskać dodatkowe informacje o zależnościach wewnętrznych wtyczek, uruchom zadanie gradle :dependencies, aby wyświetlić stan konfiguracji wtyczek.