2015-05-06 8 views
13

Ich habe ein Projekt mit gradle in meiner App enthalten:Proguard Entfernen Anmerkungen in Android-Anwendung

compile group: 'org.bytedeco', name: 'javacv', version: '0.11' 

Welche feinen baut. Aber wenn ich die app mit progard aktiviere, wird anscheinend die @Platform Annotation aus den Gläsern entfernt, die dann enthalten sind.

Ich habe versucht, die basierend auf http://proguard.sourceforge.net/manual/examples.html#annotations

-keepattributes *Annotation* 

-keep @org.bytedeco.javacpp.annotation interface * { 
    *; 
} 

auf http://proguard.sourceforge.net/manual/troubleshooting.html#notkept

-keep @interface * 

Aber das funktioniert nicht, entweder habe ich versucht, auch die folgenden anhand folgenden verwenden. Was kann ich sonst noch tun, um zu verhindern, dass Proguard diese Anmerkungen löscht? Ich habe darüber nachgedacht, -injars oder -libraryjars zu verwenden, aber ich glaube, dass Gradle das für Sie behandelt.


Die Lösung:

So ist die Lösung wie folgt:

ich folgend in meinen proguard Regeln aufgenommen haben:

# JavaCV 
-keep @org.bytedeco.javacpp.annotation interface * { 
    *; 
} 

-keep @org.bytedeco.javacpp.annotation.Platform public class * 

-keepclasseswithmembernames class * { 
    @org.bytedeco.* <fields>; 
} 

-keepclasseswithmembernames class * { 
    @org.bytedeco.* <methods>; 
} 

-keepattributes EnclosingMethod 
-keep @interface org.bytedeco.javacpp.annotation.*,javax.inject.* 

-keepattributes *Annotation*, Exceptions, Signature, Deprecated, SourceFile, SourceDir, LineNumberTable, LocalVariableTable, LocalVariableTypeTable, Synthetic, EnclosingMethod, RuntimeVisibleAnnotations, RuntimeInvisibleAnnotations, RuntimeVisibleParameterAnnotations, RuntimeInvisibleParameterAnnotations, AnnotationDefault, InnerClasses 
-keep class org.bytedeco.javacpp.** {*;} 
-dontwarn java.awt.** 
-dontwarn org.bytedeco.javacv.** 
-dontwarn org.bytedeco.javacpp.** 

# end javacv 

Und die folgenden Zeilen in meinem Gradle (das sind die neuesten Versionen zum 05.05.2015 (TT/MM/JJJJ)):

compile group: 'org.bytedeco', name: 'javacv', version: '0.11' 
compile group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '2.4.11-0.11', classifier: 'android-arm' 
compile group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '2.4.11-0.11', classifier: 'android-x86' 
compile group: 'org.bytedeco.javacpp-presets', name: 'ffmpeg', version: '2.6.1-0.11', classifier: 'android-arm' 
compile group: 'org.bytedeco.javacpp-presets', name: 'ffmpeg', version: '2.6.1-0.11', classifier: 'android-x86' 

Ich bin ziemlich sicher, dass einige Proguard-Regeln ein wenig übertrieben sind, aber ich habe noch nicht getestet, die redundant sind. Sie können dies selbst herausfinden, wenn Sie auf dieses Problem stoßen.

+0

die Version ProGuard Sie verwenden – apk

+0

@apk, habe ich die Version mit dem neuesten ausgeliefert Freigabe von AS. Es ist Proguard Version 4.7 – Gooey

+0

versuchen Sie 4.9 und höher – apk

Antwort

5

Ich bin auch javacv mit und hier ist, wie meine proguard Datei aussieht:

## JavaCV 
-keepattributes *Annotation*, Exceptions, Signature, Deprecated, SourceFile, SourceDir, LineNumberTable, LocalVariableTable, LocalVariableTypeTable, Synthetic, EnclosingMethod, RuntimeVisibleAnnotations, RuntimeInvisibleAnnotations, RuntimeVisibleParameterAnnotations, RuntimeInvisibleParameterAnnotations, AnnotationDefault, InnerClasses 
-keep class org.bytedeco.javacpp.** {*;} 
-dontwarn java.awt.** 
-dontwarn org.bytedeco.javacv.** 
-dontwarn org.bytedeco.javacpp.** 

Es mag etwas übertrieben sein, aber es ist was fi Schließlich hat es funktioniert für mich. Hoffe es hilft dir.

Sie brauchen auch keine zusätzliche JAR-Dateien hinzufügen, wenn Sie die folgenden Zeilen zu Ihrer gradle Datei hinzufügen:

compile group: 'org.bytedeco.javacpp-presets', name: <module>, version: <module-version>, classifier: <your-platform> 

die verfügbaren Module zu erhalten, für javacpp in jcenter suchen und Sie werden sehen, sie als org.bytedeco.javacv-presets:<module>.

Wenn Sie auf eine dieser Dateien klicken, können Sie die Version abrufen, die Ihrer javacv-Version entspricht. Wenn Sie also javacv 0.11 verwenden und das Modul opencv hinzufügen möchten, müssen Sie die Version 2.4.11-0.11 des javacpp-Presets verwenden.

Schließlich fügen Sie einfach die Plattform Ihrer Wahl android-arm oder android-x86 oder beide für die Angelegenheit, und Sie sollten gut zu gehen.

schließlich als Beispiel, hier ist die javacv Import wie für opencv und ffmpeg für die ARM-Plattform aussehen:

compile group: 'org.bytedeco', name: 'javacv', version: '0.11' 
compile group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '2.4.11-0.11', classifier: 'android-arm' 
compile group: 'org.bytedeco.javacpp-presets', name: 'ffmpeg', version: '2.6.1-0.11', classifier: 'android-arm' 
+0

Hmmm ich bekomme jetzt einen anderen Fehler, über das Fehlen einer .so-Datei. Haben Sie zusätzliche Gläser hinzugefügt? Wenn ich dies tue, erhalte ich doppelte Zip-Warnungen in Proguard – Gooey

+0

Hast du die natives perst-Dateien hinzugefügt? Wenn nicht, müssen Sie der Gradle-Datei folgende Zeilen hinzufügen: Kompiliergruppe: 'org.bytedeco.javacpp-presets', Name: 'opencv', Version: '2.4.10-0.10', Klassifikator: 'your_platform' Kompiliergruppe: 'org.bytedeco.javacpp-presets', Name: 'ffmpeg', Version: '2.5.1-0.10', Klassifikator: 'your_platform' –

+0

Sie haben also keine zusätzlichen Gläser? – Gooey

1

Vielleicht kann dies helfen.

-keep @org.bytedeco.javacpp.annotation.Platform public class * 

-keepclasseswithmembernames class * { 
    @org.bytedeco.* <fields>; 
} 

-keepclasseswithmembernames class * { 
    @org.bytedeco.* <methods>; 
} 
+0

Danke für deinen Vorschlag, leider hat es nicht funktioniert. – Gooey

1

Die folgende könnte helfen:

-keepattributes *Annotation* 
-keepattributes EnclosingMethod 
-keep @interface org.bytedeco.javacpp.annotation.*,javax.inject.* 
+0

Ich habe deinen Vorschlag ausprobiert, aber leider hat es nicht funktioniert. – Gooey

+0

Für die fehlende .so Datei, erinnern die nativen Anrufe wie unten überspringen: '-keepclasseswithmembernames, includedescriptorclasses Klasse * { nativen ; } ' –

0

Sie verwenden:

-keepattributes *Annotation* 

-keep @org.bytedeco.javacpp.annotation.Platform interface * { 
    *; 
} 
-keepclassmembers,allowobfuscation class * { 
    @org.bytedeco.javacpp.annotation.Platform <fields>; 
    @org.bytedeco.javacpp.annotation.Platform <init>(...); 
}