大家好,又见面了,我是你们的朋友全栈君。
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-windowsplatform-tools),在cmd下执行命令:adbinstall xxxx.apk进行安装,安装后,运行app即可,如果程序报错,应该在logcat中有输出,但是输出的是混淆后的信息。
混淆后在eclipse下会多出proguard目录,里边有混淆的映射关系记录,利用SDK自带的工具proguardgui.bat(C:android-sdk-windowstoolsproguardbin),可以将logcat下出错堆栈信息翻译成源码情况下的堆栈信息。Logcat下信息可以多选,上边有导出按钮(将出错信息前的时间去掉,不然proguardgui好像识别不出来)。
我就是这样一步步排错的。估计还有更好的办法吧!
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/139184.html原文链接:https://javaforall.cn