Andorid Proguard jar包扰码以及多包混合扰码
1.简介
不同于web开发,在Android 项目开发过程中通常会因为技术保密问题涉及到扰码
而虽然android ADT 内置了扰码功能,不过其却不可以进行对jar 包的扰码。
而本文就是介绍如何直接使用Proguard 进行jar包扰码(Proguard 也是ADT所用的扰码工具)
本文中的内容 主要应对以下几种情况:
1.作为某种技术jar包的提供商,却因为保密原因需要进行jar包扰码。
2.项目中存在多个第三方包,希望将其合并成一个,以便他人使用时却没有源码无法合并。
3.博主这个项目,是一个 Android + Jni + 打包 +扰码的项目,最后要求要jar的哦。
2.工具以及环境
整体测试使用均在实际使用中得出,并未单独进行测试。
平台环境 windows,Proguard 版本 Proguard 5.1 ,Android 环境 开发工具 Eclipse 版本 ADT 4.2.2
Android 版本 6.0
3.正文
首先需要将需要导出jar包的项目导出,导出不在本文叙述范围内(多包合并时,如果有源码,在导出时即可合并)。
1.下载
在Proguard 官网 http://proguard.sourceforge.net 下载Proguard。
不过这个网站并不好用,推荐通过网盘等资源下载
2.解压打开
将下载的Proguard 解压,并执行 bin目录下 proguardgui.bat,会出现如下窗口
右下角的按钮则用于加载已经生成好的配置文件。
此时会看到左边有一列按钮,此列按钮为配置选项卡。
3.配置
这里推荐使用proguard 生成大部分配置文件,而保护(Keep)不进行扰码的文件手动添加的方式添加。
此步骤为比较重要的步骤之一可能直接影响打包结果成败
点击左边“input/output”菜单,此页面用于配置所有输入以及输出的jar包。
此时会看到右边出现选框以及按钮,上方添加 输入 输出的jar包,而下方 侧需要添加所有关联的jar包
点击右边上方的“Add input”按钮,添加需要混淆的jar包,然后点击“add output”,选择输出的路径和包名。
添加完成后点击右侧下方“Add”按钮,添加上方输入jar中所应用的所有关联jar(比如某一个类中用到了Apache 包中的功能,某些功能内置到了Android 中),就需要将所对应的 Apache包添加到窗口下方。
其中有任何一个引用未加入都会导致 扰码失败,当然 Android 对应的版本包也需要加入其中,以及用到的 support-v4 /-v7
其他配置大部分可以因人而异,我并未对所有功能一一测试楼主配置如以下图所示
1.压缩.
2.扰码
Obfuscate 是否进行混淆
Obfuscationdictionary {filename} 使用给定文件中的关键字作为要混淆方法的名称
Repackage class {package_name} 重新包装所有重命名的类文件中放在给定的单一包中
Overload aggressively 混淆时应用侵入式重载
Use unique class member names 确定统一的混淆类的成员名称来增加混淆
Use mixed-case class names 混淆时产生形形色色的类名,例如大小写混合什么的
keeppackagenames {package_name} 保持packagename 不混淆
Keep attributes {attribute_name,…} 保护给定的可选属性,会有一部分生成,例如JNI中的方法等
Keep parameter names 不混淆参数名
Rename source file attribute {string} 设置源文件中给定的字符串常量
3.优化
Optimize 是否优化
Allow access modification 优化时允许访问并修改有修饰符的类和类的成员
Merge interfaces aggressively 竭力合并接口,即使它们的实现类未实现合并后接口的所有方法。
Optimizations 指定要优化的文件
Optimization passes 优化次数
其他两项为删除一些 系统方法,以及Log
这里注意
当你的jar包,是给 android 项目使用时,请尽量不要优化,或者少优化
博主在当初打包的时候扰码完成,加入项目,编译成功,但是在android 程序运行时却一直报一个错误:
当初出这个错误的时候,进行了大量查阅也没有找到解决问题的办法
当然也是博主渣渣,未进行很多 深入分析,最后发现不进行代码优化即可正常使用(别问我怎么试出来的,不想说。。)
4.预校验
怕出错所以索性这里什么都没选。。。当然如果不开启下面肯定不会生效的
最后一步!
四个按钮分别是,返回 查看配置文件 保存配置文件 和 开始
到了这里我们可以将配置文件保存下来方便以后使用
不过到了这里还没完
别忘了我们还没有添加 被保护(Keep)的类,在扰码时,任何一个JNI 的方法被扰码,都会导致运行错误,虽然 ProGuard 会自动帮我们排除一些方法,不过为了防止出错还是要自己添加一下才好。
找到我们所保存的配置文件 在其中加入:
-keep public class com.shitu.xxx.xxx.PrimaryDatas { *; } 来保护某一个类不被扰码。
其中 -keep 后面跟访问修饰符要与类文件中 完全相同,例如
-keep public static abstract class [全限定类名]{*;} *; 代表所有属性方法
不过这么写 还不能保证完全正确,当存在内部类时,这样会将内部类扰码,如果外部也需要引用的话
需要再写一遍
-keep xxxxx 并在 类名后面跟 $* {*;} 表示所有内部类的属性方法
保存后,我们再次打开使用的时候就可以直接加载配置文件稍作修改即可使用了.
最后(真的最后了)
我们之前提到过,关于多包混合,有一定经验的同志们应该已经看出来了,其实只要在添加输入包的时候,添加多个就好了。。。
不过别忘了将另外包的引用也加入到其中。
4.题外话
在Android 中内置的Proguard 扰码Apk 时,如果替换过 android proguard 文件夹bin下的文件时(相当于提高了proguard 版本)
不用将所有引用的jar 都加入文件中了,应该是高版本已经帮我们做了(别问我怎么知道的,猜的)
部分资料参考自:
http://demo.netfoucs.com/rulon147/article/details/42550901
http://blog.csdn.net/jjwwmlp456/article/details/44977721
http://blog.csdn.net/banketree/article/details/41928175 (这里面有一些常见错误)
另转载请注明出处