Proguard 删除 Android 应用程序中的注释
Proguard removing annotations in Android application
我在我的应用程序中包含了一个使用 gradle 的项目:
compile group: 'org.bytedeco', name: 'javacv', version: '0.11'
构建良好。但是每当我 运行 启用了混淆器的应用程序时,它显然会从随后包含的罐子中删除 @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 *
但这也不管用。我还能尝试什么来阻止混淆器删除这些注释?我正在考虑使用 -injars
或 -libraryjars
,但我相信 gradle 可以为您处理。
解决方法:
所以解决方法如下:
我在混淆器规则中包含了以下内容:
# 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'
我很确定有些混淆规则有点矫枉过正,但我还没有测试过哪些是多余的。如果你 运行 遇到这个问题,你可能想自己解决这个问题。
也许这会有所帮助。
-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>(...);
}
我也在使用 javacv,这是我的混淆文件的样子:
## 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.11-0.11 版本的 javacpp-preset。
最后,只需添加您选择的平台 android-arm
或 android-x86
或两者,就可以开始了。
最后,作为示例,对于 arm 平台,opencv 和 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'
我在我的应用程序中包含了一个使用 gradle 的项目:
compile group: 'org.bytedeco', name: 'javacv', version: '0.11'
构建良好。但是每当我 运行 启用了混淆器的应用程序时,它显然会从随后包含的罐子中删除 @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 *
但这也不管用。我还能尝试什么来阻止混淆器删除这些注释?我正在考虑使用 -injars
或 -libraryjars
,但我相信 gradle 可以为您处理。
解决方法:
所以解决方法如下:
我在混淆器规则中包含了以下内容:
# 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'
我很确定有些混淆规则有点矫枉过正,但我还没有测试过哪些是多余的。如果你 运行 遇到这个问题,你可能想自己解决这个问题。
也许这会有所帮助。
-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>(...);
}
我也在使用 javacv,这是我的混淆文件的样子:
## 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.11-0.11 版本的 javacpp-preset。
最后,只需添加您选择的平台 android-arm
或 android-x86
或两者,就可以开始了。
最后,作为示例,对于 arm 平台,opencv 和 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'