[英]Proguard removing annotations in Android application
我在我的應用程序中使用gradle包含了一個項目:
compile group: 'org.bytedeco', name: 'javacv', version: '0.11'
哪個建好了。 但是每當我在啟用proguard的情況下運行應用程序時,它顯然會從包含的jar中刪除@Platform
注釋。
我嘗試使用基於http://proguard.sourceforge.net/manual/examples.html#annotations的以下內容
-keepattributes *Annotation*
-keep @org.bytedeco.javacpp.annotation interface * {
*;
}
我還根據http://proguard.sourceforge.net/manual/troubleshooting.html#notkept嘗試了以下內容
-keep @interface *
但這也不起作用。 還有什么可以阻止proguard刪除這些注釋? 我正在考慮使用-injars
或-libraryjars
但我相信gradle會為你處理。
所以解決方案如下:
我在我的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
我的gradle中有以下幾行(這些是2015年7月5日最新版本(dd / mm / yyyy)):
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'
我很確定一些proguard規則有點矯枉過正,但我還沒有測試哪些是多余的。 如果遇到這個問題,您可能想要自己解決這個問題。
我也在使用javacv,這是我的proguard文件的樣子:
## 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.**
它可能有點過分,但它最終讓它為我工作。 希望它能幫到你。
如果將以下行添加到gradle文件,則也不需要添加任何額外的jar文件:
compile group: 'org.bytedeco.javacpp-presets', name: <module>, version: <module-version>, classifier: <your-platform>
要獲取可用模塊,請在jcenter中搜索javacpp ,您將看到它們為org.bytedeco.javacv-presets:<module>
。
單擊其中任何一個將使您獲得與您的javacv版本匹配的版本。 因此,如果您正在使用javacv 0.11並想要添加opencv模塊,則需要使用2.4.7-0.11版本的javacpp-preset。
最后,只需添加你選擇的android-arm
或android-x86
或兩者的平台就可以了,你應該好好去。
最后,作為一個例子,這里的javacv導入對於arm平台的opencv和ffmpeg看起來像:
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'
也許這可以幫助。
-keep @org.bytedeco.javacpp.annotation.Platform public class *
-keepclasseswithmembernames class * {
@org.bytedeco.* <fields>;
}
-keepclasseswithmembernames class * {
@org.bytedeco.* <methods>;
}
以下可能會有所幫助:
-keepattributes *Annotation*
-keepattributes EnclosingMethod
-keep @interface org.bytedeco.javacpp.annotation.*,javax.inject.*
你可以使用:
-keepattributes *Annotation*
-keep @org.bytedeco.javacpp.annotation.Platform interface * {
*;
}
-keepclassmembers,allowobfuscation class * {
@org.bytedeco.javacpp.annotation.Platform <fields>;
@org.bytedeco.javacpp.annotation.Platform <init>(...);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.