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. Sentry UDFWhiteList bug分析

    Sentry UDFWhiteList bug分析 1 简介 此手册应用于row_number.unbase64.windowingtablefunction在开启sentry后不能执行的bug分析. ...

  2. phpcmsV9导航栏目点击跳转始终是localhost首页 bug - 分析篇

    文章目录 发现点哪个栏目却都跳到了localhost首页! 一开始,我以为?是因为在后台给栏目添加设置了show模板? 后来发现,并不是我想的那样.在后台多更新了几次各种缓存,浏览器多Ctrl+F5刷 ...

  3. 最近一个快要结束的项目的BUG分析

    "当Bug跟踪系统上所有的bug都被打上Closed后,你是否感到如释重负.当项目成功交付后你是否感到大脑进入了"冬眠"期,上网,聊天,写自己感兴趣的小程序,但是对于上个 ...

  4. 软件测试Bug,你是怎么找bug的?bug分析的正确打开方式......

    目录:导读 前言 一. bug详细 二.获取bug具体数据 三.有效的管理bug 四.做好bug分析工作 五.深入bug分析 六.总结 前言 Bug严重级别(Severity,Bug级别):是指因缺陷 ...

  5. 半年萌新对BUG分析和理解

    BUG分析和总结 这是我写的第一篇文章,希望多大家有所帮助 本人萌新一个目前身处一个小公司.公司的项目今天终于完成了,在工作中遇到了各种各样的bug,有简单的,有困难的,不过更多的是各种粗心大意的bu ...

  6. ProGuard的作用

    ProGuard的作用   1.创建紧凑的代码文档是为了更快的网络传输,快速装载和更小的内存占用.  2.创建的程序和程序库很难使用反向工程.  3.所以它能删除来自源文件中的没有调用的代码  4.充 ...

  7. html+css技巧分享和IE6典型BUG分析(重温一下)

    上个星期六,给公司的一些童鞋,做了一次分享, 分享的主题是HTMl+css开发技巧 为此一个星期都没有怎么做项目,准备了一个3dppt,也就是impress.js插件, 每种类型也做了一个例子,, 讲 ...

  8. bug分析报告模模版

    bug分析报告 ---关于XXXXbug分析 一.缺陷问题详细描述 详细描述下bug,测试环境.是否必现.哪个模块 例子:版本更新后,服务器在早上9点时,部分服务器出现提示在线人数已满,请稍后登录的信 ...

  9. 软件测试无效bug分析,(一)Bug不能重现的原因分析及其对策

    摘 要:本文简要分析了无法重现的Bug的可能产生原因,包括环境不一致.缺少最准确的描述和浏览器的不当设置.针对这些原因,本文给出了相应的对策.通过这些措施,可以重现许多以前认为不可重现的Bug. 关键 ...

最新文章

  1. java criteria限制条数_java架构—Oracle SQL性能优化
  2. 掌握 MySQL 这 19 个骚操作,效率至少提高3倍
  3. Redis cluster日常管理【二】
  4. 会计转行SAP FICO实施顾问,百万年薪等你来挑战!
  5. 为什么要自学python_为什么那么多自学Python的后来都放弃了,总结起来就这些原因...
  6. Leecode刷题热题HOT100(3)——无重复字符最长子串
  7. SuseLinux详解(2)——网络设置静态IP 网关 DNS的方法
  8. python与java前景-Java和Python现在都很热门,哪个更有前途?
  9. 高性能相关----爬虫
  10. Python基础10—I/O编程
  11. 投融资项目入门和总结
  12. 【自然语言处理(NLP)】基于FNN网络的电影评论情感分析
  13. 耶鲁大学开放课程:《金融市场》第3课
  14. 光猫、交换机、路由器三者的区别在哪里?如何选择?
  15. 01_安卓APP开发流程概览
  16. 通孔焊盘命名规范-002
  17. 悲观锁和乐观锁的区别,怎么实现
  18. 大数据江湖之即席查询与分析(上篇)--即席查询与分析的前世今生
  19. Error 1053: The service did not respond to the start or control request in a timely fashion.问题排查
  20. 微软春天发布活动将聚焦在Windows 10云版

热门文章

  1. 电气工程及其自动化选题推荐
  2. python3.4.4下载安装教程_python 环境搭建 及python-3.4.4的下载和安装过程
  3. 揭秘TVS管是否能替代稳压二极管吗?
  4. ic卡读写器有哪些分类?如何使用ic卡读写器?
  5. esp32 cam接入homekit苹果家庭app
  6. Assertion `index >= -sizes[i] index < sizes[i] “index out of bounds“` failed
  7. Pascal正常血压
  8. 【软考——系统架构师】架构、系分、软设的区别和联系
  9. StarUML for Mac的安装与破解
  10. 字幕剪切视频神器AutoCut的安装和使用