2016-04-01 3 views
2

私は現在、たくさんのリフレクションを使用する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$*$* { *; } 

しかし、これは明らかに縮小処理中に削除されなかったメソッドを難読化することを避けるだけです... 縮小中にメソッドを削除しないようにする必要があります

+0

[ProGuardのを使用する際に保つためにどのように/特定のパッケージパスを除外?]の可能な重複(http://stackoverflow.com/questions/4830474/how-to-keep-exclude-a-particular-package -path-use-proguard) – Elltz

+0

これは重複していません。私は具体的には、他の答えが解決しない縮退を無効にする方法を探しています(そして他の答えが本当に答える難読化)。 – neteinstein

+0

なぜグローバル-dontshrinkがひどいのですか? **あなたのアプリを縮小する必要がありますか**。それは現在あなたを引き起こしている痛みの価値が縮小していますか? –

答えて

2

documentation-keepによると、「[インクルード]クラスも同様に保存されている場合は、」-keepclassmembersにのみ動作しますが、縮小した場合でも動作するはずです。

+0

実際にあなたは正しいです。私は何か別のことをやっていた。 – neteinstein

0
-keep class com.library.** { *; } 
+0

これは、縮小して使用されていないメソッドを削除するため、機能しません。したがって、使用されているものだけがわかります。コンパイル時に反射を検出しません。 – neteinstein

+0

true、あなたの質問には、反射の使用法の特異性は言及されていませんでした。しかし、確かにあなたは正しいです。 – gaara87

+0

答えを助けるための情報が追加されました。 – neteinstein

0

同様の問題と将来の人々のために、私は本当に何が起こっているか説明します:

  1. -keep class my.app.packageが本当に作らF43nd1rの答え@(メソッド縮小することによって除去され、難読化することを避けました。私は、実際にドキュメントが縮んでいることを避けていることを指摘しているので、問題は他の場所にあったと認識しています)

  2. libのコードを逆コンパイルして読んだ後、別のクラス(そのlibからではない)とメソッド名tの文字列それは反射のために使われた帽子。それが問題でした、私はまた、そのクラスを難読化するのを避ける必要がありました。

関連する問題