capacitor で Android 向けに minifyEnabled true
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` で指定したファイルには「削除された」クラスやメソッド名が出力される。必要なメソッドが意図せず削除されているかも?と思ったらこのファイルを見てみる。
関連エントリー
- 3秒でわかる Capacitor と Cordova の違い 実行コンテキストの違い Cordova は file: で実行される。Capacitor は http: (Android) で実行される。...
- Spring MVC で @Async と @RequestScope を共存させるには? @Async と @RequestScope を同時につかうとどうなるか @RequestScope、これは @Scope(value = ...
- h2o の status/json を mackerel に送る mackerel にメトリクスとして送る mackerel-plugin-h2o みたいなのは今のところないっぽい? ので、status/j...
- mackerel-agent + snmpで RTX1200 のメトリクス取得 検索すると Lua スクリプトを RTX にいれる方法もあるみたいだが、別途プロキシが必要みたいなので LAN 内の raspberrypi...
- Android O から広色域ディスプレイがサポートされる デベロッパープレビューのそのようなことが書いてあった。 Wide-gamut color for apps: Android develop...