Android Lint — Android StudioおよびGradleに組み込まれた静的コードアナライザーで、Googleの推奨事項に従ってソースファイルをチェックします。Lintはコンパイル前に潜在的なエラーを検出します:未使用のリソース、パフォーマンス問題、メモリリーク、APIの非互換性。このツールはXML、Java、Kotlinファイルを解析します。詳細はAndroid Lint Guideをご覧ください。
重要なポイント
Android Lintは、Android SDKおよびAndroid Studioに含まれる静的解析ツールです。Lintはアプリケーションのソースコードを実行せずにスキャンし、コンパイラが見逃す問題を検出します:未使用のリソース、不適切なローカライゼーション、潜在的なメモリリーク、minSdkVersionとのAPI非互換性、Googleのパフォーマンス推奨事項の違反。
静的解析は、実際のコード実行を必要としないソフトウェア検証手法です。構文と型のみをチェックするコンパイラとは異なり、静的アナライザーは論理エラー、アンチパターン、ベストプラクティスからの逸脱を探します。Lintはカテゴリ別に200以上の組み込みチェックを実行します:correctness、performance、security、accessibility、usability、I18N。
Lintは複数のレベルで動作します:XML解析はレイアウト、リソース(strings、colors、dimens)、マニフェスト、設定ファイルをチェックします。Java/Kotlin解析はソースコードを調べて、非推奨API呼び出し、スレッド問題、コンテキストリークを検出します。Gradle解析はビルド設定のバージョン互換性をチェックします。
LintチェックはAndroid Studio(Analyze > Inspect Code)またはGradleコマンドで起動します:./gradlew lint。結果はbuild/reports/lint-results.htmlフォルダのHTMLレポートとCIシステム用のXMLレポートです。Lintは各ファイルを独立して解析し、一連のルール(Issue)を適用します。各ルールには一意のID、説明、カテゴリ、重大度レベルがあります。
Lintの重大度レベル:Error(エラー — ビルドをブロック)、Warning(警告 — 品質に影響)、Informational(情報 — 参考用)、Ignore(デフォルトで無視)。レベルはlint.xmlで設定します。LintエラーはlintOptions.abortOnError trueでGradleビルドを失敗させるように設定できます。
android {
lintOptions {
abortOnError true
checkAllWarnings true
baselineFile file("lint-baseline.xml")
htmlReport true
xmlReport true
lintConfig file("lint.xml")
}
}
Lint baseline — 現在の警告を許容可能としてマークするファイル。lint --baseline baseline.xmlコマンドで作成します。プロジェクトにbaselineを追加すると、Lintは新しい問題のみを報告します。これは数百の警告がある古いプロジェクトにLintを導入するのに便利です — チームは徐々にエラーを修正します。
lint.xml — Lintルールをカスタマイズするためのプロジェクトルートの設定ファイル。無視するルール、重大度レベル、特定のファイルやディレクトリの例外を指定します。ファイルは手動で作成され、プロジェクトのすべてのモジュールにグローバルに適用されます。lint.xmlがない場合、すべてのルールはデフォルト設定で動作します。
<?xml version="1.0" encoding="UTF-8"?>
<lint>
<!-- 未使用リソースのチェックを無効にする -->
<issue id="UnusedResources" severity="ignore" />
<!-- コンテキストリークの重大度を上げる -->
<issue id="StaticFieldLeak" severity="error" />
<!-- 生成ファイルでは無視する -->
<issue id="MissingTranslation" severity="ignore">
<ignore path="build/generated" />
</issue>
</lint>
@SuppressLint — Java/KotlinでメソッドまたはクラスレベルでLintを無効にするアノテーション。例:@SuppressLint("SetTextI18n")はTextViewに動的にテキストを設定するメソッドに使用します。@RequiresApiアノテーションはメソッドの最小APIレベルを指定します — minSdkが指定値を超える場合、Lintは警告を発行しません。
LintのCI統合はAndroid開発における標準的なプラクティスです。./gradlew lintコマンドですべてのモジュールの解析を実行し、レポートを生成します。CI/CD設定(Jenkins、GitLab CI、GitHub Actions)では、Lintは各プルリクエストで実行されます。エラーが見つかるとビルドは失敗し、開発者はLint HTMLレポートの通知を受け取ります。
lint-check:
script:
- ./gradlew lint
artifacts:
paths:
- app/build/reports/lint-results.html
when: always
Lint HTMLレポートには、カテゴリ、ルールID、ファイル、行、説明とともに見つかったすべての問題の表が含まれます。レポートはCIサーバーで利用可能か、ビルド成果物として公開されます。XMLレポート(lint-results.xml)はコード解析システム(SonarQube、CodeClimate)との統合や、トラッカー(Jira、YouTrack)での自動タスク作成に使用されます。
プルリクエストでのLint — MR/PR作成時にLintが自動的に実行されるようにGitHub ActionsまたはGitLab CIを設定します。Lintがエラーを見つけた場合、CIは失敗ステータスを返し、マージはブロックされます。これにより問題のあるコードがメインブランチに入るのを防ぎ、コードベースの品質を維持します。
LintカテゴリはAndroid開発のすべての側面をカバーしています。Googleはルールを12のカテゴリに分類しており、各カテゴリは特定の種類の問題を担当します。最も重要なカテゴリはCorrectness、Performance、Security、Accessibilityです。開発者はLintを効果的に使用するために、各カテゴリの主要なチェックを理解する必要があります。
| カテゴリ | 説明 | ルール例 |
|---|---|---|
| Correctness | アプリケーション機能に影響するエラー | MissingPermission, WrongConstant |
| Performance | パフォーマンスとメモリの問題 | UnusedResources, ViewHolder, DrawAllocation |
| Security | 脆弱性とセキュリティ違反 | ExportedContentProvider, WorldReadableFiles |
| Accessibility | ユーザー向けアクセシビリティ問題 | ContentDescription, TouchTargetSize |
| Usability | ユーザビリティとユーザー体験 | NotSibling, BackButton, HardcodedText |
| I18N | 国際化とローカライゼーション | MissingTranslation, ExtraTranslation |
パフォーマンスルールは実際に最も役立ちます。UnusedResourcesはXMLで宣言されているがコードで使用されていないリソースを検出します。ViewHolderはRecyclerViewアダプターでViewHolderパターンが使用されているかをチェックします。DrawAllocationはonDrawメソッドでのオブジェクト作成について警告します。これらの問題を修正するとAPKサイズが減少し、アプリケーションが高速化します。
セキュリティルールは公開アプリケーションに必須です。ExportedContentProviderはContentProviderが保護なしでエクスポートされているかをチェックします。WorldReadableFilesはすべてのアプリケーションがアクセス可能なファイルの作成について警告します。AllowBackupはマニフェストのallowBackupフラグをチェックします — データセキュリティのために無効にすることを推奨します。
よくある質問
コンパイラは構文と型をチェックし、コードを実行用のバイトコードに変換します。Lintはコンパイルなしでコードを解析し、コンパイラが見逃す論理的問題を検出します:未使用の変数、リソースリーク、ローカライゼーション問題、パフォーマンス違反、minSdkVersionとのAPI非互換性。Lintはコンパイラを補完しますが、置き換えるものではありません。
XMLファイルでは、ルールIDとともにtools:ignore属性を使用します:tools:ignore="UnusedResources"。Java/Kotlinでは、メソッドまたはクラスに@SuppressLintアノテーションを追加します:@SuppressLint("SetTextI18n")。ディレクトリ全体の場合は、issueノードとseverity="ignore"を指定してlint.xmlを設定します。プロジェクト全体の場合は、モジュールルートでlint.xmlを設定します。
Lint baselineは現在のLint警告を許容可能としてマークするXMLファイルです。./gradlew lint -Pbaselineコマンドまたはbuild.gradleのlintOptions.baselineFileで作成します。baselineを追加すると、Lintは新しい問題のみを報告します。これはレガシーコードのあるプロジェクトにLintを導入するのに便利です — チームは反復的にエラーを修正します。
com.android.tools.lintライブラリからlint-apiおよびlint-checksへの依存関係を持つ新しいJava/Kotlinモジュールを作成します。問題を検出するためのDetectorクラスと、問題を説明するためのIssueクラスを実装します。モジュールをJARにビルドし、AndroidプロジェクトのlintLibsフォルダに配置します。Android Studioが自動的にカスタムルールを認識します。
Lintはコンパイラが見えない問題を検出します:コンテキストリーク(Activity、Fragment)、minSdkVersionとのAPI非互換性、Gradle設定問題、大きすぎるPNGアイコン、異なる言語や画面設定向けの代替リソースの欠如。Google Playは公開前にLintを推奨しています。Lintがないと、アプリは古いデバイスでクラッシュする可能性があります。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。