W projektach z wieloma modułami dystrybucja bibliotek Androida do użytkowników może być trudna, jeśli chcesz zachować przejrzystą strukturę projektu. Często trzeba opublikować znacznie więcej bibliotek, niż planowano.
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ć. Dzięki temu możesz dowolnie modularyzować kod źródłowy i zasoby biblioteki w ramach kompilacji, unikając jednocześnie ujawniania 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 upraszcza konfigurację projektu i zarządzanie wersjami dla użytkowników.
- Zmniejszony rozmiar biblioteki: może poprawić zmniejszanie kodu, co prowadzi do mniejszych plików AAR.
- Lepsze zabezpieczenia: mogą zapewnić lepszą kontrolę nad wewnętrznymi szczegółami implementacji opublikowanych bibliotek.
Tworzenie biblioteki scalonej
Aby utworzyć bibliotekę skonsolidowaną, musisz utworzyć nowy moduł Androida, dodać zależności, a następnie opublikować bibliotekę skonsolidowaną.
Wymagania wstępne
Aby korzystać z wtyczki Fused Library, użyj AGP w wersji 9.0 lub nowszej. Poprzednie wersje wtyczki Fused Library zachowują się inaczej i mają problemy, które zostały rozwiązane w AGP 9.0.
Dodawanie nowego modułu biblioteki skonsolidowanej
Aby używać wtyczki, musisz dodać do projektu nowy moduł Androida:
W tym przykładzie moduł biblioteki połączonej będzie nosił nazwę myFusedLibrary.
- 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 falsew bloku wtyczek w plikubuild.gradle.ktsnajwyższego poziomu. - Aby utworzyć moduł
myFusedLibrary, utwórz nowy katalog o nazwiemyFusedLibrary(kliknij prawym przyciskiem myszy „Moja aplikacja” > Nowy > Katalog). - Utwórz plik
build.gradle.ktsw modulemyFusedLibrary(kliknij prawym przyciskiem myszy modułmyFusedLibrary> Nowy > Plik). - Wklej ten fragment kodu do pliku
myFusedLibrary/build.gradle.kts:
Kotlin
plugins { alias(libs.plugins.android.fusedlibrary) `maven-publish` } androidFusedLibrary { namespace = "com.example.myFusedLibrary" minSdk = 21 } dependencies { }
Dynamiczny
plugins { id 'com.android.fused-library' } androidFusedLibrary { namespace 'com.example.myFusedLibrary' minSdk 21 } dependencies { }
Dodawanie zależności
Główną funkcjonalnością biblioteki scalonej jest grupowanie zależności. Wtyczka obsługuje 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 przechodnie nie są pakowane.
Na przykład:
Kotlin
dependencies { include(project(":image-rendering")) include("mycoolfonts:font-wingdings:5.0") }
Dynamiczny
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 scalonej jest podobne do publikowania biblioteki Androida, ale istnieją pewne kluczowe różnice, które należy wziąć pod uwagę, aby prawidłowo opublikować bibliotekę scaloną:
- Wtyczkę Maven Publish należy też zastosować do każdego modułu, który ma zastosowaną wtyczkę Fused Library.
- Publikacja musi dziedziczyć po
fusedLibraryComponent, ponieważ zapewnia to wymagane zależności potrzebne do skompilowania artefaktu biblioteki połączonej.
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"]) } } }
Dynamiczny
plugins { id 'com.android.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 biblioteki połączonej na potrzeby testów
Zależność od opublikowanej biblioteki skonsolidowanej należy przetestować z poziomu aplikacji na Androida lub biblioteki na Androida. Zalecaną metodą jest opublikowanie biblioteki połączonej i jej zależności projektowych w lokalnym repozytorium Maven.
Aby opublikować artefakty biblioteki scalonej 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")) } }
Dynamiczny
plugins { id 'com.android.fused-library' id 'maven-publish' } repositories { maven { name 'myLocalRepo' url layout.buildDirectory.dir('myLocalRepo') } }
Przesyłanie scalonej biblioteki
Aby rozpowszechniać bibliotekę połączoną, zapoznaj się z sekcją Przesyłanie biblioteki.
Zachowanie 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 scalania biblioteki. Podczas scalania zasobów brana jest pod uwagę kolejność zależności określona przy wyborze zasobu o tej samej nazwie w różnych bibliotekach.
- Połączone biblioteki można publikować tylko jako artefakt biblioteki Androida (AAR), aby można je było dodać jako zależność.
- Scalanie bibliotek, które używają wiązania danych, nie jest obsługiwane.
- Nie można połączyć wielu typów kompilacji i wariantów usługi w jednej połączonej bibliotece. Utwórz osobne biblioteki scalone dla różnych wariantów.
Aby zachować równowagę między ilością wymaganej konfiguracji a łatwością użycia, wtyczka nie powiedzie się w przypadku niejednoznacznych konfliktów lub użyje heurystyki podczas scalania artefaktów. Szczegółowe informacje o tym, jak artefakty są łączone, znajdziesz w tej tabeli:
| Typ | Zachowanie |
|---|---|
| Zajęcia | Biblioteki z tą samą ścieżką klasy spowodują błąd kompilacji podczas scalania biblioteki. |
| Zasoby na Androida | Scalanie zasobów uwzględnia kolejność zależności określonych podczas wybierania zasobu o tej samej nazwie w różnych miejscach. |
| Metadane AAR | Wersje metadanych AAR są scalane przez nadanie priorytetu najwyższej wartości z każdej biblioteki zależności. Aby zastąpić te wartości, możesz użyć języka DSL. Kotlin androidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } } |
| Zasoby dotyczące Javy | Pliki zasobów Java w wielu bibliotekach o identycznych ścieżkach są niedozwolone i powodują błąd kompilacji. |
Znane problemy
Fused Library to nowa wtyczka, która ma znane problemy. Pracujemy nad ich rozwiązaniem, aby można było jej używać we wszystkich przypadkach. Jeśli napotkasz jakieś problemy, możesz zgłosić błędy.
- Problem nr 454305444: biblioteki zawierające reguły ProGuard konsumenta, które nie mają nazwy „proguard.txt”, powodują błąd kompilacji. Problem został rozwiązany w AGP w wersji 9.1 i nowszych.
- Problem nr 374982739: dodawanie zależności plików od innych plików .aar
- Problem nr 231433225: brak obsługi scalania artefaktów RenderScript i Prefab
Zrozumienie zależności biblioteki skonsolidowanej
Biblioteka scalona nie ma źródeł i jako jedynego źródła używa bibliotek Androida, dlatego ważne jest, aby wiedzieć, co skąd pochodzi. Aby wyświetlić listę zależności scalonych z wynikowym artefaktem i zależności potrzebnych do utworzenia artefaktu, uruchom zadanie gradle :report w scalonej bibliotece. Zadanie generuje raport JSON, który jest zapisywany w katalogu build/reports biblioteki fused.
Aby uzyskać dodatkowe informacje o wewnętrznych zależnościach wtyczek, uruchom zadanie gradle :dependencies, które wyświetli stan konfiguracji wtyczek.