Android Runtime и Dalvik

Android Runtime (ART) – это управляемая среда выполнения, которая используется приложениями и некоторыми системными сервисами в Android. ART и его предшественник Dalvik были изначально созданы специально для проекта Android. ART как среда выполнения исполняет исполняемый файл Dalvik (DEX) и спецификацию байт-кода DEX.

ART и Dalvik – совместимые среды выполнения, которые работают с байт-кодом DEX, поэтому приложения, разработанные для Dalvik, должны работать и в ART. Однако некоторые методы, которые работают в Dalvik, не работают в ART. Информацию о наиболее важных проблемах можно найти в разделе Проверка поведения приложения в среде выполнения Android (ART).

Функции ART

Ниже перечислены основные функции, реализованные в ART.

Предварительная компиляция (AOT)

В ART используется предварительная компиляция (AOT), которая может повысить производительность приложения. Кроме того, в ART более строгая проверка во время установки, чем в Dalvik.

При установке ART компилирует приложения с помощью инструмента dex2oat на устройстве. Эта утилита принимает на вход файлы DEX и создает исполняемый файл скомпилированного приложения для целевого устройства. Утилита должна без проблем компилировать все действительные DEX-файлы. Однако некоторые инструменты постобработки создают недействительные файлы, которые могут быть совместимы с Dalvik, но не могут быть скомпилированы ART. Подробнее о том, как устранить проблемы со сборкой мусора…

Улучшенная сборка мусора

Сборка мусора требует много ресурсов, что может снизить производительность приложения, привести к прерывистому отображению контента, медленной реакции интерфейса и другим проблемам. ART улучшает сборку мусора несколькими способами:

  • В основном параллельный дизайн с одной паузой GC
  • Одновременное копирование для уменьшения использования фоновой памяти и фрагментации
  • Длительность паузы GC не зависит от размера кучи.
  • Сборщик с меньшим общим временем сборки мусора для особого случая очистки недавно выделенных объектов с коротким сроком жизни
  • Улучшена эргономика сборки мусора, благодаря чему параллельные сборки мусора выполняются своевременнее, а события GC_FOR_ALLOC становятся крайне редкими в типичных случаях использования.

Улучшения в разработке и отладке

ART предлагает ряд функций, которые помогают разработчикам приложений разрабатывать и отлаживать их.

Поддержка профилировщика выборки

Раньше разработчики использовали в качестве профилировщика инструмент Traceview, предназначенный для отслеживания выполнения приложений. Хотя Traceview предоставляет полезную информацию, его результаты в Dalvik искажаются из-за накладных расходов на вызов метода, а использование инструмента заметно влияет на производительность во время выполнения.

В ART добавлена поддержка специального профилировщика выборки, у которого нет этих ограничений. Это позволяет получить более точное представление о работе приложения без значительного замедления. В версии KitKat в Traceview была добавлена поддержка выборки для Dalvik.

Поддержка дополнительных функций отладки

ART поддерживает ряд новых вариантов отладки, особенно в отношении функций, связанных с мониторингом и сборкой мусора. например:

  • Посмотрите, какие блокировки удерживаются в трассировках стека, а затем перейдите к потоку, который удерживает блокировку.
  • Узнавайте, сколько активных экземпляров определенного класса существует, просматривайте экземпляры и узнавайте, какие ссылки поддерживают активность объекта.
  • Фильтрация событий (например, точек останова) для определенного экземпляра.
  • Просматривать значение, возвращаемое методом при выходе (с помощью событий method-exit).
  • Установите точку наблюдения за полем, чтобы приостановить выполнение программы при доступе к определенному полю и/или его изменении.

Улучшенная диагностическая информация в исключениях и отчетах о сбоях

При возникновении исключений во время выполнения ART предоставляет как можно больше контекста и подробностей. ART предоставляет подробные сведения об исключениях для java.lang.ClassCastException, java.lang.ClassNotFoundException и java.lang.NullPointerException. (В более поздних версиях Dalvik предоставляется расширенная информация об исключениях для java.lang.ArrayIndexOutOfBoundsException и java.lang.ArrayStoreException, которая теперь включает размер массива и смещение за пределами диапазона. ART также предоставляет эти данные.)

Например, в случае с ошибкой java.lang.NullPointerException теперь показывается информация о том, что приложение пыталось сделать с нулевым указателем, например поле, в которое приложение пыталось записать данные, или метод, который оно пыталось вызвать. Рассмотрим примеры.

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 предоставляет более подробную информацию в отчетах о сбоях нативного кода приложений, включая данные о стеках Java и нативного кода.

Как сообщить о проблеме

Если у вас возникнут проблемы, не связанные с JNI, сообщите о них через систему отслеживания ошибок Android Open Source Project. Добавьте adb bugreport и ссылку на приложение в Google Play, если оно там есть. Если это невозможно, прикрепите APK-файл, в котором воспроизводится проблема.