因项目需要把 Android Framework 自主开发部分的代码进行代码混淆,首先的工具是 PROGUARD。但是 PROGUARD 更多是用于 APK 的代码混淆。网络上还没有看到对 Framework 代码混淆的案列。
网上找不到方法,只好自己动手了。研究了两天,终于实现了 Framework 层的代码混淆。
1.修改 Android.mk
代码放在 framework/base 目录下,编译生成 framework.jar,其实这不是一个很好的做法,因为与 Android 源生的代码混合在一起,造成低耦合。前期考虑不当了,后期维护就相对麻烦。
最关键的一点,修改 Android.mk, 使需要混淆部分的包和类单独编译。因为 framework 其他代码最好不要混淆,以免引起找不到类的出错提示。
然后设置 LOCAL_PROGUARD_ENABLED := nosystem,很重要,不然类的方法不会混淆成abcd类似的名称。
然后指定 proguard.flag,设定不混淆(保留)对外公开接口的类,重新编译。可以用模块编译 mmm 命令提高编译效率。
2.检查 proguard_dictionary
首先 mmm 编译后,会提示生成 proguard.classes.jar,这个时候 proguard 其实已经生效。但是我们还是要看一下实际的效果,jar 生成目录会生成一个 proguard_dictionary(.out/target/common/obj/JAVA_LIBRARIES/framework-base_intermediates/proguard_dictionary),这个文件记录了混淆是如何生效的。例如:
float mCurrentX -> h
float mCurrentY -> i
3.反编译检查最终效果
.out/target/common/obj/JAVA_LIBRARIES/framework-base_intermediates/ 目录下,
classes.jar 是没有混淆前的包,而 javalib.jar 是混淆后的包,用 jd-gui 查看混淆的效果是否满意。
而更重要的是反编译查看 ./out/target/product/rk3288/system/framework/framework.jar, 因为这个是最终打包到系统里面去的。
如图,这个是我最终混淆后的结果:
4. 更新系统,检查效果
将生成的新的 framework.jar push 到平板,调用相关接口,看功能是否正常。如果不小心混淆了外部需要调用的接口,logcat 可以看到提示找不到类,那就会引起异常了。