您的位置:首页 > 移动开发 > Android开发

关于Android项目混淆遇到的问题

2014-07-05 13:29 876 查看
昨天晚上客户端APP新版本上线,就在准备打包新版本apk后,安装完登录后发现总是会出现crash的情况,但是使用Eclipse直接部署到手机上却没有这个问题,然后开始顺着crash的报错寻找问题的根源,报错信息是java.lang.ExceptionInInitializerError这是最上面的报错,指向位置是org.eclipse.paho.android.service.n.a才发现这是由于项目代码被混淆的缘故,所以没办法准确定位错误的位置,下面还有具体的报错信息是Cause by:java.util.MissingResourceExcepiton:Error
locating the logging class了解到大概是由于丢失了文件导致的,但是具体原因还不清楚。

接下来开始着手寻找问题的根源:

1、首先,当前项目中包含多个jar文件,想百度定位,百度统计,支付宝支付,这些文件都没有问题,因为都是jar的形式,不存在找不到资源的问题

2、其次,当前项目中包含了多个类库项目,有下拉刷新lib项目、支付宝的类库项目、再就是当前这个mqtt的类库项目

3、因为其他的类库项目也都没有找不到资源的问题,所以开始看看如果不混淆能不能解决问题

暂时不混淆我的做法开始是直接把proguard-project.txt中所有的混淆策略都使用#注释掉了,心想这样总可以了吧,但是事实是当我在打包apk时会爆出混淆报错的问题,打包失败,然后开始仔细研究关于混淆的代码,发现project.properties文件中也引用了proguard-project.txt的文件,于是我又把project.properties中的proguard.config所在行注释掉,再次打包成功,由此我证明了,注释掉proguard-project.txt中的所有混淆策略并不能解决混淆的问题,并且证明了之前的java.util.MissingResourceException的报错是由于混淆引起的

解决混淆策略:

然后开始研究proguard-project.txt中的混淆策略,由于之前对于混淆也不是特别的了解,然后发现其中有一行代码

-keep public class * extends android.app.Activity

百度了一下android 混淆中keep的用法,发现keep的代码是不会混淆的,并且看到

-keep public class org.eclipse.paho.**{*;}的用法可以让某个包下的所有代码及其方法都不被混淆,然后这样修改后再次打包apk能正常运行

事实证明,如果打开了Android代码混淆的开关,则默认会把全部的代码都进行混淆,如果想某些代码不混淆,则需要加入混淆策略中

另外一个混淆和不混淆的直观差别是混淆后打包的apk比不混淆的apk要小很多,混淆前2.2兆左右的apk混淆后大约1.77兆!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: