Android代码混淆及调试错误「建议收藏」

Android代码混淆及调试错误「建议收藏」Android代码混淆及调试错误

大家好,又见面了,我是你们的朋友全栈君。

Android代码混淆及调试错误

 

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

 

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

 

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

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

 Android代码混淆及调试错误「建议收藏」

选择导出的项目, 下一步

Android代码混淆及调试错误「建议收藏」

 

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

 Android代码混淆及调试错误「建议收藏」

填写相应信息

 Android代码混淆及调试错误「建议收藏」

 

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

Android代码混淆及调试错误「建议收藏」

 

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

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

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

Android代码混淆及调试错误「建议收藏」 

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

Android代码混淆及调试错误「建议收藏」

 

这是我的配置

Android代码混淆及调试错误「建议收藏」

 

 

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

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

Android代码混淆及调试错误「建议收藏」

于是我顺着

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

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

 Android代码混淆及调试错误「建议收藏」

 

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

-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应用程序

Android代码混淆及调试错误「建议收藏」

 

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

 Android代码混淆及调试错误「建议收藏」

Android代码混淆及调试错误「建议收藏」

 

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

Android代码混淆及调试错误「建议收藏」

 

 

 

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好像识别不出来)。

Android代码混淆及调试错误「建议收藏」

 Android代码混淆及调试错误「建议收藏」

 

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/139184.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux内核启动流程(文章最后流程图)

    linux内核启动流程(文章最后流程图)原文:linux内核启动流程本文以Linux3.14版本源码为例分析其启动流程。各版本启动代码略有不同,但核心流程与思想万变不离其宗。内核映像被加载到内存并获得控制权之后,内核启动流程开始。通常,内核映像以压缩形式存储,并不是一个可以执行的内核。因此,内核阶段的首要工作是自解压内核映像。内核编译生成vmliunx后,通常会对其进行压缩,得到zImage(小内核,小于512KB)或bzI…

    2022年7月23日
    14
  • java 类加载路径_java动态创建类并加载到jvm

    java 类加载路径_java动态创建类并加载到jvm本文转载自http://blog.csdn.net/xyang81/article/details/7292380一、什么是ClassLoader?         大家都知道,当我们写好一个Java程序之后,不是管是CS还是BS应用,都是由若干个.class文件组织而成的一个完整的Java应用程序,当程序在运行时,即会调用该程序的一个入口函数来调用系统的相关功能,而这些功能都被封装在

    2022年8月11日
    5
  • WPF 布局控件 之 WrapPanel[通俗易懂]

    WPF 布局控件 之 WrapPanel[通俗易懂]StatickPanel就是将子元素按照堆栈的形式一一排列,通过设置面板的Orientation属性设置了两种排列方式:横排(Horizontal默认的)和竖排(Vertical)。纵向的StatickPanel默认每个元素宽度与面板一样宽,反之横向亦然。如果包含的元素超过了面板空间,它只会截断多出的内容。元素的Margin属性用于使元素之间

    2022年7月23日
    9
  • 发现C++Builder 2010一组类BUG

    发现C++Builder 2010一组类BUG

    2022年1月16日
    42
  • 同步锁-线程安全问题解决方案「建议收藏」

    同步锁-线程安全问题解决方案「建议收藏」1同步锁1.1前言经过前面多线程编程的学习,我们遇到了线程安全的相关问题,比如多线程售票情景下的超卖/重卖现象.上节笔记点这里-进程与线程笔记我们如何判断程序有没有可能出现线程安全问题,主要有以下三个条件:在多线程程序中+有共享数据+多条语句操作共享数据多线程的场景和共享数据的条件是改变不了的(就像4个窗口一起卖100张票,这个是业务)所以思路可以从第3点”多条语句操作共享数据”入手,既然是在这多条语句操作数据过程中出现了问题那我们可以把有可能出现问题的代码都包裹起来,一次只让一

    2022年7月15日
    13
  • python学生管理系统代码_用python写学生管理系统

    python学生管理系统代码_用python写学生管理系统这几天开始接触了python语言,这语言相对c语言简洁了不少,语言真是一通百通,学起来还是比较轻松,在熟悉了基本语法,列表(序列),元组以及字典之后写了一个最基础简单的的学生管理系统能完成的功能有:学生管理系统 v1.0 1.添加学生的信息 2.删除学生的信息 3.修改学生的信息 4.查询学生的信息 5.遍历所有学生的信息 6.退出系统学生信息中,

    2022年9月20日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号