Proguard删除Android应用程序中的注释

Goo*_*oey 13 java android proguard minify javacv

我在我的应用程序中使用gradle包含了一个项目:

compile group: 'org.bytedeco', name: 'javacv', version: '0.11'
Run Code Online (Sandbox Code Playgroud)

哪个建好了.但每当我在启用proguard的情况下运行应用程序时,它显然会@Platform从包含的jar中删除注释.

我尝试使用基于http://proguard.sourceforge.net/manual/examples.html#annotations的以下内容

-keepattributes *Annotation*

-keep @org.bytedeco.javacpp.annotation interface * {
    *;
}
Run Code Online (Sandbox Code Playgroud)

我还根据http://proguard.sourceforge.net/manual/troubleshooting.html#notkept尝试了以下内容

-keep @interface *
Run Code Online (Sandbox Code Playgroud)

但这也不起作用.还有什么可以阻止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
Run Code Online (Sandbox Code Playgroud)

我的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'
Run Code Online (Sandbox Code Playgroud)

我很确定一些proguard规则有点矫枉过正,但我​​还没有测试哪些是多余的.如果遇到这个问题,您可能想要自己解决这个问题.

Eds*_*tti 6

我也在使用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.**
Run Code Online (Sandbox Code Playgroud)

它可能有点过分,但它最终让它为我工作.希望它能帮到你.

如果将以下行添加到gradle文件,则也不需要添加任何额外的jar文件:

compile group: 'org.bytedeco.javacpp-presets', name: <module>, version: <module-version>, classifier: <your-platform>
Run Code Online (Sandbox Code Playgroud)

要获取可用模块,请在jcenter中搜索javacpp,您将看到它们org.bytedeco.javacv-presets:<module>.

单击其中任何一个将使您获得与您的javacv版本匹配的版本.因此,如果您正在使用javacv 0.11并想要添加opencv模块,则需要使用2.4.7-0.11版本的javacpp-preset.

最后,只需添加您所选择的平台android-armandroid-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'
Run Code Online (Sandbox Code Playgroud)