サイトのトップへ戻る

Android Studio ドキュメント 日本語訳

サイト内検索

Lintを使ってコードの質を向上させる

Android アプリケーションがあなたの要件に合致しているかをテストすることに加え、コードに構造上な問題がないかを確認することも重要です。 下手な構造のコードだとAndroid アプリの信頼性や効率に影響を与え、コードの管理が難しくなります。 例えば、XML リソースファイルに使用しない名前空間が含まれていた場合、それが余計な負担となって不必要な処理が発生します。 非推奨エレメントや対象APIバージョンではサポートされていないAPI呼び出しの使用といった、構造上の問題によってはコードが正しく実行されない場合もあります。



概要

Android Studio では、lintと呼ばれるコードスキャニングツールが用意されています。 これを使うことで、アプリを実行したりテストコードを記述したりしなくてもコードの構造的品質の問題を特定して修正することができます。 改善が必要な致命的な改善点に素早く優先順位を付けられるようにするため、ツールによって検知された各問題点には説明文と重大度が付けられて報告されます。 また、重大度を下げてプロジェクトに関連のない問題を無視したり、重大度を上げて特定の問題を強調したりできます。

lint ツールでは、潜在的なバグはないか、正確性・セキュリティ・パフォーマンス・ユーザビリティ・アクセシビリティ・国際化の面で最適化できる改善点はないか、 Androidプロジェクトのソースファイルを確認します。 コマンドライン上や Android Studio上からlintを実行することができます。

メモ: Android Studioでコードがコンパイルされる時、 追加で IntelliJ コードインスペクション を実行してコードレビューを合理化します。

図 1 では lint ツールがアプリケーションのソースファイルをどのように処理するかを示しています。

図 1. lint ツールでのコードスキャニングの流れ

Application source files
ソースファイルは、Android プロジェクトを構成するファイル群のことです。 Javaファイル、XMLファイル、アイコン、ProGuard設定ファイルなどが含まれます。
The lint.xml file
lintで除外したいチェック項目を指定したり、問題の重大度をカスタマイズしたりするのに使用する設定ファイル。
The lint tool
Androidプロジェクトに対してコマンドライン上やAndroid Studio上から実行できる静的コードスキャニングツール(インスペクションを手動で実行するを参照してください)。 lint ツールは、Android アプリケーションの品質とパフォーマンスに影響するコードの構造的問題をチェックします。 アプリケーションを配信する前に、lintが検知したエラーを修正しておくことを強く推奨します。
Results of lint checking
コンソール上、もしくはAndroid StudioのInspection Resultsウィンドウ上から、lintのチェック結果を見ることができます。 詳細はインスペクションを手動で実行するを参照してください。


Android Studio上でlintを実行する

アプリをビルドする度に、設定された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を実行するには、以下のコマンドを使用します:

lint [flags] <project directory>

例えば、以下のコマンドを実行してmyproject ディレクトリとそのサブディレクトリ配下のファイルをスキャンすることができます。 issue ID の MissingPrefixによって、頭にAndroid 名前空間が付いていないXML 属性のみをスキャンするようlintに対して指示を出します。

lint --check MissingPrefix myproject 

ツールでサポートしているフラグとコマンドライン引数の一覧を見るには、以下のコマンドを使用してください:

lint --help


lint の出力例

以下は、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

上記の出力では四つの警告が表示されており、エラーはありません: 三つの警告(ManifestOrderUsesMinSdkAttributesUnusedResources) はプロジェクトの AndroidManifest.xml ファイルで発生し、一つの警告(IconMissingDensityFolder)は Preferences.xml レイアウトファイルで発生しています。



lintを設定する

既定ではlintのスキャンを実行した時、ツールはlinkがサポートしている全ての問題点をチェックします。 また、lintのチェックする問題点を制限し、それらに重大度を割り当てることもできます。 例えば、プロジェクトには関連しない特定の問題点へ対するlinkのチェックを無効にし、 致命的でない問題点を低い重大度で報告するようlintを設定できます。

以下のようなレベルでlintの設定を行うことができます:

  • Globally (entire project)
  • Project module
  • Production module
  • Test module
  • Open files
  • Class hierarchy
  • Version Control System (VCS) scopes


Android Studio上でlintを設定する

Android Studioを使用している場合は、内蔵のlint がコードをチェックします。 二つの方法で警告とエラーを見ることができます:

  • コードエディター上でポップアップ表示します。 linkが問題点を検知すると、問題のあるコードを黄色で強調表示します。もしくは、より深刻な問題の場合だと、コードに赤の下線が引かれます。
  • Analyze > Inspect Codeの順でクリックした後二表示されるlint Inspection Resultsウィンドウから。 詳細はインスペクションを手動で実行するを参照してください。


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 ファイルの例

以下の例は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 ファイルのソースチェックを設定する

lint がJavaファイルとXML ファイルのソースをチェックするのを無効にすることができます。

ヒント: Default Preferencesダイアログで、Javaファイル やXML ファイルに関するlintのソースチェック機能を管理できます。 File > Other Settings > Default Settingsの順に選び、それからDefault Preferences ダイアログの左のパネルで Editor > Inspectionsを選びます。



Javaファイル内でlintのチェック機能を設定する

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")


XMLファイル内でlintのチェック機能を設定する

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ウィンドウに表示されます。



インスペクションの範囲とプロファイルを設定する

以下のようにして、分析したいファイル(インスペクションの範囲)と実行したいインスペクション(インスペクションプロファイル)を選択します。:

  1. Android ビューでプロジェクトを開いて、分析したいプロジェクトやフォルダーやファイルを選びます。
  2. メニューバーから、Analyze > Inspect Codeの順に選びます。
  3. Specify Inspection Scope ダイアログで、設定を見てください。 Specify Inspection Scope

    図 2.インスペクション範囲の設定を見る

    Specify Inspection Scopeダイアログに表示されるオプションの組み合わせは、あなたがプロジェクトやフォルダーやファイルを選択したかどうかによって変わります。 他のラジオボタンから一つを選ぶことで、検査対象を変更することができます。 Specify Inspection Scopeダイアログに表示される全ての項目の説明については、 Specify Inspection Scope ダイアログ を参照してください。

    • プロジェクトやファイルやディレクトリを一つ選んだ時、Specify Inspection Scopeダイアログはあなたが選んだプロジェクトファイルディレクトリへのパスを表示します。
    • プロジェクトやファイルやディレクトリを一つ以上選んだ場合、Specify Inspection Scope ダイアログは Selected filesのラジオボタンを表示します。
  4. Inspection profileの下部分は、既定のプロファイルのまま (Project Default)にします。
  5. OK をクリックしてインスペクションを実行します。 図3 は、lint とその他 IDE インスペクションでコードの検査 を実行した結果が表示されています。:

    図 3. 問題点を選んで、その解決策を見ます

  6. カテゴリーを選んで、エラータイプを見ます。各問題を展開して選択すると、検査結果とエラーの説明が表示されます。説明には、エラーの情報とその問題を修正するために役立つリンクが含まれています。


カスタムスコープを使用する

以下のようにして、Android Studioで用意されたカスタムスコープを一つ使用することができます:

  1. Specify Inspection Scope ダイアログで、 Custom scopeをクリックします。
  2. Custom scopeドロップダウンリストをクリックしてオプションを表示します。

    Choose Inspection Scope

    図 4. 使用したいカスタムスコープを選びます。

    • Project Files: 現在のプロジェクトの全てのファイル。
    • Project Production Files: 現在のプロジェクトのプロダクションファイルのみ。
    • Project Test Files: 現在のプロジェクトのテストファイルのみ。詳細はTest Types and Location.を参照してください。
    • Open Files: 現在のプロジェクトであなたが開いているファイルのみ。
    • Module <your-module>: 現在のプロジェクトの対応するモジュールフォルダー内にあるファイルのみ。
    • Current File: 現在のプロジェクトで操作しているファイルのみ。ファイルやフォルダーを選択している時に表示されます。
    • Class Hierarchy: これを選んで OKをクリックすると、現在のプロジェクト内の全クラスが表示されたダイアログが現れます。 ダイアログ内のSearch by Name項目を使って検査するクラスのフィルターや選択を行います。 クラス一覧のフィルターを行わない場合、コードインスペクションは全てのクラスを検査します。
  3. OKをクリックします。


カスタムスコープを作成する

現在使用できるカスタムスコープでは範囲外となっているファイルとディレクトリのコード診断をしたい場合は、 カスタムスコープを作成することができます。

  1. Specify Inspection Scope ダイアログで、Custom scopeを選びます。
  2. Custom Scope ドロップリストの後ろにある、三点ドットをクリックします。

    図 5. Specify Inspection Scope ダイアログ

    Scopes ダイアログが表示されます。

    図 6. カスタムスコープを作成する

  3. Add をクリックして新しいスコープを定義します。
  4. 表示された Add Scope ドロップダウンリストで Localを選びます。

    local スコープとshared スコープは両方とも、コード検査機能のためにプロジェクト内で使用されます。 Shared スコープは、Scope フィールドを持った他のプロジェクト機能でも使用できます。 例えば、 Edit Settings をクリックして Find Usagesの設定を変更する時、表示されたダイアログにはScope フィールドがあるのでそこでshared スコープを選択することができます。

    図 7. Find Usagesダイアログでsharedスコープを選択する

  5. スコープ名を入力して OKをクリックします。

    Scopes ダイアログの右側パネルには、カスタムスコープで定義できるオプションが表示されます。

  6. ドロップダウンリストから Projectを選びます。

    使用可能なプロジェクトの一覧が表示されます。

    メモ: プロジェクトやパッケージ用のカスタムスコープを作成することができます。手順はどちらも同じです。

  7. プロジェクトフォルダーを展開し、カスタムスコープを追加したい対象を選んで、画面の右にあるボタンのうちどれか一つをクリックします。

    図 8. カスタムスコープを定義する

    • Include: このフォルダーと配下のファイルはインクルードしますが、そのサブフォルダーはインクルードしません。
    • Include Recursively: このフォルダーと配下のファイル全て、およびサブフォルダーと配下のファイルをインクルードします。
    • Exclude: このフォルダーと配下のファイルは除外しますが、そのサブディレクトリは除外しません。
    • Exclude Recursively: このフォルダーと配下のファイル全て、およびサブディレクトリと配下のファイルを除外します。

    図 9 では、main フォルダーはインクルードして、 javaフォルダーは再帰インクルードしています。青は部分的にインクルードされているフォルダを示し、緑は再帰的にインクルードされているフォルダとファイルを示します。

    図 9. カスタムスコープのパターン例

    • java フォルダーを選んでExclude Recursivelyをクリックした場合は、javaフォルダーとその配下にある全てのフォルダーとファイルが緑で強調表示されます。
    • 代わりに緑で強調された MainActivity.java ファイルを選んでExcludeをクリックした場合は、 MainActivity.java は緑の強調表示がされなくなりますが、javaフォルダ配下にある全てのものは緑強調表示のままです。
  8. OKをクリックします。ドロップダウンリストの一番下にカスタムスコープが表示されます。


インスペクションプロフィールのレビューと編集を行う

Android Studio ではlintの他にも、Android アップデートで更新できるその他インスペクションプロフィールが選択できます。 これらのプロフィールをそのまま使用することも、名前や説明や重大度やスコープを編集することもできます。 また、プロフィールのグループ全体を有効化・無効化したり、グループ内のプロフィールを個別に有効化・無効化したりできます。

Inspections ダイアログにアクセスするには:

  1. Analyze > Inspect Code.の順に選びます
  2. Inspection Profile配下にあるSpecify Scope ダイアログで、 三点ドットをクリックします。

    サポートしているインスペクションのその説明の一覧が記載された、 Inspections ダイアログが表示されます。

    図 10. サポートしているインスペクションとその説明

  3. インスペクションでDefault (Android Studio) と Project Default (現在のプロジェクト) の切り替えをするには、Profile ドロップダウンリスを選びます。 詳細についてはIntelliJ Specify Inspection Scope ダイアログ ページを参照してください。
  4. 左側の Inspections ダイアログで、最上位のプロフィールカテゴリーを選ぶか、グループを展開して特定のプロフィールを選びます。 プロフィールカテゴリーを選ぶと、全てのインスペクションを一つのインスペクションとして編集できます。
  5. インスペクションに対してコピー、名前変更、説明の追加、エクスポート、インポートを行うには、Manageドロップダウンリストを選びます。
  6. 完了したら、OKをクリックします。