2015-05-06 14 views
13

mam włączone projektu przy użyciu Gradle w mojej aplikacji:PROGUARD usuwanie adnotacji w aplikacji Android

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

która buduje w porządku. Ale gdy uruchomię aplikację z włączonym proguardem, najwyraźniej usuwa ona adnotację @Platform ze słoików, które są wtedy dołączane.

Próbowałem za pomocą następujących podstawie http://proguard.sourceforge.net/manual/examples.html#annotations

-keepattributes *Annotation* 

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

Próbowałem też następuje na podstawie http://proguard.sourceforge.net/manual/troubleshooting.html#notkept

-keep @interface * 

Ale to nie działa. Co jeszcze mogę zrobić, aby zapobiec usunięciu tych adnotacji przez proguard? Myślałem o użyciu -injars lub -libraryjars, ale uważam, że gradle obsługuje to dla Ciebie.


Rozwiązanie:

więc rozwiązanie jest następujące:

mam włączone następujące w moich zasad PROGUARD:

# 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 

i następujące wiersze w moim gradle (są to najnowsze wersje na dzień 7/5/2015 (dd/mm/rrrr)):

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' 

Jestem całkiem pewien, że niektóre zasady proguarda są nieco przesadzone, ale jeszcze nie przetestowałem, które są zbędne. Możesz sam się tego dowiedzieć, jeśli napotkasz ten problem.

+0

który PROGUARD wersji używasz – apk

+0

@apk, mam wersji dostarczanej z najnowszymi wydanie AS. To jest wersja proguard 4.7 – Gooey

+0

try 4.9 i powyżej – apk

Odpowiedz

5

Używam również javacv a oto jak mój plik PROGUARD wygląda:

## 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.** 

Może to być nieco przesadzone, ale to, co fi W sumie to działa dla mnie. Mam nadzieję, że ci to pomoże.

też nie trzeba dodawać żadnych dodatkowych plików jar jeśli dodać następujące wiersze do pliku: Gradle

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

Aby uzyskać dostępnych modułów, szukaj javacpp w jcenter i zobaczysz je jako org.bytedeco.javacv-presets:<module>.

Kliknięcie dowolnego z nich pozwoli uzyskać wersję zgodną z wersją javacv. Jeśli więc używasz javacv 0.11 i chcesz dodać moduł opencv, musisz użyć wersji javacpp w wersji 2.4.11-0.11.

Wreszcie, po prostu dodaj platformę do wyboru android-arm lub android-x86 lub w obu przypadkach i powinieneś być gotowy.

Wreszcie, jako przykład, oto import javacv będzie wyglądać na OpenCV i ffmpeg dla platformy ramienia:

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 Otrzymuję teraz inny błąd, o braku pliku .so. Czy dodałeś kolejne słoiki? Jeśli to zrobię, otrzymam zduplikowane ostrzeżenia zip w Proguard – Gooey

+0

Czy dodałeś pierwotne pliki? Jeśli nie, musisz dodać następujące linie do pliku gradle: grupa kompilacji: 'org.bytedeco.javacpp-presets', nazwa: 'opencv', wersja: '2.4.10-0.10', klasyfikator: 'your_platform' grupa kompilacji: 'org.bytedeco.javacpp-presets', nazwa: 'ffmpeg', wersja: '2.5.1-0.10', klasyfikator: 'twoja_platforma' –

+0

Więc nie masz żadnych dodatków? – Gooey

1

Może to pomoże.

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

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

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

Dzięki za sugestię, niestety to nie zadziałało. – Gooey

1

Następujące może pomóc:

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

Próbowałem Twojej sugestii, ale niestety to nie zadziałało. – Gooey

+0

Dla brakującego pliku .so pamiętaj, aby pominąć połączenia natywne, jak poniżej: '-keepclasseswithmembernames, includedescriptorclasses class * { native ; } ' –

0

Można użyć:

-keepattributes *Annotation* 

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