Android では、アプリのサイズをできるだけ減らしたりするために、リリース前にアプリ全体のコードの最適化 (いわゆるツリーシェイキング) が推奨されている。動作としては、実行されるコードを解析で割り出しで、不要なコードを全て削除、というものになる。
基本的には minifyEnabled true を build.gradle に書けばよくて、簡単なアプリケーションなら、マニフェストから起動される Activity を解析してそこから呼ばれるクラスやメソッドは削除されないようになるので、これだけですむ。
が、リフレクションや JNI、または capacitor のように JavaScript のエンジンを一度経由して呼ばれるクラスなどは、この解析パスで到達できない。結果として、性質上、実行時にエラーが起こることになる。
capacitor で keep すべきもの
capacitor の場合、JavaScript 経由で呼ばれるものには全て keep しておく必要がある。
- com.getcapacitor.plugin.* のうち、利用しているもの。
- 名前も含めて keep しないとダメ。JS 側から見える名前はリフレクションで取得されるため
- その他、利用しているプラグイン以下のクラス
例
-keep public class com.getcapacitor.plugin.App { static *; public *; } -keep public class com.getcapacitor.plugin.Device { static *; public *; } -keep public class com.getcapacitor.plugin.Filesystem { static *; public *; } -keep public class org.apache.cordova.CordovaPlugin -keep public class fr.drangies.cordova.serial.** -keepclasseswithmembers class com.hoho.android.usbserial.driver.** { static *; public *; } -printconfiguration /tmp/full-r8-config.txt -printusage /tmp/usage.txt
`-keep public class com.getcapacitor.plugin.Filesystem` だけだと名前が変わってしまう。ProGuard の指定方法がややこしつてよくわからなかったが、上記のようにしたらうまくいった。
cordovarduino という Cordova のプラグインを利用しているので、それ系の設定もある。
`-printusage` で指定したファイルには「削除された」クラスやメソッド名が出力される。必要なメソッドが意図せず削除されているかも?と思ったらこのファイルを見てみる。