Android代码混淆出错debug二三事

    实验室暑假的项目要用到一个蓝牙 + GPRS的安卓客户端,基本上也就本人在做这部分。做完之后,调试运行无误了。本着顺便学一下的心态,去弄了代码混淆。嗯,看了教程好像蛮简单的。混淆后Export出来个APK,装上去后就呵呵了。登录界面一点登录就崩溃了。LogCat返回来的信息是混淆后的类名和函数的提示信息,不好定位出错的地方。

    后来才发现代码混淆后,工程目录下面有个proguard的文件夹,里面的mapping.txt文件就是关于混淆前后的类名及方法名的映射。这下对照着LogCat的信息比较容易定位出错点了。

 一、工厂模式导致的错误

因为我使用了工厂模式,在具体工厂的产品创造方法里,是用反射来实现具体产品子类对象的创建,而出错的点就是调用具体工厂的产品创建方法的地方。debug发现该方法返回的是一个空对象,而且方法执行时报了个异常java.lang.NoSuchMethodException。得了,这下啥都明了了。代码混淆之后,找不到类名了,无法构造出相应的产品子类对象。

    解决方法是在proguard-project.txt中保留产品子类。如下:

-keep public class mypackage.MyProductA
-keepclassmembers class mypackage.MyProductA{
    public *;
}

-keep public class mypackage.MyProductB
-keepclassmembers mypackage.MyProductB{
    public *;
}

包名跟类名这里随便写一下。


二、高德地图包导致的错误

项目中,使用了高德的地图包。代码混淆后,上面的问题解决了,但地图这一块一直导致程序出错退出。LogCat的信息指明是关于高德地图包及android-support-v4包。

这个问题的解决本人是参照了如下链接文章的方法,果然一下子就解决了。

http://www.2cto.com/kf/201407/317837.html


解决方法是:

在proguard-project.txt中,加下以下行,屏蔽对于高德地图包及android包的混淆

#android辅助包
-libraryjars libs/android-support-v4.jar
-dontwarn android.support.v4.**
-keep class android.support.v4.**
-keep interface android.support.v4.app.** {*;}

#高德地图包
-libraryjars libs/Android_Location_V1.0.5.jar
-libraryjars libs/Android_Map_2.1.4.jar
-libraryjars libs/Android_Services_2.1.4.jar
-dontwarn com.amap.api.**
-dontwarn com.a.a.**   
-dontwarn com.autonavi.**   
-keep class com.amap.api.** {*;}
-keep class com.autonavi.**  {*;}
-keep class com.a.a.**  {*;}



你可能感兴趣的:(代码混淆,高德地图)