2016-07-29 40 views
0

我在我們的項目中使用Kofax,它使用了很多Reflection和Robogiuice。我們使用Dexguard來混淆我們的代碼。我們遇到的一個問題是私有構造函數被剝奪了。我已經在我的代碼中有這個:職業警衛保持私人構造函數

-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)

任何人都知道如何解決這個問題?

編輯。

我剛剛發現,只有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'也適用於方法。當然,如果你從課堂上保留一種方法,它必須保持對整個班級的關注,這是顯而易見的。 –

0

該錯誤消息說,你必須要麼被註解爲@Inject或構造非私有構造函數沒有參數。

所以我想補充規則這樣的:

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

我加了兩個,在com.google.inject進樣標註,以及從javax.inject的一個,因爲我不知道哪一個是從的Kofax稱。您可以刪除不需要的。

+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