《2022年2022年关于ProGuard混淆工具的使用》由会员分享,可在线阅读,更多相关《2022年2022年关于ProGuard混淆工具的使用(3页珍藏版)》请在金锄头文库上搜索。
1、关于 ProGuard混淆工具的使用目标:jar 包 B 包含提供给开发者的接口,jar 包 C包含内部实现,B 调用 C 中的方法。要求B中接口类被保留, B中其他方法以及C 中全部内容被混淆。需保证混淆后的jar 包可以被Android工程正确导入并且功能实现正确。现阶段尚不考虑使用proguard 的压缩和优化功能。因为工程结构复杂,上述两个功能有可能导致混淆后的jar 包不可用。实验步骤准备:创建一个工程ProjectC。其中的一个类ClassC包含一个方法返回一个由构造函数获取的字符串,将 ProjectC 打包。创建一个工程ProjectB,并且引入ProjectC.jar 作为库
2、。 ProjectB 中的类 ClassB包含一个方法,该方法通过实例化ClassC并调用该实例的方法返回一个字符串。最后建立一个Android 工程,将打包后的ProjectB 作为库导入。在该工程的MainActivity中调用 ProjectB 中的方法获得字符串,并将字符串显示在屏幕上。步骤 1:将 Android 工程所生成apk 混淆( IntelliJ 下 ) :1.将 ProjectB.jar 和 ProjectC.jar 放置在 libs 文件夹下并且正确引用。2.注释掉 project.properties文件中的“proguard.config=$sdk.dir/tool
3、s/proguard/proguard-android.txt:proguard-project.txt”一行。3.生成带签名的apk 并且勾选: Run ProGuard 一项。结果:发现将 apk 反编译后,工程中所有的类和方法已被混淆。安装apk 后功能显示正常。步骤 2:使用 proguard 默认配置将ProjectB 混淆,并使用-libraryjars将 ProjectC配置成为混淆后名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 3 页 - - - - -
4、 - - - - ProjectB_after.jar的库。结果:发现 Android 工程只能使用ProjectB 中被混淆后的类名及方法。并且ProjectC 并未被混淆。步骤 3:在 ProjectB 中加入接口类InterfaceB,并创建类InterfaceForDev。在 proguard 配置文件中加入-keepclasseswithmembernames class interfaceB3.InterfaceForDev public java.lang.String getMsg(); 保留这个类和它包含的方法getMsg(); 结果:除了 InterfaceForDev 和
5、它包含的方法getMsg()没有被混淆外ProjectB 中其他类均成功混淆。Android 工程可以调用InterfaceForDev. getMsg() 方法并显示正确。PeojcetC 依然未混淆。步骤 4:将 ProjectC 作为输入文件而非库与ProjectB 一同混淆。结果:ProjectC 被混淆,Android 工程可以调用InterfaceForDev. getMsg()方法并显示正确。 且 Android工程不再需要单独导入ProjectC,初步达到预期目标。用反编译软件打开混淆后的jar 文件:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - -
6、 - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 3 页 - - - - - - - - - 总结如果有多个jar 文件需要混淆,则需要使用多行-injars 命令把这些jar 文件设置为输入(此处应注意同名package 的问题 ) 。这些 jar 文件之间的调用关系proguard 会自行处理,只需用-keep 保留所需的接口即可。如果被-libraryjars命令定义为库的jar包将不会被混淆。Keep 方法的使用保留项保留不被删除或重命名保留不被重命名类和成员-keep -keepnames 类成员-keepclassmembers -ke
7、epclassmembernames 类和成员(如果成员被调用)-keepclasseswithmembers -keepclasseswithmembernames 附 ProGuard现存问题:为了达到最佳的效果,ProGuard 的优化算法( optimization )假设被处理的代码不会有意地抛出 NullPointerExceptions ,ArrayIndexOutOfBoundsExceptions ,OutOfMemoryErrors 或者 StackOverflowErrors。比如,一个没有效果的方法调用myObject.myMethod() 有可能被优化算法移除。它将忽
8、略由于myObject=null 而导致的NullPointerExceptions 。被优化了的代码可能会减少抛出异常的次数。如果要避免这种情况发生,你需要用-donotoptimize 关闭优化选项。同样的情况也会发生在busy-waiting loop 上。如果输入的jar 包与 library 库包含同名类,混淆(obfuscated)后 jar 包中的类有可能会覆盖库中的类。这种状况多发生在库类jar 文件被混淆过。一些混淆后的文件名可能被windows 所占用,如:aux.class。把输出文件写入jar 包可解决这类问题。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 3 页 - - - - - - - - -