【发布时间】:2015-07-16 16:29:06
【问题描述】:
我在我的应用中包含了一个使用 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 中的以下几行(这些是日期为 7/5/2015 (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 规则有点矫枉过正,但我还没有测试过哪些是多余的。如果遇到此问题,您可能需要自己解决。
【问题讨论】:
-
你使用的是哪个 proguard 版本
-
@apk,我有最新版本的 AS 附带的版本。它是 proguard 4.7 版
-
请不要编辑您的问题以包含解决方案,而是将其发布为答案(您可以发布自己问题的答案)。
-
不,我和 Edson 在聊天中进行了讨论,他不得不离开。由于他在 0.10 版本上运行,而我在 0.11 版本上运行,这需要不同的 gradle 语句,而且他离线的脸让我在帖子中恢复了我的答案。他确实回答了这个问题,因此我接受了这个答案并分配了赏金。为方便起见,我将它添加到我的帖子中,因为我遇到了让它保持最新的麻烦。我认为这是一件令人愉快的事情。
标签: java android proguard minify javacv