7
10

More than 5 years have passed since last update.

Android Lintと修正方法

Last updated at Posted at 2019-04-30

はじめに

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...
スクリーンショット 2019-04-30 14.07.16.png
すると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
スクリーンショット 2019-04-30 14.27.59.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上で簡単に消すことができます。
(依存関係のチェックはしているようでした)
スクリーンショット 2019-04-30 15.40.23.png

必要のない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の対象外とするファイルを指定できました。ディレクトリごと指定もできます。

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

最後に

この作業で1日溶かしました。
Android Studioの優秀な機能がなかったらもっと時間かかってたと思います...
これが出た時は少し感動しました。
スクリーンショット 2019-04-30 21.19.58.png
Lintルールを独自で作成できたり、ktlintというKotlin用のLinterもあるので、もう少し深くLintを理解して実践していこうと思います。
そしてこれからはこまめにLintして修正します。(たぶん)

7
10
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
10