FindbugsはLGPLでAndroidと相性が悪いので対策を調べてみた


結論

あんまり気にしなくていいけど、気になるなら互換ライブラリを使おう。

詳細

FindBugsは超定番のJavaの静的解析ツールです。うっかりミスや潜在バグを機械的に検出してくれる頼もしい存在。Pure JavaだけじゃなくAndroidにも適用できます。

この手のツールはデフォルトのルールだと実情と合わないことがあって、ルールをカスタマイズしたり局所的に警告を抑止したりするのが一般的。Findbugsでは局所的な警告抑止にannotationを採用しています。コンパイル後のclassファイルを解析するツールなのでコメントは解析できないからannotation、ということのようです。

ここまではOKなのですが、FindBugsはLGPLで提供されているという問題があります。annotationもLGPL。これは困った。ソースコード開示義務を負いかねないため、Android(というか非OSS開発)とLGPLは相性が悪いのです。

ライセンス周りは解釈に依るところが大きいので詳しくはご自身で調べていただくとして、Androidアプリ開発ではLGPLのライブラリを見送ることが多いんじゃないでしょうか。会社だとルールでNG、というところも多そう。

じゃあAndroidで局所的な警告を抑止したいときはどうすればいいの?ということで調べてみました。

選択肢は大きく2つあります。

選択肢1:気にしない

FindBugsのdependenciesをprovidedにすればapkには含まれないんだから問題ないという考え方。ソースコードには含まれるけど、最終成果物には含まれないんだから問題ないでしょ、という立場ですね。これは割と有力。

選択肢2:代替ライブラリを使う

この問題を回避するため、annotationの互換ライブラリをApache License, version 2.0で提供している方がいます。これを使わせてもらう案。

stephenc/findbugs-annotations: A clean-room implementation of the findbugs annotations released under the Apache License, version 2.0

サイトに

So, if you have some idiot lawyers who won’t let you use Findbugs' annotations.jar, then side-step them and use this one and keep the bugs out of your code.

とあるように、まさしくこの問題に対処するために作られたライブラリです。

Maven Centralには1.3.9-1までしかアップされてないのでFindbugsの3.0.1に合わせるためには自分でbuildしてjarを作らなきゃならないのがちょっと手間ですが、LGPLを使っていいかどうか悩むくらいならサクッとjarを作っちゃおう、という判断はアリだと思います。

最後に

言うまでもなく、LGPLを避けるためにFindbugsの採用を見送る、というのが一番の悪手です。自身や組織の実情に合わせて選択肢1 or 2をチョイスして、あとは心置きなくFindbugsの力を借りましょう。

参考情報




関連(するかもしれない)記事


おススメ