Systrace 中的 VerifyClass 是什么意思?

What does VerifyClass inside Systrace mean?

我正在查看由我的应用程序生成的 systrace,我发现一个帧花费的时间太长。 这是由 RecyclerViewonCreateViewHolder 在膨胀我的项目视图时引起的。 ConstraintLayout 项目视图尽可能平坦。但是下面的 systrace 报告有很多 VerifyClass 个块,每个块需要 17 毫秒。

VerifyClass 块是什么意思?

很难说 VerifyClass 到底在做什么,因为它不是 Android Java SDK 或 ConstraintLayout 的一部分。我发现的唯一提及是在 SDK 的 C 部分:

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 创建期间导致显着的性能下降。 如果列表单元格的层次结构足够简单,我建议切换到一些原始布局并检查行为。

不是真正的C++/Android运行时内部专家,无法清楚地解释/art/runtime/class_linker.h and implemented in /art/runtime/class_linker.cc中定义的VerifyClass方法的含义,但我不会太在意它的 CPU 执行时间。

我要考虑的是您的 RecyclerView 项目包含 ConstraintLayout 并且其 inflation 消耗 CPU 时间。

关于尝试发布版本的建议,这不会有任何区别 - 调试和发布版本都会调用本机 VerifyClass 方法。