zoukankan      html  css  js  c++  java
  • 【转】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文件中添加

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

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

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

    这样在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中不进行混淆即可

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

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

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

    你可能还感兴趣:

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

    Android性能调优总结

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

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

  • 相关阅读:
    周总结13
    周总结11
    《程序员的自我修养》阅读笔记四
    周总结10
    数据导入hive仓库
    周总结9
    《程序员的自我修养》阅读笔记三
    《软件需求》读书笔记四
    《软件需求》读书笔记三
    《软件需求》读书笔记二
  • 原文地址:https://www.cnblogs.com/liangstudyhome/p/4825479.html
Copyright © 2011-2022 走看看