web-dev-qa-db-ja.com

Android proguard、内部クラスを保持

My Androidプログラムにはclass A、2つのstatic inner class。それらは.dexプロガードを適用した後。

public class A{

  ...
  static class B{
    ...
  }

  static class C{
    ...
  }
}

Proguard.flagsに次の行を追加しましたが、運が悪いようです。

-keep class com.xxx.A
-keep class com.xxx.A$*

ヒントはありますか?

50
David Guan

InnerClassesをkeep属性に追加してみてください。例えば:

-keepattributes Exceptions, InnerClasses, ...

また、次のように、アスタリスクを使用して "keep"呼び出しに本文を追加してみてください。

-keep class com.xxx.A$* {
    *;
}
57
Alexander Lucas

これは私の設定のためにやらなければならなかったことです

-keep class com.xxx.A { *; }
-keep class com.xxx.A$B { *; }
-keep class com.xxx.A$C { *; }
38
ajma

これは私のためにトリックをしました

-keepattributes InnerClasses
 -keep class com.yourpackage.YourClass**
 -keepclassmembers class com.yourpackage.YourClass** {
    *;
 }

ワイルドカードでは少しやり過ぎかもしれませんが、何も見逃さないようにしたかったのです。主なことは、クラスのkeepとクラスのkeepclassmembersにInnerClasses属性が必要なことです。

9
GameSalutes

一部のパッケージのすべての内部クラスとメンバーを難読化したくない場合は、proguard-rules.proに行を追加できます

    -keep class com.xxx.task.*$* {
        *;
    }
7
Mr235

設定は正しいようです。クラス名のスペルを間違えていないことを再確認する必要があります。スペルが間違っている場合、ProGuardはそれについてのメモを印刷する必要があります。 -printseeds seeds.txtを指定して、結果のファイルにクラスがリストされているかどうかを確認することもできます。リストされている場合、クラスも処理されたコードに含まれています。

Alexander Lucasが述べたように、これらのクラスのフィールドとメソッドを保持することもできます。これは要件によって異なります。

5
Eric Lafortune