UnityでProGuardを有効にしたとき、一部機能が動かなくなる

Unityでゲームをリリースするとき、最近は「ProGuard」を利用するようにしています。

ProGuardの目的

UnityでProGuardを利用する目的は主に2つありまして
・プログラムの難読化
・不要なプログラムコードの削除
の2つの目的があると認識しています。

一番の目的は難読化で、例えば

private void function(string strFunc){
    gui.text = strFunc;
}

みたいなプログラムを

private void a(string b){c.text=b;}

のようにして、人間から見ると非常に読みにくいプログラムを生成してリバースエンジニアリングなどからプログラムを守ることができます。

ProGuardの利用

Unityの画面から設定するだけです。おそらく以下の設定ですが、明示的に「ProGuardを利用する」という設定が無くなっていました・・・

ProGuard利用時の不具合

現在作成中の「CutPuzzle」にてサードパーティ製のライブラリ「Unity Web View」を利用しましたが、ProGuardを有効にすると、このモジュールが動作しないことがわかりました。

調査の方法はAndroid SDKに付属している「Android Debug Bridge(adb)」を利用して、実行中のゲームのログを解析することで調査しました。

adbを利用するには、PCをAndroid端末をUSBケーブルでつなぎ、コマンドプロンプトから以下のコマンドを実行します。

adb logcat

接続に成功すれば、大量のログが画面に表示されるため、ある程度のログが表示されたら Ctrl + C でログ出力を止めて、調査していきます。

上記は不具合が発生したログとなります。「unitywebviewが見つからない」というエラーが出ており、ProGuardによる難読化の結果、クラス名が変わってしまい参照できなくなってしまったと思われます。

回避方法

簡単な回避方法は「ProGuardを利用しない」ということになりますが、なかなかそうはいかないケースもあると思います。

今回はProGuardのカスタム設定を追加することで回避できました。

Custom Proguard File にチェックを入れることで、表示されているパスに「proguard-user.txt」が作成されるため、以下の設定を追加します。

-keep class net.gree.unitywebview.** {
    *;
}

keepは「名称の変更も、削除も行わない」ための設定を行うためのものです。
上記を設定を入れることで、無事にプログラムが動作するようになりました。

以上です

ProGuardは便利ですが、全く知識のないまま利用するとビルド後に問題にぶち当たってしまいますね。
自分自身もProGuardについては全くと言っていいほど調査をしていないので、一度マニュアルには目を通しておかねばと思います。