2013年2月5日火曜日

-keep でもコードから呼ばれてないメソッドは削除されるっぽい

proguard の話です。

Hoge というクラスのインスタンスを完全修飾名(文字列)から ClassLoader を使って動的に生成しているのですが、 -keep class com.example.android.Hoge だけだと getConstructor() を呼んだときに NoSuchMethodException が起こってしまいます。

getConstructor() で取得しようとしているコンストラクタは引数ありで、コードからは呼ばれていません。

そのためなのか、どうも proguard が削除してしまっているよう。

そこで -keep class com.example.android.Hoge { public <init>(com.example.android.Fuga); } のようにすれば削除されなくなります。

ちなみに、com.example.android 内の全てのクラスに適用したい場合は -keep class com.example.android.* でいいですが、サブパッケージ内のクラスにも適用したい場合は -keep class com.example.android.** にします。


1 件のコメント:

  1. -keep class com.example.android.Hoge

    だと「クラス名」しか keep 対象になりません。全クラスメンバも keep 対象にするなら、例えば

    -keep class com.example.android.Hoge { *; }

    のように書く必要があります。ProGuard の -keep オプションはわかりにくいですね。。。

    返信削除