私は現在、たくさんのリフレクションを使用するAndroidライブラリを使用しています。Proguard:「未使用のメソッド」の削除(および難読化)を避けるために、パッケージ全体を縮小する(および難読化する)のを避けるにはどうしたらいいですか?
私がproguardを有効にしてすぐに実行すると、クラッシュします。
なぜですか?それは多くのリフレクションを使用し、メソッドはリフレクションを介してのみ呼び出されるため、プロガードは未使用として検出され、縮小プロセス中に削除されるため、NoSuchMethodError
がスローされます。
これはどうしてですか?それは、ProGuardのは、彼らが使用されていないあると考えるので、だから、コードの断片(すべてのメソッド)
は、はどのように私は縮小または難読化を避けるためにProGuardの設定ができることを取り除くよう彼らは縮小プロセス中に削除されを把握するのは簡単ですパッケージ全体? (ライブラリ)
注:-dontshrinkオプションは使いたくないので、特定のパッケージを避けたいだけです。
さらに詳しい情報:
ランタイムエラーは以下の通りです:
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.my.app.debug, PID: 3771
java.lang.NoSuchMethodError: observeValueForKeyPath [class java.lang.String, class java.lang.Object, class com.my.lib.util.Dictionary, class java.lang.Object]
at com.my.lib.util.Observable$ObservationManager$Observer.<init>(SourceFile:47)
at com.my.lib.util.Observable$ObservationManager$Observer.<init>(SourceFile:26)
at com.my.lib.util.Observable$ObservationManager.addObserver(SourceFile:159)
...
は、問題が一つの内側内部クラスであることに注意してください...
私の現在構成は次のようなものです:
-keep,includedescriptorclasses class com.my.** { *; }
-keepclassmembers class com.my.lib** { *; }
-keep,includedescriptorclasses class com.my.lib.util.Observable$* { *; }
-keep,includedescriptorclasses class com.my.lib.util.Observable$*$* { *; }
しかし、これは明らかに縮小処理中に削除されなかったメソッドを難読化することを避けるだけです... 縮小中にメソッドを削除しないようにする必要があります。
[ProGuardのを使用する際に保つためにどのように/特定のパッケージパスを除外?]の可能な重複(http://stackoverflow.com/questions/4830474/how-to-keep-exclude-a-particular-package -path-use-proguard) – Elltz
これは重複していません。私は具体的には、他の答えが解決しない縮退を無効にする方法を探しています(そして他の答えが本当に答える難読化)。 – neteinstein
なぜグローバル-dontshrinkがひどいのですか? **あなたのアプリを縮小する必要がありますか**。それは現在あなたを引き起こしている痛みの価値が縮小していますか? –