Android Studio最速入門~効率的にコーディングするための使い方

第40回 分析機能について

この記事を読むのに必要な時間:およそ 8 分

分析系のコマンドについて

続いての機能が分析系の機能です。インスペクションに押され気味ですが「Analyze」メニューの本命はこちらです(と思ってます⁠⁠。

依存関係の分析

コード,モジュールなどの依存関係の分析を行います。身もフタも無い紹介をするとJDependみたいなもの」です。Android Studioで用意しているコマンドは以下の通りです。

Analyze Dependencies...
クラスやライブラリ,モジュールの依存関係(順方向:親→子)を分析します。
Analyze Backward Dependencies...
クラスやライブラリ,モジュールの依存関係(逆方向:子→親)を分析します。分析したい対象(クラスやパッケージ,ライブラリ)を選択し,コマンドを実行することで,それに依存している対象を探し出します。順方向の分析に比べて時間がかかります。
Analyze Module Dependencies...
モジュール間の依存関係(順方向:親→子)を分析します。この分析だけ(後述する)⁠Dependency Viewerツールウィンドウ」ではなく「Module Dependenciesツールウィンドウ」が右側に表示されます。ただ,それほど使い道はないでしょう……。
Analyze Cyclic Dependencies...
パッケージやライブラリ,モジュールの循環参照関係を分析します。主にパッケージ間の依存関係を探るのに用います。

"Analyze Dependencies..."は特にどこかを指定しなくても使えるコマンドですが,Androidプロジェクトは自動生成したコードがあったりと,通常のJavaプロジェクトより複雑なので,図12のようにソースディレクトリを指定して分析することをオススメします。

図12 ソースディレクトリを指定して"Analyze Dependencies..."を実行する

図12 ソースディレクトリを指定して

依存関係の分析が完了すると「Dependency Viewerツールウィンドウ」にその結果が表示されます("Analyze Module Dependencies..."は除く⁠⁠。このツールウィンドウは3つの区画(ペイン)から成り立っています。

Analyzed Codeペイン
ツールウィンドウの左上部分です。分析の対象となったクラスやパッケージがリストアップされます。この中のどれかを選択すると,それと依存関係のあるものが右隣の「Parent Codeペイン」に表示されます。
Parent Codeペイン
ツールウィンドウの右上部分です。⁠Analyzed Codeペイン」で選択中のノード(クラスやパッケージ)に依存しているオブジェクトがリストアップされます。さらに,ここのどれかを選択すると,使用箇所の詳細が下の「Usageペイン」に表示されます。
Usageペイン
「Analyzed Codeペイン」「Parent Codeペイン」で選択したノード(クラス)の使用箇所をリストアップします。左端のツールバーにある Preview」をONにすると右側に「Usageペイン」で選択したノードに該当するソースコードをプレビューします。

図13 ⁠Dependency Viewerツールウィンドウ」の例

図13 「Dependency Viewerツールウィンドウ」の例

では,"Analyze Dependencies..."を例に,実際の使い方を紹介します。説明を簡単にするため,図14のような構造のクラス群(ソースコードはリスト2 のとおり)を例にします。

図14 依存関係の分析に用いるクラス群

図14 依存関係の分析に用いるクラス群

リスト2 依存関係の分析に用いるクラス群のソースコード

public class A {
  private B b;
  private C c;
}

public class B {}

public class C {
  private A a;
}

public class D extends A { }

"Analyze Dependencies..."を実行すると順方向(親→子)の依存関係が「Dependency Viewerツールウィンドウ」にリストアップされます。とは言え,それを眺めているだけでは楽しくもなんともありません。この機能の真骨頂は依存関係にルールを適用する事にあります。

仮に「クラスAはクラスBを使ってはいけない」というルールを適用したい場合,図15のように「Analyzed Codeペイン」「Parent Codeペイン」でそれぞれのクラスを指定した状態でツールバーにある Mark Illegal」をクリックします。

図15 クラスAはクラスBに依存しているが,それを禁止したい

図15 クラスAはクラスBに依存しているが,それを禁止したい

すると「クラスAはクラスBを使ってはいけない」がルールとなり,以降エディタ上では図16のようにインスペクションの警告対象となります。

図16 クラスAがクラスBを使うのは依存性違反

図16 クラスAがクラスBを使うのは依存性違反

これはインスペクションの『General / Illegal package dependencies』が行っている検査で,先ほどの Mark Illegal」で,この検査項目のオプション(Configure dependency rules)を指定したわけです。この依存関係のルールは Edit Rules」でより細かく指定することができます。

図17 ⁠Dependency Validation」ダイアログ

図17 「Dependency Validation」ダイアログ

「Dependency Validation」ダイアログは禁止と許可の2つの方法で依存関係のルールを定義できます。

禁止するルール
「Deny usages of」に対象を,⁠in」に依存してほしくない利用箇所を指定します。先ほどの例では「Deny usage of クラスB in クラスAという指定になります。
許可するルール
禁止とは逆に「ここでだけ利用を許可する」というルールです。⁠Allow usages of」に対象を,⁠only in」にここでだけ利用してほしい箇所を指定します。
たとえば「クラスAはクラスDだけ使って良い」とするならば「Allow usages of クラスA only in クラスDとします。この場合,クラスCが依存性違反で警告されます。

図18 ⁠クラスAはクラスDしか使えない」のでクラスCが警告される

図18 「クラスAはクラスDしか使えない」のでクラスCが警告される

なお「Dependency Validation」ダイアログに指定する対象はスコープ(scopes)なので,特定のクラスだけではなく,もっと多彩なパターン(特定のパッケージとか,特定の接頭子や接尾子など)で指定することができます。

"Analyze Backward Dependencies..."の場合は,図19のように依存される側を選択してから実行するのがポイントです。

図19 "Analyze Backward Dependencies..."の実行例

図19 

たとえばクラスAに対して実行すると,クラスAに依存しているのはクラスCとクラスDということがわかります。

図20 クラスAに対する"Analyze Backward Dependencies"の実行結果

図20 クラスAに対する

"Analyze Cyclic Dependencies..."はパッケージ同士の循環参照関係を分析します。先ほどの例はすべて同じパッケージに存在するため,このコマンドを実行しても何も結果がでません。それでは面白くないので,クラスCを別パッケージに移動してから実行してみると図21のような結果になります。

図21 "Analyze Cyclic Dependencies"の実行結果

図21 

著者プロフィール

今井勝信(いまいまさのぶ)

システムエンジニア。日本ユニシス株式会社所属。仙台在住。

Android開発はまったくやったことがないけれどIntelliJ IDEAが大好き。

Twitter: @masanobuimai