2016-07-29 32 views
0

Ich verwende Kofax in unserem Projekt, und es verwendet eine Menge von Reflection und Robogiuice. Wir benutzen Dexguard, um unseren Code zu verschleiern. Eines der Probleme, die wir haben, ist, dass der private Konstruktor entfernt wurde. Ich habe bereits in meinem Code:pro Wache halten privaten Konstruktor

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

Aber es hilft nicht, einige meiner Klasse Konstrukteure noch gestrippt.

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)

Weiß jemand, wie man das repariert?

BEARBEITEN.

Ich habe gerade herausgefunden, dass nur Konstruktor der private static class entfernt werden, andere Konstruktoren der Klasse immer noch da.

Wer weiß warum?

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

Antwort

0

Eine der Lösungen könnten @Keep Anmerkung vor solchen Konstruktor
Zum Beispiel hinzuzufügen sein nicht-privater Konstruktor ohne Argumente.

So möchte ich hinzufügen, Regeln wie folgt aus:

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

ich beide hinzugefügt, die com.google.inject Inject Annotation sowie derjenige von javax.inject, da ich nicht sicher war, was man von Kofax bezeichnet wird. Sie können den nicht benötigten entfernen.

+0

Danke. Wie auch immer, der Code, der entfernt wurde, befindet sich in einer Bibliothek, daher kann ich die @ keep-Annotation nicht hinzufügen. – Kent

+0

@Keep hält nicht nur die Methode, sondern die ganze Klasse. –

+0

[Die Dokumentation] (https://developer.android.com/reference/android/support/annotation/Keep.html) gibt an, dass '@ Keep' auch auf Methoden anwendbar ist. Natürlich, wenn Sie eine Methode aus der Klasse behalten, muss sie die Referenz auf die ganze Klasse beibehalten, das ist offensichtlich. –

0

Die Fehlermeldung besagt, dass Sie Muss haben entweder einen Konstruktor, der mit @Inject oder eine kommentierte wird:

+0

Danke T. Neidhart. Aber wenn ich das Snippet hinzufüge, das Sie vorgeschlagen haben, habe ich diesen Fehler erhalten: '> Kann gemeinsame Superklasse von [org/apache/log4j/Kettensäge/LoadXMLAction] nicht finden (mit 1 bekannten super Klassen) und [java/lang/NoClassDefFoundError] (mit 5 bekannten Super-Klassen) ' – Kent

+0

Dieser Fehler hat nichts mit der Konfiguration von oben zu tun. Das Problem mit der log4j-Klasse ist bekannt und passiert auf Android, da swing nicht verfügbar ist, siehe die Antwort von Eric hier: http://stackoverflow.com/questions/16667022/proguard-cant-find-any-super-classes –

+0

Danke Es war eine andere Einstellung. Aber die vorgeschlagene Einstellung funktioniert auch nicht. Ich habe die Zuordnung und nicht verwendete Klassen überprüft. Eine Sache ist sehr seltsam, in der Ausgabe-Map kann ich sehen, dass der Konstruktor dort ist, aber wenn ich die Apk dekompilieren, war es nicht dort '' 'com.kofax.mobile.sdk.capture.MainModule $ ReflectionMakeSize - > com.kofax.mobile.sdk.capture.MainModule $ ReflectionMakeSize: 215: 215: void () -> 221: 228: android.hardware.Camera $ Größe makeSize (android.graphics.Point) -> makeSize '' ' – Kent