1
2
使用以下规则: -keepclasseswithmembers class com.your.packages.** { native <methods>; } -keepclassmembers class com.your.packages.** { native <methods>; } 注意,使用Proguard“完全跳过”类总是一个坏主意,因为它还可能间接保留一些类,这些类是从保存类的代码中使用的。相反,我建议使用以下模式: -keepclasseswithmembers,allowshrinking,allowoptimization class com.your.packages.** { native <methods>; } -keepclassmembers class com.your.packages.** { native <methods>; } 它将允许收缩和优化同一类中存在的非本机方法的代码。
您可以做得更好:如果您的本地方法是通过名称来解析的(例如,它们被称为
-keepclasseswithmembers,allowshrinking,allowoptimization class com.your.packages.** { native <methods>; } 如果您想从JNI访问一些类成员(例如,您有一些静态回调方法要从本机代码调用),那么应该保留它们 明确地 :使用专用注释为每个此类成员添加注释,并使用基于注释的规则保留它们: -keepclassmembers,allowoptimization,includedescriptorclasses class com.your.packages.** { @android.support.annotation.Keep *; } 你可以用你自己的注释代替Android支持库中的一个注释,事实上,最好是使用你自己的,以避免来自现有的消费者规则的干扰,来自Android插件或其他库。 一般来说,我建议您尽可能减少JNI和Java代码之间的摩擦。如果有多个从JNI调用的相关Java方法,请尝试将它们放在同一方法中:
抛出Java代码中的异常(无论如何,您都要反射地调用它们的构造函数,因此不妨改为调用静态帮助器方法):
如果您有一个必须传递给JNI的类,请尝试传递单个字段而不是该类:
如果有本机对等类(类,与本机内存中的某个结构紧密连接),则可以在
在本机代码中:
这些简单的规则将允许您使用JNI完全混淆任何大型应用程序,除了一个包含所有
我建议您更进一步,推动重新打包类,由本机回调引用。 而不是
可以通过将参数类型替换为
这将使您混淆和重新打包甚至类型的回调参数。 |
2
0
使用-keep而不是-keepclasseswithmembernames
更多信息: https://jebware.com/blog/?p=418
|
Abhilash Das · 输入文本时,编辑文本与工具栏重叠 1 年前 |
Community wiki · 局部变量可能尚未初始化 1 年前 |
jvargas · 如何获取上个月的第一天和最后一天以及一年的第一天 1 年前 |