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
.
- Włącz obsługę połączonej biblioteki, dodając
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 wtyczek w plikubuild.gradle.kts
najwyż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.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ą 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. KotlinandroidFusedLibrary { 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.