2013年2月5日火曜日

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

proguard の話です。

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

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

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

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

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


1 件のコメント:

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

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

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

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

    返信削除