安卓代码混淆与反射冲突,地图无法显示等问题解决及反编译方法
2014-08-22 11:45
666 查看
此前的代码混淆,因为并没有用到反射,所以常规的代码混淆方式一遍就能通过,而此项目中某些类利用到了反射机制(本人的这个项目中有即时通讯功能,所以有表情类资源,因此需要通过反射由文件名找到表情资源id),当由文件名去寻找资源id时就报空指针异常了,期初我并不知道什么原因,通过反编译已经混淆的apk,一步一步寻找到出错的地方,才恍然大悟,正是反射那一步出现了问题:Field field = R.drawable.class.getDeclaredField(name);走到这一步就挂了,程序直接崩溃。
解决办法:
1.在proguard.cfg文件中,将反射用到的类中的变量不被混淆:
如:-keep public class com.byl.bean.Expressions { *; },表示Expressions 这个类及类中的所有变量及方法不被混淆,注意要写全路径;
2.过滤泛型:-keepattributes Signature
3.最重要的一点:保持R文件不被混淆,否则,你的反射是获取不到资源id的:-keep class **.R$* {*;}
补充一下:上个问题解决后,接下来又遇到了一个问题就是混淆后,地图无法正常使用了,博主使用的是百度地图,在proguard.cfg也已经写明了:
保持百度地图相关类不被混淆,但是地图仍然出错(只显示网格,无法搜索POI等),这是为什么呢?原因是,混淆前的SHA1和混淆后的SHA1不同,你使用的百度AK依然是混淆前申请的,所以用在混淆后的安装包里当然无法使用了,解决办法就是用混淆时所用的签名文件中的SHA1重新去百度官网申请AK后再重新打包。
接下来给大家讲一下反编译的方法步骤:
1.下载反编译工具:dex2jar 下载地址:http://download.csdn.net/detail/baiyuliang2013/7801333
2.解压后如图:
3.将你混淆后的APK安装包由.apk改为.zip;
4.解压.zip,将其中的classes.dex文件提取出来放进dex2jar文件夹中,如图:
5.调出cmd命令,并定位到dex2jar文件夹位置,如图:
6.定位后,在cmd中输入:dex2jar.bat classes.dex,然后按enter键,如图:
7.此时你的dex2jar文件夹中会生成名为:classes.dex.dex2jar.jar的文件,使用jd-gui打开这个jar包即可查看混淆后的源码了,jd-gui下载地址:http://download.csdn.net/detail/baiyuliang2013/7801379
解决办法:
1.在proguard.cfg文件中,将反射用到的类中的变量不被混淆:
如:-keep public class com.byl.bean.Expressions { *; },表示Expressions 这个类及类中的所有变量及方法不被混淆,注意要写全路径;
2.过滤泛型:-keepattributes Signature
3.最重要的一点:保持R文件不被混淆,否则,你的反射是获取不到资源id的:-keep class **.R$* {*;}
补充一下:上个问题解决后,接下来又遇到了一个问题就是混淆后,地图无法正常使用了,博主使用的是百度地图,在proguard.cfg也已经写明了:
-keep class com.baidu.** {*;} -keep class vi.com.** {*;}
保持百度地图相关类不被混淆,但是地图仍然出错(只显示网格,无法搜索POI等),这是为什么呢?原因是,混淆前的SHA1和混淆后的SHA1不同,你使用的百度AK依然是混淆前申请的,所以用在混淆后的安装包里当然无法使用了,解决办法就是用混淆时所用的签名文件中的SHA1重新去百度官网申请AK后再重新打包。
接下来给大家讲一下反编译的方法步骤:
1.下载反编译工具:dex2jar 下载地址:http://download.csdn.net/detail/baiyuliang2013/7801333
2.解压后如图:
3.将你混淆后的APK安装包由.apk改为.zip;
4.解压.zip,将其中的classes.dex文件提取出来放进dex2jar文件夹中,如图:
5.调出cmd命令,并定位到dex2jar文件夹位置,如图:
6.定位后,在cmd中输入:dex2jar.bat classes.dex,然后按enter键,如图:
7.此时你的dex2jar文件夹中会生成名为:classes.dex.dex2jar.jar的文件,使用jd-gui打开这个jar包即可查看混淆后的源码了,jd-gui下载地址:http://download.csdn.net/detail/baiyuliang2013/7801379
相关文章推荐
- 安卓代码混淆与反射冲突,地图无法显示等问题解决及反编译方法
- 安卓代码混淆与反射冲突,地图无法显示等问题解决及反编译方法
- 关于注册Google Map api key的方法和解决网页无法显示的问题
- 解决无法显示桌面问题(描述 + 解决方法)
- Windows7农行网银页面无法显示问题的解决方法
- Android笔记:防反编译、代码混淆中,解决第三方jar包不被混淆的一些心得,及gson防混淆方法 推荐
- ArcEngine开发中Label无法显示小数点前0的问题解决方法
- VS2010使用C++/CLI编程窗口无法显示问题解决方法
- DSP builder组件在simulink中显示异常及无法显示问题的解决方法
- 2003_由于不可识别问题_windows无法显示windows防火墙设置解决方法
- 使用WinSCP 上传 jeecms 到linux centos中 显示乱码问题,网站无法使用的解决方法
- asp.net+FCKeditor上传图片显示叉叉图片无法显示的问题的解决方法
- vs2008与IIS 7.0使用在vista上时出现的问题及解决方法(Internet Explorer 无法显示该页面)(VS2008: IE Cannot Display Web Page)
- 崩溃,source Insight显示linux代码中文注释乱码问题,以及很傻很天真的解决方法
- 黄聪:wordpress向mysql字段中保存html代码(使用add_option()方法),然后无法显示出问题
- iis打开aspx文件时显示无法找到该页问题解决方法
- IIS无法显示中文名称图片问题的解决方法
- wordpress mu无法显示中文问题的解决方法
- video标签在安卓webview下无法自动播放问题的解决方法
- 在网页内无法显示Flash的问题的解决方法