はじめに
AndroidでLintによるコードの改善は重要です。
公式のページにこのように書いていました。
機能要件を満たしていることを確認するために Android アプリをテストすることに加えて、コードに構造上の問題がないか確認することが重要です。コードの構造が適切でないと、Android アプリの信頼性と効率性に影響が生じて、コードの保守が困難になることがあります。たとえば、XML リソース ファイルに未使用の名前空間が含まれていると、スペースを必要とし、不要な処理が発生します。サポートを終了した要素またはターゲットの API バージョンでサポートされていない API 呼び出しなど、構造に関するその他の問題があると、コードが正しく実行されなくなることがあります。
しかしずっと開発のみをしていてめんどくさいのでLintを無視していました。
Lintしてみたところ、
Android 39 warnings
Kotlin 10 warnings 2 infos
Spelling 72typos
XML 1 warning
という保守性のかけらもない結果が出ました。一つ一つ直していきます。
にしても72箇所もタイポしているとはw
Lintを実行
Android Studioのバージョンは3.4です。
Lintの実行方法は複数ありますが、Android Studio上で実行するのが簡単だと思います。
実行方法はAnalyze > Inspect Code...
するとLintを行うスコープを選択する画面が出てくるので、選択しOKを押して実行できます。
XML 1 warning
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
...
</layout>
こんなxmlでappを使っておらずNamespace declaration is neverused
となっていたので、xmlns:app="http://schemas.android.com/apk/res-auto"
を消しました。
Spelling 72 typos
詳しくみたところ、アプリ名やライブラリの名称であるMoshiやSthethoといった語がtypoとなっていました。
Android Studio > Preferences... > Spelling > Accepted Words
ここに+ボタンを押してtypeの例外を追加しました。
(EntityをEntitiyと書き、ThumbnailをThumnailと書いていたのでそれは普通に修正しました。)
Kotlin 10 warnings 2 infos
Unused import directive
importしているが使っていないものがあるというwarningでした。
デバッグするためにログをしこんでデバッグし終わった後にimport android.util.Log
を
消し忘れているファイルが複数ありました。
Unused symbol
使っていないメソッドがあるというwarningでした。
削除もしくは将来使いそうなメソッドはコメントアウトして対応しました。
private化
Kotlin 2 infosはprivateにできるところはprivateにしようという内容でした。
具体的にはこのような内容でした↓
Property 'articleViewModel' could be private
Function 'reload' could be private
Android 39 warnings
ImageViewにcontentDescriptionがない
xmlでImageViewを使っている場合contentDescription
を指定していないと怒られます。
調べたところアクセシビリティ向上のためにcontentDescription
が必要っぽいです。
layoutの配置の指定方法
android:layout_marginLeft より android:layout_marginStartのほうがbetter
android:layout_alignParentRight より android:layout_alignParentEndのほうがbetter
android:layout_toRightOf より android:layout_toEndOfのほうがbetter
と怒られたので修正しました。
使っていないリソースの削除
Unused resources
というwarningがでました。
使っていないリソースを放置していたので消します。
このようにAndroid Studio上で簡単に消すことができます。
(依存関係のチェックはしているようでした)
必要のないRelativeLayout
This 'RelativeLayout' layout or its 'RelativeLayout' parent is useless; transfer the 'background' attribute to the other view
というwarningがでました。
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="@dimen/content_height"
android:background="@drawable/border_bottom">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="@dimen/article_height"
android:layout_margin="@dimen/article_margin">
必要のないRelativeLayoutがあったので、RelativeLayoutを一つにまとめるとwarningを解消できました。
Lintの対象外としたいファイルの指定
Lintの対象外としたいファイルがありました。
appフォルダにlint.xmlを作成し、GradleにlintOptionsを指定するとLintの対象外とするファイルを指定できました。ディレクトリごと指定もできます。
<?xml version="1.0" encoding="UTF-8"?>
<lint>
<issue id="all">
<ignore path="path1"/>
<ignore path="path2"/>
</issue>
</lint>
android {
lintOptions {
lintConfig file('lint.xml')
}
}
最後に
この作業で1日溶かしました。
Android Studioの優秀な機能がなかったらもっと時間かかってたと思います...
これが出た時は少し感動しました。
Lintルールを独自で作成できたり、ktlintというKotlin用のLinterもあるので、もう少し深くLintを理解して実践していこうと思います。
そしてこれからはこまめにLintして修正します。(たぶん)