原文地址: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修改

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

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

    ProGuard的作用.使用及bug分析 本文主要ProGuard的作用.使用及bug分析.1.ProGuard作用ProGuard通过删除无用代码,将代码中类名.方法名.属性名用晦涩难懂的名称重命名 ...

  2. 关于bug分析与异常处理的一些思考

    前言:工作三年了,工作内容主要是嵌入式软件开发和维护,用的语言是C,毕业后先在一家工业自动化控制公司工作两年半,目前在一家医疗仪器公司担任嵌入式软件开发工作.软件开发中,难免不产生bug:产品交付客户 ...

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

    文<左右c++与java中国的垃圾问题的分析与解决>一bug分析 DionysosLai(906391500@qq.com) 2014/10/21 在前几篇一博客<关于c++与jav ...

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

    Bug预防体系(上千bug分析后总结的最佳实践) 原创 2017-08-16俞美玲 光荣之路 吴老的<selenium webdriver 实战宝典>出版了!  web常见产品问题及预防 ...

  5. 线上bug分析

    昨天下午大神把组内几十号人召集在一起开Online bug分析大会,主要是针对近期线上事故从事故原因和解决方案两个维度来分析. 对金融软件来说,每一次的线上事故都有可能给公司带来重大的损失,少扣了用户 ...

  6. 协议解析Bug分析

    协议解析Bug分析 源自邮件协议RPC(远程过程调用)处理的Request请求数据包的bug.        一.Bug描写叙述 腾讯收购的Foxmailclient能够作为outlookclient ...

  7. Oracle字符乱码、数据越界訪问典型Bug分析

    Oracle字符乱码.数据越界訪问典型Bug分析 前言:           作为乙方,在甲方客户那里验收阶段发现两个诡异Bug. 下面就问题来源.问题根因.解决方式.怎样避免做具体描写叙述. .且两 ...

  8. 从BUG工具redmine上获取数据后借助python模块pycha 画出BUG分析类报表

    整体代码比较冗长,但是很好读.写的方法全是按照BUG分类去写的.所以写死了,凑合看吧,画出饼图,树状图和生成对应的数据excel,希望大家举一反三能帮助自己分析BUG #__author__ = 'x ...

  9. MCU晶体旁边电容的作用及振荡电路的分析

    绝大多数的MCU爱好者对MCU晶体两边要接一个22pF附近的电容不理解,因为这个电容有些时候是可以不要的.参考很多书籍,讲解的很少,往往提到最多的是起稳定作用,负载电容之类的话,都不是很深入理论的分析 ...

随机推荐

  1. 学习笔记之C++入门到精通(名师教学·手把手教会)【职坐标】_腾讯课堂

    C++入门到精通(名师教学·手把手教会)[职坐标]_腾讯课堂 https://ke.qq.com/course/101465#term_id=100105503 https://github.com/ ...

  2. 20181123_控制反转(IOC)和依赖注入(DI)

    一.   控制反转和依赖注入: 控制反转的前提, 是依赖倒置原则, 系统架构时,高层模块不应该依赖于低层模块,二者通过抽象来依赖 (依赖抽象,而不是细节) 如果要想做到控制反转(IOC), 就必须要使 ...

  3. [saiku] schema文件分析

    上一篇讲到了如何在管理台配置数据源 [ http://www.cnblogs.com/avivaye/p/4877767.html ] 这次来说明下shema文件里面是怎样配置Cube和角色权限的 通 ...

  4. POI导出Excel和InputStream存储为文件

    POI导出Excel和InputStream存储为文件   本文需要说明的两个问题 InputStream如何保存到某个文件夹下 POI生成Excel POI操作utils类 代码如下.主要步骤如下: ...

  5. python推荐书籍

    推荐的python电子书 python学习路线图 优先级 入门:python核心编程 提高:python cookbook 其他 (1).数据分析师 需要有深厚的数理统计基础,但是对程序开发能力不做要 ...

  6. MPI 并行奇偶交换排序 + 集合通信函数 Sendrecv() Sendvecv_replace()

    ▶ <并行程序设计导论>第三章的例子程序 ● 代码 #include <stdio.h> #include <mpi.h> #include <stdlib. ...

  7. 「小程序JAVA实战」小程序的留言和评价功能(70)

    转自:https://idig8.com/2018/10/28/xiaochengxujavashizhanxiaochengxudeliuyanhepingjiagongneng69/ 目前小程序这 ...

  8. IOS上架截屏 屏幕快照

    IOS上架截屏,屏幕快照,4种屏幕尺寸,每种尺寸5张软件功能截图. 大小等于对应设备的屏幕的像素大小.使用模拟器,command +s截图就可以了虚拟机里的手机截屏就保存在mac 桌面上了.jpg,p ...

  9. tensorflow 基本函数(1.tf.split, 2.tf.concat,3.tf.squeeze, 4.tf.less_equal, 5.tf.where, 6.tf.gather, 7.tf.cast, 8.tf.expand_dims, 9.tf.argmax, 10.tf.reshape, 11.tf.stack, 12tf.less, 13.tf.boolean_mask

    1.  tf.split(3, group, input)  # 拆分函数    3 表示的是在第三个维度上, group表示拆分的次数, input 表示输入的值 import tensorflow ...

  10. 在制MO未取到FP

    原因:今天在制MO未取进去原因为业务人员维护验货客户尾缀时维护ZZ导致,需更新为C开头即可 SELECT * FROM IN_SFCHEADER WHERE MO_ID in('00110051832 ...