Android Lintの解析内容の詳細
Android Lintについては、前のエントリをご参照ください。このエントリでは、以下のlintコマンド
で表示される lint の解析内容をカテゴリごとに整理し、指摘事項の詳細をまとめました。。
$ lint --show
以下の詳細を見る前にいくつかポイントを整理しておきます。
- 優先度(Priority)は数字が大きい(10が最大)ものが高いことを意味します。
- 重要性(severity)は変更可能。全プロジェクトのみではなく、各プロジェクトごとにも設定可能。変更は、eclipse > preference > Android > Lint Error Checking で実施。
- セーブ時に一部チェックの自動適用の可否を設定可能
- アプリパッケージ作成時のフルチェックの可否を設定可可能
- 指摘項目は適時更新されて追加しているため、掲載不足のものもあります。それらは、
lint --showコマンド
か preference の Lint Error Checking で詳細をご覧ください。 - エラーが発生すると apk 作成を中止するため、重要性(severity)を警告からエラーにする場合は熟慮することをお薦めします。
Lintの解析項目一覧
カテゴリ Category |
ID | 概要 Name |
優先度 Priority |
重要性 Severity |
詳細 Detail |
---|---|---|---|---|---|
正確性 | AdapterViewChildren | XML内の子Viewとして定義されていない AdapterView かどうかを調査 | 10/10 | 警告 | ListViewのようなAdapterViewは、ListAdapterのようなもので、Javaコードからデータを設定しなければなりません。より詳細は、http://developer.android.com/reference/android/widget/AdapterView.htmlを参照ください。 |
正確性 | MissingPrefix | Androidネームスペースで利用されていないXML属性を発見 | 8/10 | 警告 | Android viewたちのほとんどは、Androidネームスペースの属性をもっています。これらの属性を参照する場合は、必ずネームスペースの接頭語をつけるべきです。さもないとカスタム属性として aapt に解釈されます。 |
正確性 | MissingTranslation | 全文字列が翻訳済みかどうかの完全性を調査 | 8/10 | エラー | もしアプリが1言語よりも多い言語をサポートする場合、1言語の全文字列が他の言語にも翻訳されているべきです。標準では、この検出は 言語の地域たちに提供されます。ちょど文字列のサブセットとして提供されたり、標準の言語文字列の代替になります。すべての地域に対して、完全な翻訳を提供するために ANDROID_LINT_COMPLETE_REGIONSという環境変数をセットすることによって、強制できます。 |
正確性 | Proguard | proguard.cfg ファイルの問題を調査 | 8/10 | エラー | proguard.cfg ファイルで -keepclasseswithmembernames を利用することは、正しくありません。なぜなら、ADTの新しいバージョンで作成される proguard.cfg ファイルは異なるフォーマットになるためです。 -keepclasseswithmembernames の代わりにkeepclasseswithmembers を利用してください。なぜなら過去のフラグもまた、XMLからでJava(CustomViewsのようなもの)でなく参照されるシンボルのみの"allow shrinking"を示しているためです。 より詳細情報は、http://code.google.com/p/android/issues/detail?id=16384 を見てください。 |
正確性 | ScrollViewCount | ScrollViewが正しく子ウィジェットが保持しているかを調査 | 8/10 | 警告 | Scrollviewは1つの子ウィジェットのみを保持できます。もし2つ以上の子を持ちたければ、コンテナレイアウトにまとめて保持させましょう。 |
正確性 | DuplicateIds | シングルレイアウトの中で同じIDが存在するかどうかの調査 | 7/10 | 警告 | レイアウトの中で、IDは一意であるべきです。さもないと findViewById() が予期せぬviewを返します。 |
正確性 | InconsistentArrays | 配列の要素数に矛盾がないかどうかを調査 | 7/10 | 警告 | 配列が他の地域向けに翻訳されるときに、一般的にはオリジナルな配列と同様の要素数にすべきです。配列を追加や削除したときに、すべての地域の更新を簡単に忘れてしまいます。そんため、lint の警告はこれらの矛盾を検出します。
注意:しなしながら本当にそれぞれの設定において(例えば、存在するオプションに相当する配列やそれらのオプションが異なるレイアウトの向きやそれ上の違いがある場合)配列アイテムの要素数が異なるものを利用したい理由がある場合は、自らの判断でエラーかどうかを判断して利用してください。 |
正確性 | NestedScrolling | スクロールするウィジェットが何かのスクロールするウィジェットの中に入っているかかどうかを調査 | 7/10 | 警告 | ScrollViewのようなスクロールするViewは、重要なユーザビリティ問題のため、何かのネストされたスクロールウィジェットを中に含めるべきではありません。 |
正確性 | ScrollViewSize | ScrollViewがスクロール範囲の中で WRAP_CONTENT を利用しているかどうかをチェック | 7/10 | 警告 | ScrollView の子たちは、layout_width か layout_height 属性に wrap_content よりもむしろ fill_parent か match_parent をスクロール領域の中で指定すべきです。 |
正確性 | DuplicateIncludedIds | include tag を利用して結合したレイアウトにわたって同じIDが利用されているかどうかをチェック | 6/10 | 警告 | 同じIDを2つの独立したレイアウトに利用することは良いことです。しかしながら、もしレイアウトを include tag して結合した場合、IDはincludeされたレイアウトの連鎖の中で一意な必要性がある、もしくはActivity#findViewById()は期待しないViewを返します。 |
正確性 | ExtraTranslation | 利用されていない(標準言語向け文字列で存在しない)ように見える翻訳をチェック | 6/10 | 警告 | もし、ある文字列が特定の言語向けの翻訳ファイルで現れた場合で、標準の地域(locale)に同じ文字列が存在しない場合があれば、たぶんこの文字列は利用されていないだろう。(あなたのアプリが特別な地域(locale)のみで動作するように意図したものであれば、技術的にこの可能性がありますが、しかし代替を準備するよりはまだまだ良案です。) |
正確性 | ManifestOrder | <application>タグの後ろに<uses-sdk>が存在するようなマニフェストの問題を調査 | 5/10 | 警告 | <application>タグは、必要なversion情報やfeatureやlibrariesなどの宣言タグの後に現れるべきです。 <application>タグがいくつかの他のタグより前に現れたときは過去に複雑なバグが存在しました。 そのためロジカルな依存順序でマニフェストに並べるのがベストです。 |
正確性 | StateListReachable | <selector>の中で到達できない状態(state)を調査 | 5/10 | 警告 | selectorの中で、state list の最後の子のみが state修飾詞を除外すべきです。もしそうでなければ、リストのすべての次にくる項目は与えられた項目がすべてマッチするために無視されるでしょう。 |
正確性 | GridLayout | 行と列が外部で宣言されているような場合のGridLayoutの潜在的なエラーを調査。 | 4/10 | エラー | GridLayoutのrowCountかcolumnCountのサイズの宣言が外部のlayout_rowやlayout_columnで定義されている場合、たいてい故意ではないエラーになります。 |
正確性 | PxUsage | "px"単位の利用を調査 | 2/10 | 警告 | パフォーマンスの理由とコードをシンプルに保つために、Androidシステムは指定された範囲のスタンダードなユニットや指定された値のためにピクセルを利用します。 この意味はviewの範囲はいつもピクセルを利用してコード上から設定されますが、しかしいつも現在のスクリーン density をベースに設定されます。例えば、もし、myView().getWidth() が10を返すとき、viewは現在の画面の10ピクセルの横の長さがありますが、しかしdensityの高い画面の端末の場合、15を返す可能性があります。もしアプリの中で現在のスクリーンdensityに拡大されないビットマップとともにピクセルの値を利用していると、自らのコードでビットマップリソースを画面に合うようにスケールさせる必要があります。 |
セキュリティ | ExportedService | パーミッションを必要としない exported Service(<service>タグのandroid:exported="true"の場合)を調査 | 5/10 | 警告 | Exported services(exported=true か intent-filder を含んでいるか、exported=falseを明示していないか)はパーミッションを定義すべきです。これはサービスを起動するか、バインドするために必要です。これがない場合、アプリはこのサービスを利用できません。 |
パフォーマンス | UseCompoundDrawables | 現在のノードが 複合(compound) drawable を利用した TextView に置き換えられるかどうかを調査 | 6/10 | 警告 | ImageViewとTextViewを含んだLinearLayoutは、結合したdrawableとして扱われて、パフォーマンスが向上します。 |
パフォーマンス | MergeRootFrame | ルーツの<FrameLayout>が<merge>タグで置き換えられるかどうかを調査 | 4/10 | 警告 | <FrameLayout>がレイアウトのルートであり、背景やパディングが提供されていない場合、パフォーマンス向上のために<merge>タグに入れ替えできます。 |
パフォーマンス | InefficientWeight | LinearLayout内で無効な weight 指定を調査 | 3/10 | 警告 | LinearLayoutの中の1つのウィジェットしか weight を定義していないとき、残ったすべてのスペースを割り当てるために、0dpをwidth/heightに設定することによりパフォーマンス向上が見込める。Width/heightに 0dp が定義されている場合は、最初に自身のサイズは計算されません。 |
パフォーマンス | UnusedResources | 未使用リソースを調査 | 3/10 | 警告 | 利用していないリソースは、アプリを大きくし、ビルド時の速度が遅くしてしまいます。
制限事項: |
パフォーマンス | UselessLeaf | 削除可能な子要素かどうかを調査 | 2/10 | 警告 | 子も背景も持たないレイアウトは、よりフラットにしたり効果的なレイアウト階層にするために削除できます(invisibleなため)。 |
パフォーマンス | UselessParent | 削除可能な親要素かどうかを調査 | 2/10 | 警告 | 子を持たないレイアウトは、ルートレイアウトか scrollview ではありませんし、背景を持たず、削除可能であり、子たちを親に移動させたり、より効果的なレイアウト階層に変更することができます。 |
パフォーマンス | TooDeepLayout | レイアウト階層が深すぎるかどうかを調査 | 1/10 | 警告 | レイアウトのネストが深すぎる場合はパフォーマンスを低下させます。そのため(RelativeLayoutやGridLayoutのような)フラットなレイアウトの利用を検討してください。標準の最大の深さは10ですが、この設定は環境変数のANDROID_LINT_MAX_DEPTHで設定できます。 |
パフォーマンス | TooManyViews | viewの数が多すぎるかどうかを調査 | 1/10 | 警告 | 1つのレイアウトにたくさんのViewを使うことは、パフォーマンスを低下させます。統合したdrawableや他の仕組みを利用して、レイアウトのviewの数を減らすように検討してください。 |
パフォーマンス | UnusedIds | 未使用のIDを調査 | 1/10 | 警告 | 重要:この設定はデフォルトで無効です。有効にしたい場合は、–enable UnusedIds を してください。
リソースID定義は、どこからも参照されない場合は必要ありません。ID定義を行う場合は、たとえ利用しない場合であっても、レイアウトやメニュー上で簡単に動作するため、悪い考えであり必要ありません。そのため削除したほうがよいでしょう。 |
ユーザビリティ | TextFields | inputTypeやヒント設定の間違ったテキストフィールドを調査 | 5/10 | 警告 | テキストフィールドにinputType属性が提供されていることは、ユーザビリティの改善に有効です。なぜなら入力されるデータが独立していて、最適なキーボードをユーザに提供できるためです(電話番号のための数字のみや文字のみのように)。同様に、ヒント属性はユーザにテキストフィールドに何を期待するかを表示することができます。 |
ユーザビリティ:アイコン | IconNoDpi | nodpiフォルダとdpiフォルダの両方にアイコンが存在するかを調査 | 7/10 | 警告 | drawable-nodpiフォルダのビットマップは、Androidフレームワークによってスケールされません。もし同じ名前のdrawableリソースが drawable-hdpiのようなdpiフォルダと同様に-nodpiフォルダに存在する場合、あいまいであり、国際化できない振る舞いになります。 1つか他のものを削除して、他のアイコンを利用してください。 |
ユーザビリティ:アイコン | GifUsage | GIFファイル(非推奨)が利用されてる画像を調査 | 5/10 | 警告 | .gifファイルフォーマットは非推奨です。.pngか.jpgの利用を検討してください。 |
ユーザビリティ:アイコン | IconDipSize | densityごとのアイコンたちが概ね同じdensity-independentサイズかどうかを確認 | 5/10 | 警告 | 複数のdensityに提供されるすべてのアイコンがチェックされて、すべてが同じdensity非依存ピクセル(dpi)サイズであることを計算します。これは画像が異なるフォルダに入っていたり、アイコンがいくつかのフォルダが忘れられて新しいサイズに変更されるエラーを検出します。 |
ユーザビリティ:アイコン | IconDuplicatesConfig | 様々設定パラメータを通した同一のビットマップのアイコンを探索 | 5/10 | 警告 | もしアイコンがdrawable-hdpiか-v11のような異なる設定パラメータで提供された場合、それらは一般的に異なるものです。この検出は、同じアイコンが国際化ではなく異なる設定フォルダーに提供されている場合に動作します。 |
ユーザビリティ:アイコン | IconExpectedSize | ランチャーアイコン、ノーティフィケーションアイコンなどが正しいサイズかどうかを確認 | 5/10 | 警告 | ランチャーアイコンには事前に定義されたサイズがあります(それぞれのdensityごとに)。これらの規約に従う必要があり、アイコンをプラットフォームごとにフィットさせる必要があります。 より詳細は、http://developer.android.com/guide/practices/ui_guidelines/icon_design_launcher.html#size を参照してください。 |
ユーザビリティ:アイコン | IconLocation | densityごとのdrawableフォルダに画像が配置されていないことを確認 | 5/10 | 警告 | res/drawableフォルダは、XML内にshapeで定義されたような density非依存なグラフィックスのために定義されています。ビットマップの場合、drawable-mdpiに移動したり、より高い解像度や低い解像度のものをdrawable-ldpiやdrawable-hdpiやdrawable-xhdpiに振り分ける検討を行いますもし、アイコンが"本当に"density 非依存の場合(たとえば、solid color)、drawable-nodpi フォルダに入れられます。 |
ユーザビリティ:アイコン | IconDensities | すべてのサポートされるdensity に対してアイコンのカスタムバージョンを提供することを確認する | 4/10 | 警告 | アイコンは、主要な screen density class(low, medium, high, extra high)のそれぞれに対してカスタムバージョンを提供し、ベストな見栄えになります。このlintは、それぞれのアイコンたちが density の種別を完全にカバーしていないかどうかをチェックします。 Low density は、あまり多く利用されていないため、このチェックは無視されます。それを強制的に適用させたい場合は、環境変数の値に、ANDROID_LINT_INCLUDE_LDPI=true と設定してください。現在の density の利用方法の詳細は、http://developer.android.com/resources/dashboard/screens.html を参照ください。 さらなる詳細情報は、http://developer.android.com/guide/practices/screens_support.html を参照ください。 |
ユーザビリティ:アイコン | IconDuplicates | 他の名前でコピーされたアイコンを探索 | 3/10 | 警告 | もしアイコンが他の名前で再利用されている場合、統合して1つのみを利用するようにしたり、他を削除してアプリをより小さくできます。 しかしながら、複製されたアイコンは通常国際化されなかったり、ときどき上書きされたり、更新忘れが発生します。 |
ユーザビリティ:アイコン | IconMissingDensityFolder | すべてのdensity フォルダが準備さされていることを確認 | 3/10 | 警告 | アイコンは、主要な screen density class(low, medium, high, extra high)のそれぞれに対してカスタムバージョンを提供し、ベストな見栄えになります。このlintは、特定フォルダが drawable-hdpi のように間違っていたりすることをチェックします。 Low density は、あまり多く利用されていないため、このチェックは無視されます。それを強制的に適用させたい場合は、環境変数の値に、ANDROID_LINT_INCLUDE_LDPI=true と設定してください。現在の density の利用方法の詳細は、http://developer.android.com/resources/dashboard/screens.html を参照ください。 さらなる詳細情報は、http://developer.android.com/guide/practices/screens_support.html を参照ください。 |
アクセシビリティ | ContentDescription | イメージウィジェットがコンテンツの説明を提供しているかどうかを確認 | 3/10 | 警告 | ImageViewやImageButtonのようなテキストではないウィジェットは、画面でよめたり、他のアクセサビリティツールが十分にユーザインタフェースを保持できるようにウィジェットのテキスト説明文で特定できるように、contentDescription属性を利用すべきです。 |
国際化 | HardcodedText | リソースに定義すべき、ハードコードされた文字列属性を調査 | 5/10 | 警告 | レイアウトファイル内で直接ハードコードされたテキスト属性は、以下のいくつかの理由により駄目です。 -コンフィルレーションの種類が作られたとき(例えば、landscapeかportraitかのような)には、正確なテキストを繰り返し利用すべきです。(変更時に最新の状態をキープするため) -アプリは既存の文字列リソースを新しい言語に翻訳したいとときにすぐに、他の言語に翻訳できない。 |
Antoid Lint はまだまだ開発が並行して進んでいるため、上記のID以外にもこれからどんどん追加されていくと思います。このスピード感と様々なオープンテクノロジーの採用(Lintもそのうちの1つ)が Android 普及の鍵だと感じているので、もっと進んでいってもらいたいと個人的には思っています。
Android Lint 解析内容の詳細を調査 | Bescottee – http://andbrowser.com/develop...
Android Lint 解析内容の詳細を調査 | Bescottee http://t.co/e9s8tri4