我正在查看我的应用生成的systrace
,并且我发现了一个耗时太长的帧。
这是由于RecyclerView
onCreateViewHolder
在我的项目视图展开时造成的。项目视图与ConstraintLayout
一样平坦。但是下面的systrace
报告有很多VerifyClass
块,每个块需要17毫秒。
VerifyClass
阻止意味着什么?
答案 0 :(得分:3)
很难说VerifyClass
正在做什么,因为它不是Android Java SDK或ConstraintLayout的一部分。我发现唯一提到的是SDK的C部分:
但我有几点建议:
1)尝试在发布模式下构建您的应用,看看您是否仍然遇到FPS丢失问题。我的假设是这个VerifyClass是为调试版本执行的,以对某些事情进行基准测试,但这只是猜测。
2)虽然ConstraintLayout具有方便的API和平面层次结构(这对绘图遍历有积极影响),但它仍然比其他Android布局具有多更慢的测量和布局过程。其原因是约束计算的复杂性。因此,在RecyclerView中使用它可能会在ViewHolder创建过程中造成重大性能损失。 如果列表单元格的层次结构足够简单,我建议切换到一些vanilla布局并检查行为。
答案 1 :(得分:3)
不是真正的 C ++ / Android运行时内部专家,可以清楚地解释/art/runtime/class_linker.h中定义的VerifyClass
方法并在/art/runtime/class_linker.cc中实现的方法,但我不知道不太注意其 CPU 的执行时间。
我要考虑的是您的RecyclerView
项目包含ConstraintLayout
且其通胀消耗 CPU 时间。
关于尝试发布版本的建议,它不会有任何区别 - 对调试版本和发布版本都将调用本机VerifyClass
方法。