【转】ProGuard的作用、使用及bug分析

原文地址:http://blog.csdn.net/forlong401/article/details/23539123.

http://www.trinea.cn/android/proguard-use/

本文主要ProGuard的作用、使用及bug分析。
1、ProGuard作用
ProGuard通过删除无用代码,将代码中类名、方法名、属性名用晦涩难懂的名称重命名从而达到代码混淆、压缩和优化的功能,跟JavaScript的混淆压缩类似。
压缩和优化使得编译后apk包更小。
混淆可以保证代码在被反编译后读懂的难度很大,防止逆向工程。这点也是我们在应用发布前需要ProGuard的一大原因。

2、ProGuard的使用
(1). 系统应用:

在项目根目录下的Android.mk文件中添加

XHTML

LOCAL_PROGUARD_FLAG_FILES := proguard.cfg
LOCAL_PROGUARD_ENABLED := full

1

2

LOCAL_PROGUARD_FLAG_FILES := proguard.cfg

LOCAL_PROGUARD_ENABLED := full

这样应用不需要单独设置proguard配置文件,在系统编译时会采用系统统一的proguard.cfg对该应用进行proguard,系统proguard.cfg位于系统根目录\build\core内。

(2). 非系统应用:
a. 打开ProGuard开关

在项目根目录下的project.properties文件中配置proguard,添加如下代码:

XHTML

proguard.config=proguard.cfg

1

proguard.config=proguard.cfg

这样在release模式下打包apk之前,proguard会以proguard.cfg为规则处理应用字节码。关于release模式下面第c部分会进行介绍

b. 编写自己的proguard config文件
默认会对所有代码混淆,如果需要部分混淆,可以自己修改proguard.cfg文件
关于proguard config的语法及标准配置可见:Proguard语法及常用proguard.cfg代码段

注意下列类不能进行混淆:
(1)、反射用到的类
(2)、在AndroidManifest中配置的类(Activity、Service等的子类及Framework类默认不会进行混淆)
(3)、Jni中调用的类

c. 运行ProGuard及其生成的文件介绍
在以release模式下打包apk时会自动运行ProGuard,这里的release模式指的是通过ant release命令或eclipse project->android tools->export signed(unsigned) application package生成apk。在debug模式下为了更快调试并不会调用proguard。

如果是ant命令打包apk,proguard信息文件会保存于<project_root>/bin/proguard文件夹内;如
果用eclipse export命令打包,会在<project_root>/proguard文件夹内。其中包含以下文件:

mapping.txt表示混淆前后代码的对照表,这个文件非常重要。如果你的代码混淆后会产生bug的话,log提示中是混淆后的代码,希望定位到源代码的话就可以根据mapping.txt反推。
dump.txt描述apk内所有class文件的内部结构
seeds.txt列出了没有被混淆的类和成员
usage.txt列出了源代码中被删除在apk中不存在的代码

下图为mapping.txt部分内容,以及混淆前后的代码对比:

从中可以看出混淆后代码大多abcdefg..

注意:养成保存mapping.txt的习惯。ProGuard会在每次运行时覆盖原来的文件,所以每次发布请保存mapping.txt,方便该版本出现问题时调出日志进行排查。mapping.txt可以根据版本号或是发布时间命名来保存或是放进代码版本控制中。

d. ProGuard是否成功检查

可以通过反编译Apk检查proguard是否成功,如果成功代码会类似上面的截图,大部分类名及成员名都是形如a.b.c…。关于反编译请参考:Android
Apk 反编译

3、ProGuard混淆后bug分析
(1) 代码本身bug

混淆后bug提示信息中代码都是混淆后代码,类a. b. c…,如果需要排查,就得根据mapping.txt文件去反推实际代码中对应的代码段从而解决问题
PS:混淆后代码中的$表示匿名内部类,根据代码中顺序依次为OutClassName$1, OutClassName$2

(2) 因混淆而产生的bug
应用可能会因为ProGuard混淆了不该混淆的代码而产生一些bug,其中最常见的就是ClassNotFoundException,还有BadParcelableException等
对于ClassNotFoundException,根据mapping.txt文件反推找到某个类,然后在proguard.cfg中不进行混淆即可

Java

-keep class packagename.classname { *; }

1

-keep class packagename.classname { *; }

对于android.os.BadParcelableException: Parcelable protocol requires a Parcelable.Creator object called CREATOR,proguard.cfg中添加

Java

-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}

1

2

3

-keep class * implements android.os.Parcelable {

public static final android.os.Parcelable$Creator *;

}

对于android.support.v4  can’t find superclass or interface,can’t find referenced method,proguard.cfg中添加

Java

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

1

2

3

4

-libraryjars   libs/android-support-v4.jar

-dontwarn android.support.v4.**

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

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

proguard混淆后其他问题可见:http://proguard.sourceforge.net/index.html#manual/troubleshooting.html

你可能还感兴趣:

Proguard语法及常用proguard.cfg代码段

Android性能调优总结

Android系统下载管理DownloadManager功能介绍及使用示例

Android下载管理DownloadManager功能增强和bug修改

时间: 2024-10-27 08:00:32

【转】ProGuard的作用、使用及bug分析的相关文章

ProGuard的作用、使用及bug分析(转载)

ProGuard的作用.使用及bug分析 本文主要ProGuard的作用.使用及bug分析.1.ProGuard作用ProGuard通过删除无用代码,将代码中类名.方法名.属性名用晦涩难懂的名称重命名从而达到代码混淆.压缩和优化的功能,跟JavaScript的混淆压缩类似.压缩和优化使得编译后apk包更小.混淆可以保证代码在被反编译后读懂的难度很大,防止逆向工程.这点也是我们在应用发布前需要ProGuard的一大原因. 2.ProGuard的使用(1). 系统应用:在项目根目录下的Android

ProGuard的作用、使用及bug分析

本文主要ProGuard的作用.使用及bug分析. 1.ProGuard作用ProGuard通过删除无用代码,将代码中类名.方法名.属性名用晦涩难懂的名称重命名从而达到代码混淆.压缩和优化的功能,跟JavaScript的混淆压缩类似.压缩和优化使得编译后apk包更小.混淆可以保证代码在被反编译后读懂的难度很大,防止逆向工程.这点也是我们在应用发布前需要ProGuard的一大原因. 2.ProGuard的使用(1). 系统应用:在项目根目录下的Android.mk文件中添加 XHTML 1 2 L

推荐一款Java代码Bug分析插件 FindBugs

findBugs是一个能静态分析源代码中可能会出现Bug的Eclipse插件工具. 下载之后,把解冻后的文件拷贝到 $ECLIPSE_HOME/plugins/目录下,重新启动eclipse即完成安装. FindBugs的设置: 安装好之后,可以通过 Projects > Property > FindBugs标签对其进行设置.设置方法可以根据自己的需要进行调整. 另外在 问题(Proplems)列表窗口(Windows > 视图 > 问题)的Filter设置里,把FindBugs

协议解析Bug分析

协议解析Bug分析 源自邮件协议RPC(远程过程调用)处理的Request请求数据包的bug.        一.Bug描述 腾讯收购的Foxmail客户端可以作为outlook客户端的替代品与Exchange服务端进行交互完成邮件收发.而我们所要做的就是让邮件经过我们代理的优化处理. 这时候问题来了,Outlook客户端经由我们代理没有任何问题:但是换成Foxmail就会有错误弹窗,错误号:0x000006BE.但是如果不经过代理,Foxmail收发邮件一切正常. 很明显,是代理出了问题.  

文《关于c++与java中文乱码问题分析与解决》中一个bug分析

文<关于c++与java中文乱码问题分析与解决>中一个bug分析 DionysosLai([email protected]) 2014/10/21 在前几篇一博客<关于c++与java中文乱码问题分析与解决>,地址如下:http://blog.csdn.net/dionysos_lai/article/details/38389765.文中详细介绍了c++与java数据传递时,为何会出现中文乱码的原因,并提出了适当的解决方法.方法如下: int CCDirector::GBKTo

文《左右c++与java中国的垃圾问题的分析与解决》一bug分析

文<左右c++与java中国的垃圾问题的分析与解决>一bug分析 DionysosLai([email protected]) 2014/10/21 在前几篇一博客<关于c++与java中文乱码问题分析与解决>.地址例如以下:http://blog.csdn.net/dionysos_lai/article/details/38389765.文中具体介绍了c++与java数据传递时.为何会出现中文乱码的原因,并提出了适当的解决方法. 方法例如以下: int CCDirector::

【真人众测报告解读】玩家反馈BUG分析

TestBird真人众测报告加入了全新的玩家反馈BUG分析,是针对自动化兼容性测试的一个真人补充分析.这一板块由三个部分组成,它们分别是BUG严重程度分类视图.具体BUG列表.手游测试经理建议三个方面.今天我们来详细介绍着三个方面吧! BUG严重程度分类视图 为了让开发者清晰看出各类BUG的分布情况,TestBird众测报告提供了BUG严重程度分类视图.试图将BUG严重程度分为致命.严重.普通.轻微四个等级,并以圆饼图的形式呈现.简洁明了,方便开发者了解游戏的BUG概况. 具体BUG列表 了解概

Bug预防体系(上千bug分析后总结的最佳实践)

Bug预防体系(上千bug分析后总结的最佳实践) 原创 2017-08-16俞美玲 光荣之路 吴老的<selenium webdriver 实战宝典>出版了!  web常见产品问题及预防 测试人员在每次版本迭代中,会对项目的整体质量有一个把控,对于项目常见的问题,开发经常犯的错误都会有所了解,为了避免或者减少这样的错误或不规范的事情在发生,测试人员可以整理构建属于产品的bug预防体系,总结项目经常出现bug的种类.位置.以及可以提出针对性的规避措施,提高产品质量. 1. 分辨率兼容性 Ø  产

Java代码Bug分析插件-FindBugs

FindBugs是什么? FindBugs是在Java程序找到bug的一种静态分析工具.它通过检查类或者JAR文件,将字节码与一组缺陷模式进行对比以发现可能的问题.有了静态分析工具,就可以在不实际运行程序的情况对软件进行分析,发现一些人工很难发现的潜在隐患问题. 2. 怎样安装FindBugs? FindBugs插件可以很好地与Eclipse进行集成,从FindBugs官网下载FindBugs插件,目前最新的版本为3.0,下载后将解压后的文件(如edu.umd.cs.findbugs.plugi