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

第40回 分析機能について

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

はじめに

今回は地味ながらもあなどれない分析機能――「Analyze」メニューについて紹介します。⁠Analyze」メニューは図1のようなコマンドで構成されています。

図1 ⁠Analyze」メニューの内容

図1 「Analyze」メニューの内容

"Infer Nullity..."まではインスペクション系の機能で,それ以降が分析系の機能になっています。まずはインスペクション系の機能について紹介します。

インスペクションについて

第14回で紹介したインスペクションはいわゆる on the fly(その場で指摘)系のもので,インテンションと異なり解決策の提案はほとんど行いません。そのためもあって,ともすれば小うるさいだけの機能に受け取られがちです。

しかし「Analyze」メニューにある"Inspect Code..."を実行すると「Inspectionツールウィンドウ」にインスペクション結果が出力されます。ちょうど検索("Find in Path")やリファクタリング・プレビューの「Findツールウィンドウ」に若干似ています。

図2 "Inspect Code..."の実行例(クリックすると動きがわかります)

「Inspectionツールウィンドウ」は左側のペインに,インスペクションで該当した箇所がカテゴリ別に分類されてリストアップされます。分類はツールバーで多少カスタマイズすることができます(詳しくは後述します)⁠右側のペインには,左側で選択した対象の詳細(該当ファイル名やインスペクションに該当した理由など)が表示されます。

この「Inspectionツールウィンドウ」の特筆すべき点は,ツールバーにある Apply a quickfix」です。このアイコンをクリックすると,インスペクションに引っかかった対象に然るべき解決策を適用します。

図3 ⁠Apply a quickfix」ボタンで問題を解決する

図3 「Apply a quickfix」ボタンで問題を解決する

すべてのインスペクションに対して解決策が付くわけではありませんが,インスペクション結果を俯瞰して対応を施せる点が 第14回 で紹介した方法と異なります。

なお「Apply a quickfix」を実行したときにポップアップされる修正候補は「Inspectionツールウィンドウ」右側の詳細ペインに表示している「Problem resolution」と同じものです。

図4 ⁠Accept Resolution」ポップアップから解決策を選ぶ

図4 「Accept Resolution」ポップアップから解決策を選ぶ

この「Problem resolution」のリンクをクリックしても解決策の適用になりますが「Apply a quickfix」は左側ペインの選択箇所に応じて,広範囲に解決策を適用できます。

参考までに「Inspectionツールウィンドウ」のツールバーの機能を表1に示します(⁠Findツールウィンドウ」ツールバーと同じ機能のものは省略しています)⁠

表1 ⁠Inspectionツールウィンドウ」のツールバーのリスト(一部抜粋)

アイコン機能
Exportインスペクション結果をHTMLかXMLにエクスポートします。XMLでエクスポートした結果は "View Offline Inspection Results..."で再表示できます。
Group by Severityインスペクション結果を重要度別に分類します。
Group by directoryインスペクション結果をディレクトリ別に分類します。
Filter resolved items解決済みの対象を除外(フィルタリング)します。
Show diff Rerun Inspection」で再度インスペクションを実行したときに前回との違いを表示します(字の色が変わる)⁠
Show diff onlyおなじく,再度インスペクションを実行したときに,前回と変わらない結果を隠します。……とはヘルプにあるますが,正直「Show Diff」⁠Show diff only」の振る舞いはイマイチ納得できていません。
Edit settings該当するインスペクションの設定画面を開きます。
Apply a quickfixインスペクションに対応する解決策を適用します。
Hectorおじさん特定のコマンド名はありません。該当するインスペクション項目の有効/無効を設定します。クリックするとポップアップが表示されます。

その他のインスペクション系メニューについて

"Inspect Code..."以外にあと3つあるインスペクション系メニューについて紹介します。

Run Inspection by Name...
特定のインスペクション項目を名前を指定して実行します。

図4 ⁠Enter inspection name」ポップアップ

図4 「Enter inspection name」ポップアップ

"Find Action"や"Search Everwhere"のようなポップアップウィンドウから実行したいインスペクション名を指定するのですが,正直なところインスペクションを個別に覚えていられないので,ほとんど使った事はありません。ただインスペクションのセット(プロファイル)を作らず実行できるので,年に数回程度役に立つときがあります。
Configure Current File Analysis...
現在エディタで開いているファイルのインスペクションのレベルを設定します。ステータスバーの Hectorおじさん」をクリックしたのと同じです。

図6 "Configure Current File Analysis..."の実行例

図6 

本稿を執筆していて明確になったのですが,ステータスバーのHectorおじさんも含めて,この設定の対象は現在編集中のファイルだけになります(面倒なことに「Power save mode」だけ全体に対して有効です)⁠
ただし,その設定はリアルタイムインスペクションにだけ有効です。インスペクションのレベルと言っても正しくは「Highlighting Level(コードハイライトのレベル)⁠なので,仮にその設定値を「None(なにもしない)⁠にしても,"Inspect Code..."や"Run Inspection by Name..."の評価対象になります。
View Offline Inspection Results...
「Inspectionツールウィンドウ」から Export」を実行し,XML形式で保存しておいたインスペクション結果を再表示します。インスペクションのプロファイルによっては,"Inspect Code..."は非常に時間がかかるし,その結果もAndroid Studioを終了すると消えてしまいます。そのため,このオフラインブラウズは意外と重宝します。

[コラム]"Infer Nullity..."とはなに?

もともとIntelliJに提供されているnull推論機能です。JSR305に似た独自のアノテーションを用いて,変数やパラメタなどにnullを許可する/しないというマークを付けることができます。Android Studioで,この機能の恩恵を受けるのは小細工が必要なので,この機能自体を忘れてしまっても,そう困る事はありません。

"Infer Nullity..."を実行するとソースコードを解析して,変数やパラメタがnullを許可するのかしないのかを推測して,許可するのであれば@NotNullを許可しないのであれば@Nullableを設定します。

図7 "Infer Nullity..."実行前のコード例

図7 

図8 "Infer Nullity..."実行後のコード例

図8 

@NotNull@Nullableの実体はAndroid Studioが提供しているannotations.jarに含まれています。そのため "Infer Nullity..."を実行すると図9のようにannotations.jarをプロジェクトに設定する方法を問い合わせてきます。

図9 ⁠Add Library to Project」ダイアログ

図9 「Add Library to Project」ダイアログ

この annotations.jar がクセモノなのです。ビルドシステムがIDE自身のものを利用するIntelliJの場合,何も気にすることはありませんが,ビルドシステムをGradleにゆだねているAndroid Studioでは一筋縄にはいきません。一見して"Infer Nullity..."が成功できたかのように見えますが,Gradleは annotations.jar の事を知らないので,ビルドすると大量のエラーが表示されます。

解決策としては,annotations.jarをプロジェクトに内包させ,build.gradleリスト1のように記述することです。

リスト1 build.gradleに annotation.jar を追加する

dependencies {
  compile files('lib/annotations.jar')
}

ただ,特定のIDE固有のアノテーションにまみれさせてまでする価値のある機能か?というと正直疑問が残ります。⁠IntelliJや)Android Studioのプラグイン開発でならば,そのIDE固有アノテーションを使うことにも抵抗はないのですが,それ以外の開発で利用するとなると抵抗があります。

ちなみに,これらのアノテーションはRetentionPolicy.CLASSです。

著者プロフィール

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

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

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

Twitter: @masanobuimai

コメント

コメントの記入