środowisko uruchomieniowe Androida i Dalvik

Środowisko wykonawcze Androida (ART) to zarządzane środowisko wykonawcze używane przez aplikacje i niektóre usługi systemowe na Androidzie. ART i jego poprzednik, Dalvik, zostały pierwotnie stworzone specjalnie na potrzeby projektu Androida. ART jako środowisko wykonawcze wykonuje format Dalvik i specyfikację kodu bajtowego DEX.

ART i Dalvik to kompatybilne środowiska wykonawcze, które obsługują kod bajtowy DEX, więc aplikacje opracowane dla Dalvik powinny działać w środowisku wykonawczym ART. Jednak niektóre techniki, które działają w przypadku Dalvik, nie działają w przypadku ART. Informacje o najważniejszych problemach znajdziesz w artykule Sprawdzanie zachowania aplikacji w czasie działania Android Runtime (ART).

Funkcje ART

Oto kilka najważniejszych funkcji implementowanych przez ART.

Kompilacja z wyprzedzeniem (AOT)

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

Podczas instalacji ART kompiluje aplikacje za pomocą narzędzia dex2oat na urządzeniu. To narzędzie przyjmuje jako dane wejściowe pliki DEX i generuje plik wykonywalny aplikacji skompilowanej na urządzenie docelowe. Narzędzie powinno być w stanie skompilować wszystkie prawidłowe pliki DEX bez żadnych problemów. Niektóre narzędzia do przetwarzania wstecznego tworzą jednak nieprawidłowe pliki, które mogą być akceptowane przez Dalvik, ale nie mogą być kompilowane przez ART. Więcej informacji znajdziesz w artykule Rozwiązywanie problemów z zbieraniem śmieci.

Ulepszone czyszczenie pamięci

Zbieranie śmieci (GC) wymaga dużej ilości zasobów, co może obniżyć wydajność aplikacji, powodując niepłynne wyświetlanie, słabą responsywność interfejsu użytkownika i inne problemy. ART ulepsza zbieranie śmieci na kilka sposobów:

  • głównie równoległy z jednym wstrzymaniem GC;
  • równoczesne kopiowanie, aby zmniejszyć wykorzystanie pamięci w tle i jej fragmentację;
  • Długość przerwy na GC jest niezależna od rozmiaru stosu.
  • Collector z krótszym łącznym czasem GC w przypadku czyszczenia niedawno przydzielonych obiektów o krótkim czasie życia
  • Zwiększenie ergonomii usuwania elementów, dzięki czemu równoległe usuwanie elementów jest bardziej terminowe, co powoduje, że zdarzenia GC_FOR_ALLOC występują bardzo rzadko w typowych przypadkach użycia.

Ulepszenia dotyczące tworzenia i debugowania

ART oferuje wiele funkcji ułatwiających tworzenie i debugowanie aplikacji.

Obsługa profilowania próbkowania

W przeszłości deweloperzy używali narzędzia Traceview (zaprojektowanego do śledzenia wykonywania aplikacji) jako profilatora. Chociaż Traceview dostarcza przydatnych informacji, wyniki w Dalviku są zafałszowane przez narzut na wywołanie metody, a używanie tego narzędzia znacząco wpływa na wydajność w czasie działania.

ART obsługuje profilowanie próbkowania, które nie ma tych ograniczeń. Dzięki temu możesz uzyskać dokładniejszy wgląd w wykonanie aplikacji bez znacznego spowolnienia. W wersji KitKat dodano do narzędzia Traceview obsługę próbkowania w przypadku Dalvik.

Obsługa większej liczby funkcji debugowania

ART obsługuje kilka nowych opcji debugowania, zwłaszcza w przypadku funkcji związanych z monitorowaniem i usuwaniem elementów. Możesz na przykład:

  • Sprawdzanie blokad w śladach stosu, a następnie przechodzenie do wątku, który blokuje dostęp.
  • Zapytaj, ile jest aktywnych instancji danej klasy, poproś o wyświetlenie instancji i sprawdź, jakie odwołania powodują, że obiekt jest aktywny.
  • Filtrowanie zdarzeń (np. punktów kontrolnych) w przypadku konkretnego wystąpienia.
  • wyświetlać wartość zwracaną przez metodę po jej zakończeniu (za pomocą zdarzeń „method-exit”);
  • Ustaw punkt obserwacji pola, aby wstrzymać wykonywanie programu, gdy nastąpi dostęp do określonego pola lub jego modyfikacja.

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

W przypadku wyjątków czasu wykonywania ART udostępnia jak najwięcej informacji kontekstowych i szczegółów. ART zawiera szczegółowe informacje o wyjątkach dotyczących java.lang.ClassCastException, java.lang.ClassNotFoundException i java.lang.NullPointerException. (w późniejszych wersjach Dalvik udostępnia rozszerzone informacje o wyjątkach dotyczących instrukcji java.lang.ArrayIndexOutOfBoundsExceptionjava.lang.ArrayStoreException, które zawierają teraz rozmiar tablicy i odstęp poza zakresem, a także ART).

Na przykład java.lang.NullPointerException pokazuje teraz informacje o tym, co aplikacja próbowała zrobić z wskaźnikiem null, np. o tym, do którego pola próbowała zapisać dane lub którą metodę 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 też ulepszone informacje kontekstowe w raportach o awariach w natywnych aplikacjach, podając informacje zarówno o Java, jak i o natywnej architekturze.

Zgłaszanie problemów

Jeśli wystąpią problemy, które nie są związane z JNI w aplikacji, zgłoś je za pomocą śledzika problemów z projektami oprogramowania Open Source na Androida. 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, załącz plik APK, w którym występuje problem.