Что означает VerifyClass внутри Systrace?

Я смотрю на systrace, сгенерированный моим приложением, и обнаружил кадр, который занимает слишком много времени. Это вызвано RecyclerView onCreateViewHolder при раздувании моего представления элемента. Вид элемента настолько плоский, насколько это возможно с ConstraintLayout. Но в приведенном ниже отчете systrace есть много блоков VerifyClass, каждый из которых занимает 17 мс.

Что означает это VerifyClass блоков?

введите описание изображения здесь


person Oscar Méndez    schedule 12.10.2017    source источник
comment
Журналы трассировки, которые вы видите, скорее всего, получены из здесь, так что это проблема ART. Возможно, вы захотите попробовать поискать журналы, связанные с dex/oat/art, в своем логарифме, чтобы увидеть, указывает ли он на очевидную ошибку, которую вы можете исправить, но если нет, это может быть просто проблема с фреймворком, и вы можете попробовать зарегистрировать ошибку на система отслеживания ошибок   -  person z153    schedule 20.10.2017


Ответы (2)


Трудно сказать, что именно делает VerifyClass, потому что это не часть Android Java SDK или ConstraintLayout. Единственное упоминание, которое я нашел, находится в части C SDK:

http://www.androidpolice.com/android_aosp_changelogs/android-m-preview-2-to-android-7.0.0_r1-AOSP-changelog.html

Но у меня есть пара предложений:

1) Попробуйте создать приложение в режиме выпуска и посмотрите, есть ли у вас проблемы с падением FPS. Я предполагаю, что этот VerifyClass выполняется для отладочных сборок для проверки определенных вещей, но это только предположение.

2) Хотя ConstraintLayout имеет удобный API и плоскую иерархию (что положительно влияет на обходы чертежей), он по-прежнему имеет намного более медленный процесс измерения и компоновки, чем другие макеты Android. Причиной этого является сложность расчета ограничений. Таким образом, его использование в RecyclerView может привести к значительному снижению производительности при создании ViewHolder. Если иерархия ячеек списка достаточно проста, я бы предложил переключиться на некоторые ванильные макеты и проверить поведение.

person Dimezis    schedule 19.10.2017
comment
it still has much slower measuring and layout process than other Android Layouts Какие макеты (кроме FrameLayout, разумеется)? Я хотел бы увидеть некоторые цифры, на которых основано это утверждение. - person Eugen Pechanec; 22.10.2017
comment
@EugenPechanec Вложенные LinearLayouts (возможно, с весами) и невложенные RelativeLayouts. Это основано на моих тестах и, что более важно, тестах Google: github.com/googlesamples/ android-constraint-layout-performance. НО, обратите внимание, что традиционный макет в этом тесте крайне неэффективен и содержит несколько избыточных и бесполезных RelativeLayouts для искусственного снижения производительности. Если вы перепишете этот макет с вложенными LinearLayouts (даже с весами), вы увидите огромную разницу в производительности. - person Dimezis; 23.10.2017
comment
VerifyClass является частью платформы Android на C++. Сборки отладки и выпуска не имеют значения. - person mhansen; 03.09.2020

Я не специалист по внутренним устройствам C++/Android Runtime, чтобы четко объяснить, что такое VerifyClass метод, определенный в /art/runtime/class_linker.h и реализован в /art/runtime/class_linker.cc означает, но я бы не стал уделять столько внимания времени его выполнения CPU.

Что я хотел бы принять во внимание, так это ваши RecyclerView элементы, которые содержат ConstraintLayout и чье наполнение потребляет время ЦП.

Что касается предложения попробовать выпускную сборку, это не будет иметь никакого значения - вызовы собственного метода VerifyClass будут выполняться как для отладочной, так и для выпускной сборки.

person Onik    schedule 21.10.2017