Android

ConstraintLayoutをネストすると激重になる

ConstraintLayoutを使うとやたら重くなったので調査した。
多重のViewGroup内に10セル程度のListViewを配置した画面が、完全に表示されるまでの時間を計測。

こんな感じ

<ConstraintLayout>
  <ConstraintLayout>
    <ConstraintLayout>
      <ConstraintLayout>
        <ConstraintLayout>
          <!-- 長いので以下省略 -->
          <ListView />
        </ConstraintLayout>
      </ConstraintLayout>
    </ConstraintLayout>
  </ConstraintLayout>
</ConstraintLayout>

調査結果

レイアウト 時間(秒)
何もなし 0.7
FrameLayout 15個 1.0
LinearLayout 15個 1.5
RelativeLayout 15個 12
ConstraintLayout 15個 動作不能(60秒以上)
ConstraintLayout 12個 動作不能(60秒以上)
ConstraintLayout 10個 23
ConstraintLayout 8個 4

※ Huawei p10 Lite(Android7 2017/06発売)にて確認

まとめ

ViewGroupをネストすると重くなるとよく言われるが、レイアウトクラスによって重さはかなり違うもよう。
FrameLayoutはたいしたことないが、RelativeLayoutのネストはかなり重く、ConstraintLayoutはさらに重い。

ConstraintLayoutはフラットなView階層を実現できるのでパフォーマンス向上を見込めると公式に説明があるが、フラットにしないと使い物にならないかもしれない。

LinearLayout は上の条件では軽かったが、layout_weightを使うと重くなるとの情報がある。
使うattributeやViewの構成など諸々の条件によっても重さは変わってくるものと思われる。