Android Lintと修正方法

# はじめに
AndroidでLintによるコードの改善は重要です。
[公式のページ](https://developer.android.com/studio/write/lint?hl=ja#manuallyRunInspections)にこのように書いていました。

>機能要件を満たしていることを確認するために 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...`
<img width="333" alt="スクリーンショット 2019-04-30 14.07.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356260/67d064dd-0360-151b-9dd2-ca2514f89dda.png">
するとLintを行うスコープを選択する画面が出てくるので、選択しOKを押して実行できます。

# XML 1 warning
```xml
<?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`
<img width="1025" alt="スクリーンショット 2019-04-30 14.27.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356260/e841fed1-9884-4638-d7de-f73722d0fb49.png">
ここに+ボタンを押して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上で簡単に消すことができます。
(依存関係のチェックはしているようでした)
<img width="1440" alt="スクリーンショット 2019-04-30 15.40.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356260/8289cfb3-6017-4d57-6be8-c49af1c846f2.png">

## 必要のないRelativeLayout
`This 'RelativeLayout' layout or its 'RelativeLayout' parent is useless; transfer the 'background' attribute to the other view`
というwarningがでました。

```xml

    <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:lint.xml
<?xml version="1.0" encoding="UTF-8"?>
<lint>
    <issue id="all">
        <ignore path="path1"/>
        <ignore path="path2"/>
    </issue>
</lint>
```
```gradle:app/build.gradle
android {
    lintOptions {
        lintConfig file('lint.xml')
    }
}
```

# 最後に
この作業で1日溶かしました。
Android Studioの優秀な機能がなかったらもっと時間かかってたと思います...
これが出た時は少し感動しました。
<img width="570" alt="スクリーンショット 2019-04-30 21.19.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356260/5fb65ad6-327d-6919-6b25-768ff3298077.png">
Lintルールを独自で作成できたり、ktlintというKotlin用のLinterもあるので、もう少し深くLintを理解して実践していこうと思います。
そしてこれからはこまめにLintして修正します。(たぶん)