Android アプリケーションがあなたの要件に合致しているかをテストすることに加え、コードに構造上な問題がないかを確認することも重要です。 下手な構造のコードだとAndroid アプリの信頼性や効率に影響を与え、コードの管理が難しくなります。 例えば、XML リソースファイルに使用しない名前空間が含まれていた場合、それが余計な負担となって不必要な処理が発生します。 非推奨エレメントや対象APIバージョンではサポートされていないAPI呼び出しの使用といった、構造上の問題によってはコードが正しく実行されない場合もあります。
Android Studio では、lintと呼ばれるコードスキャニングツールが用意されています。 これを使うことで、アプリを実行したりテストコードを記述したりしなくてもコードの構造的品質の問題を特定して修正することができます。 改善が必要な致命的な改善点に素早く優先順位を付けられるようにするため、ツールによって検知された各問題点には説明文と重大度が付けられて報告されます。 また、重大度を下げてプロジェクトに関連のない問題を無視したり、重大度を上げて特定の問題を強調したりできます。
lint ツールでは、潜在的なバグはないか、正確性・セキュリティ・パフォーマンス・ユーザビリティ・アクセシビリティ・国際化の面で最適化できる改善点はないか、 Androidプロジェクトのソースファイルを確認します。 コマンドライン上や Android Studio上からlintを実行することができます。
メモ: Android Studioでコードがコンパイルされる時、 追加で IntelliJ コードインスペクション を実行してコードレビューを合理化します。
図 1 では lint ツールがアプリケーションのソースファイルをどのように処理するかを示しています。
図 1. lint ツールでのコードスキャニングの流れ
lint.xml
fileアプリをビルドする度に、設定されたlintとIDEインスペクションが実行されます。 コードレビューを合理化するために、IDE インスペクションと合わせてIntelliJ コードインスペクションのlint チェックが設定されます。
メモ: インスペクションにおける重大度を見たり編集したりするには、File > Other Settings > Default Settings > Editor > Inspectionsの順で選びます。 これでInspection Configuration ダイアログが開きます。このダイアログはサポートしているインスペクションとそれらの重大度の一覧を表示します。
build.gradle
ファイルから、特定のビルドバージョンもしくは全てのビルドバージョンに対してlintインスペクションを実行することもできます。
ビルドファイルの android
設定にlintOptions
プロパティを追加してください。
以下のGradleビルドファイルコードでは、
quiet
オプションにtrue
を設定して abortOnError
オプションにfalse
を設定しています。
android { lintOptions { // set to true to turn off analysis progress reporting by lint quiet true // if true, stop the gradle build if errors are found abortOnError false // if true, only report errors ignoreWarnings true } ... }
メモ:Android Studio上から手動でインスペクションを実行し、 Inspection Resultsウィンドウで各インスペクション結果を見ることができます。 詳細についてはインスペクションを手動で実行するを参照してください。
プロジェクトディレクトリにあるファイル一覧に対してlintを実行するには、以下のコマンドを使用します:
lint [flags] <project directory>
例えば、以下のコマンドを実行してmyproject
ディレクトリとそのサブディレクトリ配下のファイルをスキャンすることができます。
issue ID の MissingPrefix
によって、頭にAndroid 名前空間が付いていないXML 属性のみをスキャンするようlintに対して指示を出します。
lint --check MissingPrefix myproject
ツールでサポートしているフラグとコマンドライン引数の一覧を見るには、以下のコマンドを使用してください:
lint --help
以下は、Earthquakeという名前のプロジェクトに対してlintコマンドを実行した時のコンソール出力例です。
$ lint Earthquake Scanning Earthquake: ............................................................................................................................... Scanning Earthquake (Phase 2): ....... AndroidManifest.xml:23: Warning: <uses-sdk> tag appears after <application> tag [ManifestOrder] <uses-sdk android:minSdkVersion="7" /> ^ AndroidManifest.xml:23: Warning: <uses-sdk> tag should specify a target API level (the highest verified version; when running on later versions, compatibility behaviors may be enabled) with android:targetSdkVersion="?" [UsesMinSdkAttributes] <uses-sdk android:minSdkVersion="7" /> ^ res/layout/preferences.xml: Warning: The resource R.layout.preferences appears to be unused [UnusedResources] res: Warning: Missing density variation folders in res: drawable-xhdpi [IconMissingDensityFolder] 0 errors, 4 warnings
上記の出力では四つの警告が表示されており、エラーはありません: 三つの警告(ManifestOrder
と UsesMinSdkAttributes
と UnusedResources
)
はプロジェクトの AndroidManifest.xml
ファイルで発生し、一つの警告(IconMissingDensityFolder
)は Preferences.xml
レイアウトファイルで発生しています。
既定ではlintのスキャンを実行した時、ツールはlinkがサポートしている全ての問題点をチェックします。 また、lintのチェックする問題点を制限し、それらに重大度を割り当てることもできます。 例えば、プロジェクトには関連しない特定の問題点へ対するlinkのチェックを無効にし、 致命的でない問題点を低い重大度で報告するようlintを設定できます。
以下のようなレベルでlintの設定を行うことができます:
Android Studioを使用している場合は、内蔵のlint がコードをチェックします。 二つの方法で警告とエラーを見ることができます:
lint.xml
ファイルで、linkのチェックに関する環境設定を編集することができます。
このファイルを手動で作成している場合、ファイルをAndroid プロジェクトのルートディレクトリに置いてください。
lint.xml
ファイルは、親タグ <lint>
とそれに囲まれた一つ以上の<issue>
要素によって構成されています。
Lint では各 <issue>
に重複のないid
属性値を定義します。
<?xml version="1.0" encoding="UTF-8"?> <lint> <!-- list of issues to configure --> </lint>
<issue>
タグのseverity属性を設定することで、問題点の重大度を変更したり、問題点をlinkがチェックしないようにできます。
ヒント:
linkがサポートしている問題点とそれらに対応するissue IDの全一覧を知りたい場合は、lint --list
コマンドを実行してください。
以下の例はlint.xml
ファイルの中身です。
<?xml version="1.0" encoding="UTF-8"?> <lint> <!-- Disable the given check in this project --> <issue id="IconMissingDensityFolder" severity="ignore" /> <!-- Ignore the ObsoleteLayoutParam issue in the specified files --> <issue id="ObsoleteLayoutParam"> <ignore path="res/layout/activation.xml" /> <ignore path="res/layout-xlarge/activation.xml" /> </issue> <!-- Ignore the UselessLeaf issue in the specified file --> <issue id="UselessLeaf"> <ignore path="res/layout/main.xml" /> </issue> <!-- Change the severity of hardcoded strings to "error" --> <issue id="HardcodedText" severity="error" /> </lint>
lint がJavaファイルとXML ファイルのソースをチェックするのを無効にすることができます。
ヒント: Default Preferencesダイアログで、Javaファイル やXML ファイルに関するlintのソースチェック機能を管理できます。 File > Other Settings > Default Settingsの順に選び、それからDefault Preferences ダイアログの左のパネルで Editor > Inspectionsを選びます。
Android プロジェクト内の、具体的にはJava クラスやメソッドに対するlintのチェック機能を無効にするには、
Javaコードに @SuppressLint
アノテーションを追加します。
以下の例では、 onCreate
メソッド内にて、lintのNewApi
問題に関するチェック機能を無効にしています。
このクラスの他のメソッドでは、lint ツールは依然としてNewApi
問題をチェックし続けます。
@SuppressLint("NewApi") @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);
以下の例では、 FeedProvider
クラス内にて、lint の ParserError
問題に関するチェック機能を無効にしています。:
@SuppressLint("ParserError") public class FeedProvider extends ContentProvider {
Java ファイル内にて、lintの全ての問題に関するチェック機能を無効にするには、以下のようにキーワード all
を使用します。:
@SuppressLint("all")
tools:ignore
属性を使ってXML ファイルの特定の項目でlintのチェック機能を無効にすることができます。
lint.xml
ファイルに以下の名前空間値を入力してください。すると、lintツールがこの属性を認識するようになります。:
namespace xmlns:tools="http://schemas.android.com/tools"
以下の例では、XMLレイアウトファイルの<LinearLayout>
要素内で、lintのUnusedResources
問題に関するチェック機能を無効にしています。
このignore
属性は、 ignore
属性が宣言された要素の子要素にも引き継がれます。
今回の例では、子要素である<TextView>
においても、lint のチェック機能は無効になります。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:ignore="UnusedResources" > <TextView android:text="@string/auto_update_prompt" /> </LinearLayout>
一つ以上のチェック対象問題を無効にするには、無効にする問題をコンマ区切りの一覧で設定します。例えば:
tools:ignore="NewApi,StringFormatInvalid"
XML 要素内にて、lintの全ての問題に関するチェック機能を無効にするには、以下のようにキーワードall
を使用します。:
tools:ignore="all"
Inspect Code > Analyzeの順に選ぶことで、設定したlintやその他IDEインスペクションを手動で実行することができます。 インスペクションの結果は Inspection Resultsウィンドウに表示されます。
以下のようにして、分析したいファイル(インスペクションの範囲)と実行したいインスペクション(インスペクションプロファイル)を選択します。:
Specify Inspection Scopeダイアログに表示されるオプションの組み合わせは、あなたがプロジェクトやフォルダーやファイルを選択したかどうかによって変わります。 他のラジオボタンから一つを選ぶことで、検査対象を変更することができます。 Specify Inspection Scopeダイアログに表示される全ての項目の説明については、 Specify Inspection Scope ダイアログ を参照してください。
以下のようにして、Android Studioで用意されたカスタムスコープを一つ使用することができます:
図 4. 使用したいカスタムスコープを選びます。
現在使用できるカスタムスコープでは範囲外となっているファイルとディレクトリのコード診断をしたい場合は、 カスタムスコープを作成することができます。
Scopes ダイアログが表示されます。
local スコープとshared スコープは両方とも、コード検査機能のためにプロジェクト内で使用されます。 Shared スコープは、Scope フィールドを持った他のプロジェクト機能でも使用できます。 例えば、 Edit Settings をクリックして Find Usagesの設定を変更する時、表示されたダイアログにはScope フィールドがあるのでそこでshared スコープを選択することができます。
図 7. Find Usagesダイアログでsharedスコープを選択する
Scopes ダイアログの右側パネルには、カスタムスコープで定義できるオプションが表示されます。
使用可能なプロジェクトの一覧が表示されます。
メモ: プロジェクトやパッケージ用のカスタムスコープを作成することができます。手順はどちらも同じです。
図 9 では、main フォルダーはインクルードして、 javaフォルダーは再帰インクルードしています。青は部分的にインクルードされているフォルダを示し、緑は再帰的にインクルードされているフォルダとファイルを示します。
Android Studio ではlintの他にも、Android アップデートで更新できるその他インスペクションプロフィールが選択できます。 これらのプロフィールをそのまま使用することも、名前や説明や重大度やスコープを編集することもできます。 また、プロフィールのグループ全体を有効化・無効化したり、グループ内のプロフィールを個別に有効化・無効化したりできます。
Inspections ダイアログにアクセスするには:
サポートしているインスペクションのその説明の一覧が記載された、 Inspections ダイアログが表示されます。
図 10. サポートしているインスペクションとその説明