Jetpack Compose przyspiesza tworzenie interfejsu i usprawnia tworzenie aplikacji na Androida. Pamiętaj jednak, że dodanie Compose do istniejącej aplikacji może wpłynąć na dane, takie jak rozmiar pliku APK, kompilacja i wydajność w czasie działania.
Rozmiar pliku APK i czas kompilacji
W tej sekcji omówimy wpływ na rozmiar pliku APK i czas kompilacji na przykładzie aplikacji Sunflower, która pokazuje sprawdzone metody migracji aplikacji opartej na widokach do Compose.
Rozmiar pliku APK
Dodawanie bibliotek do projektu zwiększa rozmiar pliku APK. Poniższe wyniki dotyczą zminimalizowanych plików APK wersji każdego projektu z włączonym zmniejszaniem zasobów i kodu, które zostały zmierzone za pomocą APK Analyzer w trybie pełnym R8.
| Tylko wyświetlenia | Widok mieszany i tworzenie | Tylko tworzenie | |
|---|---|---|---|
| Rozmiar do pobrania | 2252 KB | 3034 KB | 2966 KB |
Po pierwszym dodaniu Compose do aplikacji Sunflower rozmiar pliku APK wzrósł z 2252 KB do 3034 KB, czyli o 782 KB. Wygenerowany plik APK zawierał interfejs użytkownika utworzony z połączenia widoków i komponentów Compose. Ten wzrost jest spodziewany, ponieważ do Sunflower dodano dodatkowe zależności.
Z kolei po przeniesieniu aplikacji Sunflower do wersji opartej wyłącznie na Compose rozmiar pliku APK zmniejszył się z 3034 KB do 2966 KB, czyli o 68 KB. Spadek ten był spowodowany usunięciem nieużywanych zależności widoku, takich jak AppCompat i ConstraintLayout.
Czas tworzenia kompilacji
Dodanie Compose wydłuża czas kompilacji aplikacji, ponieważ kompilator Compose przetwarza funkcje kompozycyjne w aplikacji. Poniższe wyniki uzyskano za pomocą samodzielnego narzędzia gradle-profiler, które kilkakrotnie wykonuje kompilację, aby uzyskać średni czas kompilacji do debugowania aplikacji Sunflower:
gradle-profiler --benchmark --project-dir . :app:assembleDebug
| Tylko wyświetlenia | Widok mieszany i tworzenie | Tylko tworzenie | |
|---|---|---|---|
| Średni czas kompilacji | 299,47 ms | 399,09 ms | 342,16 ms |
Gdy po raz pierwszy dodaliśmy Compose do Sunflower, średni czas kompilacji wzrósł z 299 ms do 399 ms, czyli o 100 ms. Wynika to z faktu, że kompilator Compose wykonuje dodatkowe zadania, aby przekształcić kod Compose zdefiniowany w projekcie.
Z kolei średni czas kompilacji spadł do 342 ms, czyli o 57 ms, po zakończeniu migracji aplikacji Sunflower do Compose. Ten spadek można przypisać kilku czynnikom, które łącznie skracają czas kompilacji, takim jak usunięcie powiązań danych, migracja zależności korzystających z kapt do KSP i zaktualizowanie kilku zależności do najnowszych wersji.
Podsumowanie
Wprowadzenie Compose spowoduje zwiększenie rozmiaru pliku APK aplikacji, a także wydajności kompilacji aplikacji ze względu na proces kompilacji kodu Compose. Te kompromisy należy jednak rozważyć w kontekście zalet Compose, zwłaszcza w zakresie zwiększenia produktywności deweloperów po wdrożeniu Compose. Na przykład zespół Sklepu Play stwierdził, że pisanie interfejsu wymaga znacznie mniej kodu, czasami nawet o 50%, co zwiększa produktywność i ułatwia utrzymanie kodu.
Więcej studiów przypadków znajdziesz w artykule Wdrażanie Compose for Teams.
Wyniki w czasie rzeczywistym
W tej sekcji znajdziesz informacje o wydajności w czasie działania w Jetpack Compose, które pomogą Ci zrozumieć, jak Jetpack Compose wypada w porównaniu z wydajnością systemu widoków i jak ją mierzyć.
Inteligentne przekomponowanie
Gdy fragmenty interfejsu są nieprawidłowe, Compose próbuje ponownie skomponować tylko te fragmenty, które wymagają aktualizacji. Więcej informacji znajdziesz w dokumentacji Cykl życia funkcji kompozycyjnych i Fazy Jetpack Compose.
Profile podstawowe
Profile podstawowe to doskonały sposób na przyspieszenie typowych ścieżek użytkownika. Dołączenie do aplikacji profilu podstawowego może zwiększyć szybkość wykonywania kodu o około 30% od pierwszego uruchomienia, ponieważ pozwala uniknąć interpretacji i kompilacji JIT (just-in-time) w przypadku uwzględnionych ścieżek kodu.
Biblioteka Jetpack Compose zawiera własny profil podstawowy, więc gdy używasz jej w aplikacji, automatycznie uzyskujesz te optymalizacje. Jednak te optymalizacje wpływają tylko na ścieżki kodu w bibliotece Compose, dlatego zalecamy dodanie do aplikacji profilu podstawowego, aby obejmował ścieżki kodu poza Compose.
Porównanie z systemem View
Jetpack Compose ma wiele zalet w porównaniu z systemem widoków. Te ulepszenia opisujemy w kolejnych sekcjach.
Wszystko rozszerza klasę View
Każdy element View wyświetlany na ekranie, np. TextView, Button lub ImageView, wymaga alokacji pamięci, jawnego śledzenia stanu i różnych wywołań zwrotnych, aby obsługiwać wszystkie przypadki użycia. Dodatkowo niestandardowy Viewwłaściciel musiView zaimplementować wyraźną logikę, aby zapobiec ponownemu rysowaniu, gdy nie jest to konieczne, np. w przypadku powtarzalnego przetwarzania danych.
Jetpack Compose rozwiązuje ten problem na kilka sposobów. Compose nie ma jawnych obiektów, które można aktualizować w przypadku widoków rysowania. Elementy interfejsu to proste funkcje kompozycyjne, których informacje są zapisywane w kompozycji w sposób umożliwiający odtwarzanie. Pozwala to ograniczyć śledzenie stanu, alokację pamięci i wywołania zwrotne tylko do funkcji kompozycyjnych, które wymagają tych funkcji, zamiast wymagać ich od wszystkich rozszerzeń danego Viewtypu.
Dodatkowo Compose zapewnia inteligentne ponowne kompozycje, które odtwarzają wcześniej narysowany wynik, jeśli nie musisz wprowadzać zmian.
Wiele przejść układu
Tradycyjne grupy ViewGroups mają wiele funkcji w interfejsach API pomiarów i układów, które sprawiają, że są podatne na wielokrotne przekazywanie układów. Wielokrotne przebiegi układu mogą powodować wykładniczy wzrost nakładu pracy, jeśli są wykonywane w określonych zagnieżdżonych punktach w hierarchii widoku.
Jetpack Compose wymusza pojedyncze przejście układu w przypadku wszystkich funkcji kompozycyjnych układu za pomocą umowy interfejsu API. Dzięki temu Compose może wydajnie obsługiwać rozbudowane drzewa interfejsu. Jeśli potrzebujesz kilku pomiarów, Compose ma wbudowane pomiary.
Wyświetlanie wydajności uruchamiania
System widoku musi rozszerzyć układy XML, gdy po raz pierwszy wyświetla określony układ. Ten koszt jest zapisywany w Jetpack Compose, ponieważ układy są pisane w Kotlinie i kompilowane jak reszta aplikacji.
Testowanie porównawcze Compose
W Jetpack Compose 1.0 występują zauważalne różnice w wydajności aplikacji w trybach debug i release. Aby uzyskać reprezentatywne czasy, podczas profilowania aplikacji zawsze używaj kompilacji release zamiast debug.
Aby sprawdzić wydajność kodu Jetpack Compose, możesz użyć biblioteki Jetpack Macrobenchmark. Aby dowiedzieć się, jak używać jej z Jetpack Compose, zapoznaj się z projektem MacrobenchmarkSample.
Zespół Jetpack Compose używa też Macrobenchmark do wykrywania wszelkich regresji, które mogą wystąpić. Na przykład zapoznaj się z benchmarkiem dla leniwej kolumny i jego panelem, aby śledzić regresje.
Tworzenie instalacji profilu
Jetpack Compose to biblioteka niepowiązana, więc nie korzysta z Zygote, który wstępnie wczytuje klasy i elementy rysowalne pakietu UI Toolkit systemu widoków. Jetpack Compose 1.0 wykorzystuje instalację profilu w przypadku kompilacji wersji. Instalatory profili umożliwiają aplikacjom określanie kluczowego kodu, który ma być kompilowany z wyprzedzeniem (AOT) w momencie instalacji. Compose wysyła profil, który zawiera reguły instalacji, co skraca czas uruchamiania i zmniejsza zacinanie się aplikacji Compose.
Polecane dla Ciebie
- Uwaga: tekst linku jest wyświetlany, gdy język JavaScript jest wyłączony.
- Inne kwestie, które warto wziąć pod uwagę
- Korzystanie z Compose w widokach
- Przewijanie