最近公司要求对自己开发的SDK生成的jar包进行加密与混淆,之前也是小白,经过了一番研究,完成了这个需求,这里做个小小的总结,希望能对一些朋友起到些帮助作用,这里主要是理论。
先说一个心得:
1.jar包是需要导入项目中供别人使用的,class文件必须具备一定的规范才能被JVM识别,从而正确的被导入使用。加密是不可行的,因为虽然被加密的class文件虽然不能被gd_gui反编译,但是如果不解密的话,是无法被JVM识别,jar无法正常被导入,所以选择混淆处理。
这里进入正题:
我使用的常用的proguard工具进行混淆,注意较低版本的混淆器的配置文件名为proguard.mf。较新版本的配置文件是proguard-project.txt和project.properties。我们基本是后者,其实差别不大,如果要将项目打包成apk时,对其混淆,只需要修改配置文件,再Export导出apk,JVM会在执行配置文件时,混淆器会按照配置文件的要求,对代码进行混淆,但这个方法并不能实现我们混淆sdk的要求,这里我们就需要使用Android sdk里带的tool:proguardgui.bat这个图形化工具,通过设置,生成一个.pro配置文件(当然大神也可以手写),再导入这个配置文件,手动的对jar包进行混淆。(工具目录大概在这个位置:E:\sdk\tools\proguard\bin\proguardgui.bat),工具的使用教程网上有很多我就不多说了,自己去搜下,按流程走就行。
这里推荐几个相关链接:
http://m.blog.youkuaiyun.com/blog/xiangxue336/22720963
http://m.blog.youkuaiyun.com/blog/xiangxue336/22720963
这里要特别注意容易出错的地方:
1.在导入依赖的库时,有时会出现这个错误:一堆Warning:com.turing.androidsdk.*****.****:can't find referenced class java.util.List的警告,这是因为你少倒入了sdk里的一个jar包,找到导入即可。
2.如果你对全局混淆,就必须保留下来你要对开放的类名和接口等名字,不被混淆,这就是上面说的识别规范的问题,否则,导出的jar包将毫无意义,无法被JVM正确识别,无法正常使用,报错图片如下:
解决方法:在生成.pro混淆配置文件时,必须去了解下proguard的代码语法,手动添加代码keep住我们要保留的类,接口,方法(后来发现图形化也可以添加),否则会报上面这个错误,这个网上很多可以自己去搜下学习下,代码格式大致这个样子:
-keep classcom.turing.androidsdk.voice.* {
public <fields>;
public <methods>;
*** set*(***);
*** get*();
}
这里附上个代码连接:
http://www.trinea.cn/android/proguard-grammar/
导入导入配置文件后,混淆成功,反编译看下效果,如下:
混淆成功,结束。