Intelligent Technology's Technical Blog

株式会社インテリジェントテクノロジーの技術情報ブログです。

uiautomatorviewerでレイアウト解析

こんにちは、間藤です。

時として他人の書いたプログラムを読まなければならないことがあります。レビューであったり、引き継ぎであったり。
私にとっては、大抵の場合、これは苦行なのですが、皆さんはどうでしょうか?

さて、最近、引き継ぎの一環であるAndroidアプリのプログラムを解析していますが、これがなかなかの曲者で難儀しています。画面項目が多かったりすると、レイアウトをXMLやグラフィックレイアウトで確認するのもなかなか大変です。そんな時は、Android SDKが提供するツール「uiautomatorviewer」を活用しています。本来は、uiautomatorで自動テストを作成する際の補助ツールですが、画面構成を把握するのにもなかなか便利です。
すでに多くの方がこのツールを利用されているかとは思いますが、自分用の備忘録の意味も込めてまとめてみたいと思います。

準備

前述の通り、uiautomatorviewerはAndroid SDKに付属するツールです。Android SDK ToolsのRevision 21以降がインストールされていれば利用可能です。
また、uiautomatorは、Android 4.1(APIレベル16)以降で利用可能なため、それより前のバージョンでは、uiautomatorviewerも利用できません。手元にICS以前の端末がなかったので、4.0.3のAVDを作成してエミュレータで確認してみたところ、uiautomatorviewerでdumpを取得しようとすると、以下のようなエラーになりました。

f:id:IntelligentTechnology:20141120100510p:plain

ですから、uiautomatorviewerを利用する際には、4.1以降の実機かAVDを用意しましょう。

使い方

利用方法は、ほとんど説明不要というくらい簡単ですが、一応手順を記します。
uiautomatorviewerは、Android SDKをインストールしたディレクトリ(ANDROID_HOME)配下のtoolsというディレクトリに配置されています。ここにパスが通っていれば、

> uiautomatorviewer

で起動できます。
起動したら、対象端末で解析したい画面を表示して、「Device Screenshot(uiautomator dump)」ボタンを押すだけです。

f:id:IntelligentTechnology:20141120104901p:plain

以下は、ApiDemosアプリの解析結果です。

f:id:IntelligentTechnology:20141121102843p:plain

画面左のキャプチャイメージと、右側の階層は連動しているので、マウス選択することで、対応関係を確認することができます。

バージョンによる差異(?)

今回以下の2つの実機で確認しました。

GALAXYのほうですが、以下のような問題がありました。

  • 端末を横向きにしたときのキャプチャが縦に表示されてしまう。
  • IDが取得できていない

f:id:IntelligentTechnology:20141121102557p:plain

Nexusのほうでは、そのような問題はありませんでした。
Androidのバージョンによる違いなのか、機種による違いなのか、確認できていません。

hierarchyviewer

ICS以前のバージョンでは、hierarchyviewerというツールが利用できます。uiautomatorviewerと同様、Android SDKのtools配下に配置されています。uiautomatorviewerとは使い勝手が異なりますが、似たような機能が提供されます。

f:id:IntelligentTechnology:20141120113739p:plain

但し、root化した端末でないと利用できないという制約があるので、基本的にはエミュレータでの利用となります。(回避策あり)
また、起動時に、

The standalone version of hieararchyviewer is deprecated.
Please use Android Device Monitor (tools/monitor.bat) instead.

というメッセージが表示されます。(Windows環境にて確認)
ところで、この「monitor」ですが、以下のようなツールです。

f:id:IntelligentTechnology:20141120111502p:plain

これは、ADTのDDMSパースペクティブと同じ画面です。この画面からもuiautomatorviewerが提供する機能を実行できます。

f:id:IntelligentTechnology:20141120112015p:plain

つまり、uiautomatorviewerを起動せずとも、ADTやAndroid Studioからuiautomatorviewerの機能を呼び出せるということです。

話をhierarchyviewerに戻しますが、root化していない端末でhierarchyviewerを利用するには、以下のブログ記事が参考になります。私も、ここに記載された手順で試してうまくいきました。

非rootなAndroid端末でHierarchy Viewerを使う方法 - Just for Fun

ただ、プログラムコードに手を加える必要があるので、実用性には難があるなと思います。

まとめ

uiautomatorの補助ツールですが、冒頭にも書いたように他人の書いたプログラムを解析する際にも役立ちます。また、不必要にネストしているレイアウトは、パフォーマンス面で悪影響を与えますので、そういった問題を調べる際にも、こういったツールが役に立つと思います。