Android代码混淆及调试错误

Android代码混淆及调试错误

 

以下是自己实践代码混淆的步骤,记录下来免得以后忘了

 

代码混淆需要对apk进行签名,签名后才是混淆过的(前提是已经放开代码混淆配置,详见以下步骤),直接从eclipse项目bin下拷贝的apk是没有进行混淆的。

 

1.    创建签名秘钥(我用的是eclipse,用UI创建签名秘钥,网上也有用命令方式创建的)

在eclipse自己的项目中右键,选择Export,选择Export Android Application,点击下一步

 



选择导出的项目, 下一步


 

创建个新的签名秘钥, 记住密码及存储位置

 



填写相应信息

 

 

填写签名后输出的文件,点击finish完成


 

2.    放开混淆及配置混淆脚本

新建的android项目都带有project.properties及proguard-project.txt

文件。默认是不混淆代码的。

 



把project.properties文件中”#proguard.config=…”的#去掉,即放开代码混淆,=号后的路径改成自己项目路径


 

这是我的配置

 

 

接下来就是更改混淆配置文件了(proguard-project.txt)

在eclipse中新建项目自带的混淆配置文件如下:基本上为空



于是我顺着

${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt

在Android SDK路径下拷贝了个proguard-project.txt,替换了自带的(挺全)

 

 

       然后网上查了半天:再加入下边这些配置

-dontpreverify

 

 

-ignorewarnings 

-libraryjars libs/android-support-v4.jar

-dontwarn android.support.v4.**

-keep class android.support.v4.** { *; }

-keep interface android.support.v4.app.** {*; }

-keep public class * extendsandroid.support.v4.**

-keep public class * extendsandroid.app.Fragment

 

 

-dontwarn com.alibaba.fastjison.**

 

#用于在模拟器中运行加密后apk时,出错情况在Logcat下显示源代码行号

-renamesourcefileattribute SourceFile

-keepattributes SourceFile,LineNumberTable

 

-libraryjars libs/fastjson-1.1.41.jar

-libraryjars libs/mframework.jar

-libraryjars libs/ShareSDK-Core-2.5.8.jar

-libraryjars libs/ShareSDK-QQ-2.5.8.jar

-libraryjars libs/ShareSDK-QZone-2.5.8.jar

-libraryjarslibs/ShareSDK-ShortMessage-2.5.8.jar

-libraryjarslibs/ShareSDK-SinaWeibo-2.5.8.jar

-libraryjarslibs/ShareSDK-TencentWeibo-2.5.8.jar

-libraryjars libs/ShareSDK-Wechat-2.5.8.jar

-libraryjarslibs/ShareSDK-Wechat-Core-2.5.8.jar

-libraryjarslibs/ShareSDK-Wechat-Moments-2.5.8.jar

-libraryjars libs/xcl-charts.jar

 

-keep class com.alibaba.fastjson.**{*;}

-keep class org.xclcharts.**{*;}

-keep class cn.sharesdk.**{*;}

-keep class com.xxxxx.android.entity.**{*;}

-keepattributes Signature

 

用到的第三方库用-libraryjars声明,并且-keep声明不混淆这第三方库,还有就是用到的javabean类最好别混淆(我全放开了-keep class com.xxxxx.android.entity.**{*;}),还有-keepattributes Signature可以保持javabean类中的容器类型成员在混淆后,依然保持原样。如:

原始代码:

public classChartEntity {

       private String  chartTitle;              //图表标题

       private String  chartSubTitle;      //图表子标题

       private int       chartType;        //图表类型

       private ArrayList<String> labels; 

       private ArrayList<DataSeries>series;      

       private double  totalMaxData;

       private double  totalMinData;

}

 

没加-keepattributesSignature混淆后:

public classChartEntity {

       private String  chartTitle;              //图表标题

       private String  chartSubTitle;      //图表子标题

       private int       chartType;        //图表类型

       private ArrayList    labels;      

       private ArrayList    series;      

       private double  totalMaxData;

       private double  totalMinData;

}

类型不见了,在转换的时候,以至于程序奔溃了。(我是这么解决的,不知道还有其他办法解决javabean类混淆后程序类型转换时报错)

 

 

3.     签名并混淆

一开始自己并不知道放开哪些类(即保持哪些类不混淆),反正签名混淆后,一步一步调出来的(详见步骤4)。

配置好混淆脚本后

在eclipse项目上右键---export,选择导出android应用程序

 


选择上边建立的keystore,输入密码,下一步

 



 

最后finish即可,签完名后的就是混淆后的,用反编译工具试了,确实混淆了。

 

 

 

4.     混淆后排错

网上查了半天,不知道怎么混淆后排错。以下是我的办法,不知道别人是怎么混淆后调试的。

 

安装混淆后的apk至模拟器,在logcat里查错。

打开eclipse, 开启一个模拟器,并将混淆后的apk放置Android SDK的platform-tools路径下(C:\android-sdk-windows\platform-tools),在cmd下执行命令:adbinstall xxxx.apk进行安装,安装后,运行app即可,如果程序报错,应该在logcat中有输出,但是输出的是混淆后的信息。

混淆后在eclipse下会多出proguard目录,里边有混淆的映射关系记录,利用SDK自带的工具proguardgui.bat(C:\android-sdk-windows\tools\proguard\bin),可以将logcat下出错堆栈信息翻译成源码情况下的堆栈信息。Logcat下信息可以多选,上边有导出按钮(将出错信息前的时间去掉,不然proguardgui好像识别不出来)。


 

 

我就是这样一步步排错的。估计还有更好的办法吧!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值