Java Proguard在Android应用程序中删除注释

Java Proguard在Android应用程序中删除注释,java,android,proguard,minify,javacv,Java,Android,Proguard,Minify,Javacv,我在我的应用程序中包含了一个使用gradle的项目: compile group: 'org.bytedeco', name: 'javacv', version: '0.11' 这很好。但每当我在启用proguard的情况下运行应用程序时,它显然会从当时包含的JAR中删除@Platform注释 我尝试使用以下基于 我还尝试了以下基于 但这也不行。还有什么可以阻止proguard删除这些注释?我在考虑使用-injars或-libraryjars,但我相信gradle会为您解决这个问题 解决方

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

compile group: 'org.bytedeco', name: 'javacv', version: '0.11'
这很好。但每当我在启用proguard的情况下运行应用程序时,它显然会从当时包含的JAR中删除
@Platform
注释

我尝试使用以下基于

我还尝试了以下基于

但这也不行。还有什么可以阻止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
我很确定一些proguard规则有点过火,但我还没有测试哪些是多余的。如果遇到这个问题,您可能想自己解决。

也许这会有所帮助

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

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

-keepclasseswithmembernames class * {
    @org.bytedeco.* <methods>;
}
-keep@org.bytedeco.javacpp.annotation.Platform公共类*
-KeepClassSwithMemberNames类*{
@org.bytedeco.*;
}
-KeepClassSwithMemberNames类*{
@org.bytedeco.*;
}

以下内容可能会有所帮助:

-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>(...);
}
-keepattributes*注释*
-keep@org.bytedeco.javacpp.annotation.Platform interface*{
*;
}
-keepclassmembers,AllowFusion类*{
@org.bytedeco.javacpp.annotation.Platform;
@org.bytedeco.javacpp.annotation.Platform(…);
}

我也在使用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>

我尝试了您的建议,但不幸的是,它没有起作用。对于缺少的.so文件,请记住跳过本机调用,如下所示:
-keepclassswithmembernames,includedescriptorclasses class*{native;}
您使用的是哪个proguard版本using@apk,我有AS最新版本附带的版本。这是proguard版本4.7。请不要编辑您的问题以包含解决方案,而是将其作为答案发布(您可以发布您自己问题的答案)。不,我和Edson在聊天中进行了讨论,他不得不在某个时间离开。因为他运行的是0.10版,而我运行的是0.11版,这需要不同的gradle语句,而且他离线时的表情让我在帖子中继续回答。他确实回答了这个问题,因此我接受了这个答案并分配了赏金。为了方便起见,我把它添加到了我的帖子中,因为我一直在努力更新它。我认为这是一件愉快的事情。嗯,现在我错过了一个.so文件的错误。你加了其他罐子了吗?如果我这样做,我会在ProGuard中收到重复的zip警告。您是否添加了本机prest文件?如果没有,您需要在gradle文件中添加以下行:编译组:'org.bytedeco.javacpp presets',名称:'opencv',版本:'2.4.10-0.10',分类器:'your_platform'编译组:'org.bytedeco.javacpp presets',名称:'ffmpeg',版本:'2.5.1-0.10',分类器:'your_platform所以您不包括任何附加的jar否,那些线已经为你做了工作。。。只要试着得到他们的最新版本。我仍然在使用0.10,但我确信0.11还有一些预设值,这只是另一回事,所以它不会让人困惑。根据您使用的是什么,将“您的_平台”替换为“android arm”或“android-x86”,或者根据您希望支持的硬件类型为这两个平台添加行。
-keepattributes *Annotation*

-keep @org.bytedeco.javacpp.annotation.Platform interface * {
    *;
}
-keepclassmembers,allowobfuscation class * {
    @org.bytedeco.javacpp.annotation.Platform <fields>;
    @org.bytedeco.javacpp.annotation.Platform <init>(...);
}
## 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.**
compile group: 'org.bytedeco.javacpp-presets', name: <module>, version: <module-version>, classifier: <your-platform>
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'