[Android Tips] layoutoptでレイアウトを最適化

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Android開発では、パフォーマンスの最適化がとても重要になってきます。

レイアウトは通常XMLで記述しますが、このレイアウトの構造もパフォーマンスを意識して作らなければ
目に見て分かるレベルでアプリの動作速度が変わってきます。

そこで今回はレイアウトを最適化するツール「layoutopt」使って、最適化を試してみたいと思います。

layoutoptとは

layoutoptとは、XMLで記述されたレイアウトファイルの階層構造を分析し、最適化を支援するコマンドラインツールです。
Android SDKに標準で同梱されています。

layoutoptの使いかた

layoutoptの使いかたはとても簡単です。
layoutoptはAndroidSDKのtoolsフォルダ内にあるので、コマンドラインでアクセスし実行します。
以下のように、レイアウトのパフォーマンスをチェックしたい対象のレイアウトファイルを指定します。

フォルダを指定すれば(layoutフォルダなど)、そのフォルダ内のXMLファイルをまとめてチェックしてくれます。

 layoutopt <チェックしたいXMLファイルのパス> 

以下のようなXMLファイルを作ってチェックしてみました。

layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    </LinearLayout>

</LinearLayout>
 

トップレベルのLinearLayoutの下に、無意味なLinearLayoutを置いてみました。

layoutoptの出力結果

 
D:\android-sdk-windows\tools>layoutopt ../layout/layout.xml
..\layout\layout.xml
        10:11 This LinearLayout view is useless (no children, no background, no id)

「LinearLayoutは必要ないよ」と注意されました!

最適化のチェックポイントは他に以下のようなものがあるようです(もちろんケースバイケースではありますが…)。

  • ルートのレイアウトにFrameLayoutを使う場合は代わりにmergeを使う
  • wrap-contentではなく0dipを使う
  • layoutの子は80以下にすべき
  • ネストは10個以下に抑える

まとめ

Android開発において、パフォーマンスの最適化はとても重要です。
layoutoptはあくまでレイアウトの最適化を支援するツールですので、問題があった箇所を修正してくれたりはしません。
layoutoptの検証結果を参考にしながら、自分で修正することが必要です。
リリース前に一度layoutoptでチェックすると良いかもしれません。
layoutoptを使って、ぜひご自身のアプリのレイアウトの階層構造が最適化されているかチェックしてみてください。