Android r22 + ant で java.lang.VerifyError からの java.nio.BufferOverflowException

java.lang.VerifyErrorが出ました

気がついたらJenkins管理下のAndroidプロジェクトのビルドが全滅してました。
antでビルドしてるところで

java.lang.VerifyError

なるものが吐かれていました。
javadocを覗いてみると

クラスファイルが適切な形式でも、ある種の内部矛盾またはセキュリティ上の問題があることを「ベリファイア (verifier)」が検出した場合にスローされます

という割とよくわからない解説がなされており、
android開発してるとjava.lang.VerifyError起きるよね - 明日の鍵
とか
r22 tools cause java.lang.VerifyError when building from ant script
とかを参考にしつついろいろやるけど解決せず。

そういや最近AndroidSDKをr22にアップデートしたなと思って
http://developer.android.com/tools/sdk/tools-notes.html
ここからr22の変更点を見てみると

Changed the structure of the SDK by adding a new build tool SDK Component, which is based on the existing platform-tools component. This change decouples the build tools versions from the IDE versions, allowing updates to the tools without requiring an IDE update.

とありました。
なんだかよくわかりませんが、なんかbuild toolってのが増えたらしい?
というわけでSDKManagerを開いてみると、たしかにAndroid SDK Build-toolsっていうのが増えていたのでインストールしました。

VerifyErrorはきえました

java.nio.BufferOverflowExceptionになりました。
依然ビルドが通りません。んなばかな!

ダメもとでissuesを調べてみると
java.nio.BufferOverflowException When Building with 19 Build Tools
にあっちゃいました。

Please use SDK Manager to get different versions of the build tools.

だそうです。
ちょっとなに言ってるのかよくわかりませんでしたが、
とりあえずSDKManagerからBuild-toolsのr19を削除してr18を残すようにしたら
めでたくビルドが通りました。

まとめ

  1. AndroidSDK r22はBuild-toolsも入れなきゃだめ
  2. Build-tools r19はなんかバグってるらしいから、今はまだr18で行くのがいいらしい
  3. AndroidSDKを無闇にアップデートしてはいけない