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

W przypadku projektów z dużą liczbą modułów rozpowszechnianie bibliotek Androida wśród użytkowników może być trudne, jeśli jednocześnie chcesz zachować przejrzystą strukturę projektu. W wielu przypadkach trzeba opublikować znacznie więcej bibliotek, niż jest to potrzebne.

Wtyczka Fused Library dołączona do wtyczki Androida do obsługi Gradle pomaga w pakowaniu wielu modułów biblioteki Androida do jednej publikowalnej biblioteki Androida. Dzięki temu możesz modułowo podzielić kod źródłowy biblioteki i jej zasoby w ramach kompilacji, a także uniknąć ujawnienia struktury projektu po jego rozpowszechnieniu.

Rozpowszechnianie w ramach jednej biblioteki może przynieść następujące korzyści:

  • Uproszczone zależności: zastępuje wiele zależności bibliotek pojedynczą biblioteką AAR, co upraszcza konfigurowanie projektu i zarządzanie wersjami dla użytkowników.
  • Zmniejszony rozmiar biblioteki: może poprawić zmniejszanie kodu, co prowadzi do mniejszych współczynników AAR.
  • Zwiększone bezpieczeństwo: możesz lepiej kontrolować szczegóły implementacji wewnętrznej opublikowanych bibliotek.

Tworzenie złączonej biblioteki

Aby skompilować złączoną bibliotekę, musisz utworzyć nowy moduł Androida, dodać zależności i opublikować złączoną bibliotekę.

Dodawanie nowego modułu biblioteki połączonej

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

W tym przykładzie moduł z połączoną biblioteką będzie się nazywał myFusedLibrary.

  1. Aby włączyć obsługę połączonej biblioteki, dodaj 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 pluginów w pliku build.gradle.kts na najwyższym poziomie.
  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ą połączonej biblioteki jest łączenie zależności. Wtyczka obsługuje dodawanie lokalnych zależności projektu i bibliotek zewnętrznych. Aby określić zależności do spakowania, 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 złączonej biblioteki

Przed opublikowaniem złączonej biblioteki zapoznaj się z informacjami na temat publikowania biblioteki Androida. Publikowanie scalonej biblioteki jest podobne do publikowania biblioteki Androida, ale istnieją pewne kluczowe różnice, które należy wziąć pod uwagę, aby prawidłowo opublikować scaloną bibliotekę:

  • Wtyczka Maven Publish musi też zostać zastosowana do każdego modułu, w którym zastosowano wtyczkę FusedLibrary.
  • Publikacja musi dziedziczyć z poziomu fusedLibraryComponent, ponieważ zapewnia wymagane zależności potrzebne do skompilowania artefaktu z połączonej biblioteki.

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 złączonej biblioteki na potrzeby testowania

Należy przetestować zależność od opublikowanej złączonej biblioteki z aplikacji na Androida lub z biblioteki na Androida. Zalecamy opublikowanie złączonej biblioteki i jej zależności w lokalnym repozytorium Maven.

Aby opublikować artefakty z 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 scalonej biblioteki

Aby rozpowszechnić scaloną bibliotekę, zapoznaj się z sekcją Przesyłanie biblioteki.

Zachowanie i zabezpieczenia

Łączenie bibliotek Androida wiąże się z pewnymi zawiłościami, które mogą utrudniać wtyczce ustalanie priorytetów. Na przykład 2 biblioteki z tym samym classpath spowodują niepowodzenie kompilacji podczas łączenia biblioteki. Łączenie zasobów będzie uwzględniać kolejność zależności określoną podczas wybierania zasobu o tej samej nazwie w różnych bibliotekach.

  • Złączone biblioteki można opublikować tylko jako artefakt biblioteki Androida w formacie AAR, aby można je było dodać jako zależność.
  • Korzystanie z bibliotek, które używają powiązania danych, nie jest obsługiwane.
  • Nie można łączyć w jednej złączonej bibliotece wielu typów kompilacji i wersji produktu. Utwórz oddzielne biblioteki z połączonymi plikami dla różnych wersji.

Aby zachować równowagę między wymaganą konfiguracją a łatwością obsługi, w przypadku niejednoznacznych konfliktów w procesie kompilacji wtyczka albo zakończy go niepowodzeniem, albo użyje heurystyki podczas łączenia artefaktów. Szczegółowe informacje o tym, jak artefakty są łączone, znajdziesz w tej tabeli:

Typ Działanie
Zajęcia Biblioteki z tym samym classpath spowodują niepowodzenie kompilacji podczas łączenia biblioteki.
Zasoby na Androida Scalanie zasobów uwzględnia kolejność zależności określoną podczas wybierania zasobu o tej samej nazwie w różnych wersjach.
Metadane AAR Wersje metadanych AAR są scalane przez nadanie priorytetu najwyższej wartości z każdej biblioteki zależności. Do zmiany tych wartości służy parametr DSL.

Kotlin

 androidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } }
Materiały dotyczące Javy Pliki zasobów Javy w kilku bibliotekach z identycznymi ścieżkami nie są dozwolone i spowodują niepowodzenie kompilacji.

Znane problemy

Fused Library to nowy wtyczka, w której przypadku występują znane problemy, nad którymi pracujemy, aby spełniała wszystkie przypadki użycia.

  • Pliki lint.jar nie są uwzględniane w złączonym pliku AAR.
  • Dodawanie zależności plików do innych plików .aar
  • Brak obsługi łączenia artefaktów RenderScript i Prefab

Zależności biblioteki scalonej

Zbiorcza biblioteka nie ma żadnych źródeł i wykorzystuje tylko biblioteki Androida, dlatego ważne jest, aby wiedzieć, skąd pochodzą dane. Aby wyświetlić listę zależności scalonych w wynikowy element i zależności potrzebnych do skompilowania elementu, uruchom zadanie gradle :report na scalonej bibliotece. Zadania generują raport w formacie JSON, który jest zapisywany w katalogu build/reports z biblioteką połączoną.

Aby uzyskać więcej informacji o wewnętrznych zależnościach w pluginie, uruchom zadanie gradle :dependencies, aby wyświetlić stan konfiguracji plugina.