こんにちは、Sleipnir Mobile for Android 開発担当の西田です。
Sleipnir Mobile for Android の開発を始めて数ヶ月、様々な罠にハマってきました。
今日はその中から、Proguard でハマった事例を紹介します。
Proguard とは Java クラスファイルを難読化・最適化するツールです。未使用のコードを削除し、残りのコード中のクラス名、フィールド名、メソッド名を意味のない短い文字列に変換します。Android SDK に含まれているので、Android 界隈では一般的に使われているツールです。
さて、この Proguard がどのような罠となるのか・・・
ここで WebView の登場です。 WebView は Android で Web ページを表示するためのクラスです。WebView には JavaScript にインターフェースを追加するメソッド(addJavascriptInterface)が備わっており、簡単に JavaScript から Java のメソッドを呼び出せるようになっています。
が、ここに罠があります。Proguard によりメソッド名が変化するので、JavaScript からメソッドを呼びだそうとしても存在しないメソッドを呼びだそうとしてしまいます。ガーン!しかも普段の開発では Proguard に通すことはめったにないため非常に気づきにくく、リリースするまで気づきませんでした・・・(泣)
しかし気づいてしまえば解決方法は簡単です。addJavascriptInterface で登録するクラスを proguard.cfg で除外対象に指定してやるだけです。例えば com.hoge.HogeHoge クラスを除外するには次のように記述します:
-keep class com.hoge.HogeHoge {
*;
}
これでちゃんと動作するようになりました。
以上、 Proguard でハマった事例でした。これからも罠に負けず開発頑張って行きます。
それでは良い Android ライフを!