Android Runtime (ART) i Dalvik

Środowisko wykonawcze systemu Android (ART) to zarządzane środowisko wykonawcze używane przez aplikacje i niektóre usługi systemowe w systemie Android. ART i jego poprzednik Dalvik zostały pierwotnie stworzone specjalnie dla projektu Android. ART jako środowisko wykonawcze wykonuje format Dalvik Executable i specyfikację kodu bajtowego Dex.

ART i Dalvik są kompatybilnymi środowiskami wykonawczymi z kodem bajtowym Dex, więc aplikacje opracowane dla Dalvik powinny działać z ART. Jednak niektóre techniki, które działają na Dalvik, nie działają na ART. Aby uzyskać informacje o najważniejszych problemach, zobacz Weryfikowanie zachowania aplikacji w środowisku wykonawczym systemu Android (ART) .

Funkcje ART

Oto niektóre z głównych funkcji wdrożonych przez ART.

Kompilacja z wyprzedzeniem (AOT)

ART wprowadza kompilację z wyprzedzeniem (AOT), która może poprawić wydajność aplikacji. ART ma również ściślejszą weryfikację w czasie instalacji niż Dalvik.

W czasie instalacji ART kompiluje aplikacje za pomocą narzędzia dex2oat na urządzeniu. To narzędzie akceptuje pliki DEX jako dane wejściowe i generuje skompilowany plik wykonywalny aplikacji dla urządzenia docelowego. Narzędzie powinno być w stanie bez problemu skompilować wszystkie prawidłowe pliki DEX. Jednak niektóre narzędzia do przetwarzania końcowego tworzą nieprawidłowe pliki, które mogą być tolerowane przez Dalvik, ale nie mogą być skompilowane przez ART. Aby uzyskać więcej informacji, zobacz Rozwiązywanie problemów z wyrzucaniem elementów bezużytecznych .

Ulepszone zbieranie śmieci

Wyrzucanie elementów bezużytecznych (GC) wymaga bardzo dużej ilości zasobów, co może pogorszyć wydajność aplikacji, powodując niestabilne wyświetlanie, słabą reakcję interfejsu użytkownika i inne problemy. ART usprawnia zbieranie śmieci na kilka sposobów:

  • Przeważnie projekt równoległy z pojedynczą przerwą GC
  • Jednoczesne kopiowanie w celu zmniejszenia zużycia i fragmentacji pamięci w tle
  • Długość pauzy GC jest niezależna od rozmiaru sterty
  • Kolektor z niższym całkowitym czasem GC dla szczególnego przypadku czyszczenia niedawno przydzielonych obiektów o krótkim czasie życia
  • Ulepszona ergonomia zbierania elementów bezużytecznych, dzięki czemu współbieżne zbieranie elementów bezużytecznych jest bardziej terminowe, co sprawia, że ​​zdarzenia GC_FOR_ALLOC niezwykle rzadkie w typowych przypadkach użycia

Ulepszenia programowania i debugowania

ART oferuje szereg funkcji usprawniających tworzenie aplikacji i debugowanie.

Obsługa profilera próbkowania

W przeszłości programiści używali narzędzia Traceview (przeznaczonego do śledzenia wykonywania aplikacji) jako profilera. Chociaż Traceview dostarcza użytecznych informacji, jego wyniki w Dalvik zostały wypaczone przez narzut na wywołanie metody, a użycie narzędzia znacząco wpływa na wydajność w czasie wykonywania.

ART dodaje obsługę dedykowanego profilera próbkowania, który nie ma tych ograniczeń. Daje to dokładniejszy obraz wykonywania aplikacji bez znacznego spowolnienia. Obsługa próbkowania została dodana do Traceview dla Dalvik w wydaniu KitKat.

Obsługa większej liczby funkcji debugowania

ART obsługuje wiele nowych opcji debugowania, szczególnie w funkcjach związanych z monitorowaniem i usuwaniem elementów bezużytecznych. Na przykład możesz:

  • Zobacz, jakie zamki są przechowywane w śladach stosu, a następnie przejdź do wątku, w którym znajduje się blokada.
  • Zapytaj, ile istnieje instancji na żywo danej klasy, poproś o wyświetlenie instancji i zobacz, jakie odwołania utrzymują obiekt w ruchu.
  • Filtruj zdarzenia (takie jak punkt przerwania) dla określonej instancji.
  • Zobacz wartość zwracaną przez metodę po jej zakończeniu (za pomocą zdarzeń „method-exit”).
  • Ustaw punkt obserwacyjny pola, aby zawiesić wykonywanie programu, gdy określone pole jest dostępne i / lub zmodyfikowane.

Ulepszone szczegóły diagnostyczne w wyjątkach i raportach o awariach

ART zapewnia jak najwięcej kontekstu i szczegółów, gdy występują wyjątki w czasie wykonywania. ART udostępnia rozszerzone szczegóły wyjątków dla java.lang.ClassCastException , java.lang.ClassNotFoundException i java.lang.NullPointerException . (Późniejsze wersje Dalvik zapewniały rozszerzone szczegóły wyjątków dla java.lang.ArrayIndexOutOfBoundsException i java.lang.ArrayStoreException , które teraz zawierają rozmiar tablicy i przesunięcie poza granicami, a ART również to robi.)

Na przykład java.lang.NullPointerException wyświetla teraz informacje o tym, co aplikacja próbowała zrobić ze wskaźnikiem pustym, takie jak pole, w którym aplikacja próbowała pisać, lub metoda, którą próbowała wywołać. Oto kilka typowych przykładów:

java.lang.NullPointerException: Attempt to write to field 'int
android.accessibilityservice.AccessibilityServiceInfo.flags' on a null object
reference
java.lang.NullPointerException: Attempt to invoke virtual method
'java.lang.String java.lang.Object.toString()' on a null object reference

ART zapewnia również ulepszone informacje kontekstowe w natywnych raportach o awariach aplikacji, uwzględniając zarówno informacje dotyczące języka Java, jak i natywne informacje o stosie.

Zgłaszanie problemów

Jeśli napotkasz jakiekolwiek problemy, które nie są spowodowane problemami z JNI aplikacji, zgłoś je za pośrednictwem narzędzia do śledzenia problemów z projektem Android Open Source . Dołącz adb bugreport i link do aplikacji w sklepie Google Play, jeśli jest dostępny. W przeciwnym razie, jeśli to możliwe, dołącz pakiet APK, który odtwarza problem.