[Android] ビルド時の警告を無視する方法

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

本当に無視してはいけません

Android 開発を行っていると出てくる様々な警告。ちゃんと解消していますか?
未使用の変数やメソッド、簡略化できる箇所など出てくる警告は様々です。
本来であればこうした警告はきちんと正攻法で解消すべきですが、どうしても解消できない場面というのは出てくるものです。(作りの問題であったりライブラリの制約であったり)

こうした時に「警告が出ているのは知っているけど、あえて無視していますよ」ということを明示的に書いておける方法をご紹介します。

ただし、多用は禁物です。
上で書いたように、前提として「警告は正攻法で解消する」ということを頭に入れておきましょう。

@SuppressWarnings と Tools 属性

ソースコード上の警告には @SuppressWarnings を、XML 上の警告には Tools 属性 を利用します。

@SuppressWarnings

@SuppressWarnings アノテーションは警告メッセージを抑制します。
このアノテーションが付与されたクラスやメソッドは、指定した警告に関するメッセージを表示しなくなります。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    private void useTheForce() {
        // 未使用のメソッド
    }
}

このクラスには useTheForce() というメソッドが存在していますが、どこからも参照されていません。
この場合、以下の様な警告が表示されます。

Private method 'useTheForce()' is never used

この時、Android Studio では未使用なメソッド名の文字色は薄くなり、画面右側には警告を表す黄色のハイライトが表示されます。
このままでは気持ち悪いですね。

これを解消するためには未使用メソッドに @SuppressWarnings アノテーションを付与します。

@SuppressWarnings("UnusedDeclaration")
private void useTheForce() {
    // 未使用のメソッド
}

こうするとメソッドの文字色も普通になり、先ほどの警告は表示されなくなります。

UnusedDeclaration は「未使用の定義」に関する警告を抑制するために @SuppressWarnings アノテーションに設定する文字列定数です。
その他の文字列定数は こちら に書かれているので、気になる方はチェックしてみてください。

@SuppressWarnings は便利なアノテーションですが、ひとつだけ厄介な動きをします。
それは「警告が解消されても、それを検知しない」というものです。

上記の例ですと、現在は未使用のメソッドがどこかのタイミングで使用されるようになった場合、@SuppressWarnings は何もしません。
警告は出ないままなのですが、アノテーションが不要になった ということも教えてくれません。
場合によってはどんどん不要なアノテーションが増えていき、開発者を惑わせる原因にもなり得るため、使用するときは注意しましょう。

Tools 属性

Tools 属性は XML に関する便利な機能を提供する属性です。
この中の一つの属性である tools:ignore を使用することで XML ファイル内の警告を無視することができます。

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <EditText
        android:layout_width="200dp"
        android:layout_height="30dp"
        android:inputType="text"
        />

</RelativeLayout>

この例では、EditText に関して以下の警告が表示されます。

No label views point to this text field with a labelFor attribute

これは android:labelFor という属性が無いという警告です。
Android のテキストフィールドは、大抵それが何の入力なのかを示すラベル(TextView など)が近くに存在するという考えらしく、その UI コンポーネントの ID をこの labelFor に指定するようです。

ですが、本当にそのようなラベルが存在しない場合は以下のように警告を無視します。

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <EditText
        android:layout_width="200dp"
        android:layout_height="30dp"
        android:inputType="text"
        tools:ignore="AndroidLintLabelFor"
        />

</RelativeLayout>

まずは tools 属性を使えるようにするために xmlns:tools に Namespace を設定します。
次に警告を無視したいコンポーネントにおいて tools:ignoreAndroidLintLabelFor をセットします。
これで上記の警告は消えます。
ある要素に設定するとその要素と全ての子要素に適用されるので、XML 内全てに適用したい場合はトップの要素に記述しましょう。

その他の文字列定数も先ほどと同様に こちら に書かれています。 また、 tools:ignore も @SuppressWarnings と同様に警告が解消されてもそれを教えてくれることはないので注意してください。

最後に

全ての警告は意味があるため表示されます。
まずは警告の内容を確認し、それを解消するためのアクションを起こしましょう。
その結果、どうしても解消することができない場合は今回紹介した方法で警告を抑制してみてください。

リンク

ミレニアム・ファルコン製作日記 #30

30 号 表紙

mfd_30_1

パーツ

mfd_30_2

mfd_30_3

mfd_30_4

成果

mfd_30_5

今回の作業は以下の 2 つでした。

  • 船体下部フレームを組み立てる
  • 組立ジグを拡張する

これまでに組み立てた骨組みに 3 つの外殻フレームと半径方向肋材を加えました。
これで船体下部フレームの 3 分の 2 が完成です。
このフレームの上にどうやって他のパーツを乗せるのでしょうか?
今から楽しみです。

組立ジグは今回で 8 分の 7 ができあがりました。
次号の提供パーツで完成となります。

ローグ・ワン

来ました!
『ローグ・ワン/スター・ウォーズ・ストーリー』の特別映像!!

かつてこれほどまでにダークな感じのスター・ウォーズがあったでしょうか?
だが、こんなスター・ウォーズもイイ!!
映像の最後には あの人 の姿も。
公開は今年の 12 月 16 日、金曜日。
楽しみに待ちましょう。

ミレニアム・ファルコンは出てくるのかな?

それではまた次回。

May the Force be with you!