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
.
- Aby włączyć obsługę połączonej biblioteki, dodaj
android.experimental.fusedLibrarySupport=true
do plikugradle.properties
. - Dodaj
include(":myFusedLibrary")
do plikusettings.gradle.kts
. - Dodaj
android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" }
w sekcji[plugins]
w plikugradle/libs.versions.toml
. - Dodaj
alias(libs.plugins.android.fusedlibrary) apply false
w bloku pluginów w plikubuild.gradle.kts
na najwyższym poziomie. - Aby utworzyć moduł
myFusedLibrary
, utwórz nowy katalog o nazwiemyFusedLibrary
(kliknij prawym przyciskiem myszy „Moja aplikacja” > Nowy > Katalog). - Utwórz plik
build.gradle.kts
w modulemyFusedLibrary
(kliknij prawym przyciskiem myszy modułmyFusedLibrary
> Nowy > Plik). - 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. KotlinandroidFusedLibrary { 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.