2016-07-29 10 views
0

私はこのプロジェクトでKofaxを使用しています。多くのReflectionとRobogiuiceを使用しています。 Dexguardを使用してコードを難読化しています。私たちが持つ問題の1つは、プライベートコンストラクタが削除されたことです。私はすでに私のコードでこれを持っています:プロガードプライベートコンストラクタを維持する

-keepclassmembers class * { 
    private <init>(...); 
} 

しかし、私のクラスのコンストラクタのいくつかは引き続き削除されています。

1) Could not find a suitable constructor in >com.kofax.mobile.sdk.capture.MainModule$ReflectionMakeSize. Classes must have >either one (and only one) constructor annotated with @Inject or a zero-argument >constructor that is not private. at >com.kofax.mobile.sdk.capture.MainModule$ReflectionMakeSize.class(Unknown >Source) at >com.kofax.mobile.sdk.capture.MainModule.configure(:145)

これを修正する方法は誰でも知っていますか?

EDIT。

私はちょうどprivate static classのコンストラクタだけが削除され、他のクラスのコンストラクタはまだそこにあることを知りました。

誰でも知っていますか?

答えて

0

解決策の一つは、例えば、このようなコンストラクタの前に
@Keep注釈を追加することがあります

@Keep 
private Adapter(FragmentActivity mActivity, List<RowModel> list) { 
    super(mActivity, list); 
} 
+0

ありがとうございました。しかし、取り除かれたコードはライブラリ内にあるので、 '@ keep'アノテーションを追加することはできません – Kent

+0

@Keepはメソッドを保持するだけでなく、クラス全体を保持します。 –

+0

[ドキュメンテーション](https://developer.android.com/reference/android/support/annotation/Keep.html)には、 '@ Keep'もメソッドに適用されることが記載されています。もちろん、クラスから1つのメソッドを保持する場合は、クラス全体にリフレクションを保持する必要がありますが、それは明らかです。 –

0

エラーメッセージは、@InjectまたはAでアノテートされたコンストラクタのどちらかを持っていなければならないことを言います引数のない非プライベートコンストラクタ。

だから私はそのようなルールを追加します。

-keepclassmembers class * { 
    !private <init>(); 
    @com.google.inject.Inject <init>(...); 
    @javax.inject.Inject <init>(...); 
} 

私はKofaxのから参照されているかわからなかったので、私は両方とも、com.google.inject注入する注釈などjavax.injectから1を追加しました。あなたは不要なものを取り除くことができます。

+0

ありがとうT. Neidhart。しかし、私はこのエラーを受け取りました: '' [org/apache/log4j/chainsaw/LoadXMLAction](1つの既知のスーパークラスを持つ)と[java/lang/NoClassDefFoundError]の共通のスーパークラスが見つかりませんでした。 (5つの既知のスーパークラスを持つ) ' – Kent

+0

このエラーは上の設定とは無関係です。 log4jクラスの問題は知られていて、Androidでスイングが利用できないために起こります。エリックの回答を参照してください:http://stackoverflow.com/questions/16667022/proguard-cant-find-any-super-classes –

+0

ありがとうそれはもう一つの設定でした。しかし、提案された設定はどちらも機能しません。 マッピングと未使用のクラスを確認しました。非常に奇妙なことに、出力マップにはコンストラクタがあることがわかりますが、私がapkを逆コンパイルすると、そこにはありませんでした。 '' 'com.kofax.mobile.sdk.capture.MainModule $ ReflectionMakeSize - > com.kofax.mobile.sdk.capture.MainModule $ ReflectionMakeSize: 215:215:void () - > 221:228:android.hardware.Camera $ Size makeSize(android.graphics.Point) - > makeSize '' '' – Kent

関連する問題