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-файл, в котором воспроизводится проблема.