68

私のアンドロイドプログラムには があり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$*

ヒントはありますか?

4

6 に答える 6

70

InnerClassesキープ属性に追加してみてください。例えば:

-keepattributes Exceptions, InnerClasses, ...

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

-keep class com.xxx.A$* {
    *;
}
于 2012-12-27T19:26:56.160 に答える
10

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

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

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

于 2013-06-23T02:07:11.217 に答える
9

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

    -keep class com.xxx.task.*$* {
        *;
    }
于 2015-06-09T01:19:54.340 に答える
5

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

アレクサンダー・ルーカスが述べたように、これらのクラスのフィールドとメソッドを保持したい場合もありますが、それは要件によって異なります。

于 2012-12-29T10:35:24.370 に答える