Proguard 删除 Android 应用程序中的注释解决方案:

2022-09-04 04:06:29

我已经在我的应用程序中包含了一个使用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 删除这些注释?我正在考虑使用或但我相信gradle可以为您处理。-injars-libraryjars


解决方案:

因此,解决方案如下:

我在我的护卫规则中包括以下内容:

# 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'

我很确定一些前卫规则有点过分,但我还没有测试哪些是多余的。如果您遇到此问题,您可能需要自己弄清楚这一点。


答案 1

我也在使用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模块,则需要使用javacpp-preset的2.4.11-0.11版本。

最后,只需添加您选择的平台或两者兼而有之,您应该就可以了。android-armandroid-x86

最后,作为一个例子,对于opencv和arm平台的ffmpeg,javacv导入看起来像这样:

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'

答案 2

也许这可以有所帮助。

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

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

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