androidでSearchView使おうと思ったらgetActionViewがnullを返してくる。releaseビルドのときだけ。

RuuMusicの検索を開始出来ないという致命的なバグを修正しました。あとでAPKを公開します。 このバグなのですが、debugビルドだと再現せず、releaseビルドでだけ再現するというとてつもなく厄介なものでした。情報もあんまり無いので解決策を記録。

以下はRuuMusicのソースの抜粋です。

searchView = (SearchView)MenuItemCompat.getActionView(menu.findItem(R.id.menu_search));
if (searchView != null) {
    searchView.setOnQueryTextListener(playlist);
    searchView.setOnCloseListener(playlist);
}

とくに面白みのない普通のコードだと思います。nullチェックは消しても良い気がする。 で、MenuItemCompat.getActionViewってやつがnullを返してくるのです。releaseビルドのときだけで、debugビルドだと正しく動作します。

問題はどうやらソースコードでもxmlでもなくて、ProGuardっていうのが悪さしているようでした。 proguard-rules.proってファイルを開いて以下の一行を追記します。

.keep class android.support.v7.widget.SearchView { *; }

あとは普通にビルドすれば多分大丈夫。

ProGuardというのはandroid標準搭載な難読化ツールらしいです。余計なクラスだと思い込んで消しちゃった、ということみたい。


参考: