• Android之ProGuard混淆器


      ProGuard是一个压缩、优化和混淆Java字节码文件的免费的工具,它可以删除无用的类、字段、方法和属性。可以删除没用的注释,最大限度地优化字节码文件。它还可以使用简短的无意义的名称来重命名已经存在的类、字段、方法和属性。这样做的结果是更小的jar、apk……,并且更难被反编译。

    Android的编译环境中已默认集成了Proguard,但只有在release模式下编译才会运行。此状态下,它会在用到ant release或是Eclipse的导出向导时,自动检查proguard.config属性是否已设置,如果设置了,ProGuard就会在打成包之前,自动处理程序的字节码。Debug模式下,之所以不触发,是因为混淆后的代码会使得调试变得更加累赘。

    准备工作:

    1、切换到release模式

      Eclipse默认的Java Compile环境是Debug模式,切换到release模式只需右击工程,选择属性,在“Properties for ProjectName”窗口中将“Java Compile”——>”Classfile Generation”中的debug选项去除,点击【Apply】,点【OK】关闭窗口即可生效。

    2、  准备keystore

      Android规定所有程序必须签名,否则就不会安装。所以在混淆打包过程中会有签名这一选项,此过程需要用到keystore。如果keystore已存在,或是在过程中ADT已经自动用keytool生成了,就不需要重新再生成了;如果没有的话,可用jdk/bin目录下的keytool自己生成一个,示例如下:

    Cmd代码  
    1. D:Program FilesJavajdk1.6.0_17in>keytool -genkey -alias android.keystore -keyalg RSA -validity 20000 -keystore android.keystore  

      其中参数-validity为证书有效天数,这里我们写的大些10000天。还有在输入密码时没有回显(尽管输就是啦) 并且 退格,tab等都属于密码内容,这个密码在给.apk文件签名的时候需要.

    设置proguard.config属性:

             在创建Android工程时,proguard.cfg文件会在根目录自动被创建,该文件定义了ProGuard如何优化和混淆代码。其默认的配置只覆盖了一些通用的情况,但也满足了基本的需求;如需深入定制,还需参考相关的配置文档。

             默认情况下,proguard.config属性是未被设置的,如需启用,则在工程根目录下的default.properties文件中设置,其路径可以是相对路径或是绝对路径。

    书写形式如可以是这样的:

    Default.properties代码  收藏代码
    1. proguard.config=proguard.cfg  

    也可以将proguard.cfg文件放到别处,然后指定路径:

    Default.properties代码  收藏代码
    1. proguard.config=/path/to/proguard.cfg  

    混淆打包:

    在release模式下,有如下几种导出方式:

    1、右击工程->android tools->export signed android package生成签名的包,

    2、右击工程——>Export选择导出类型

    3、ant release

    混淆成功后,除生成了指定类型的混淆包外,还会在工程的根目录下或是根目录下得bin文件夹中生成proguard文件夹,里面包含dump.txt、mapping.txt、seeds.txt和usage.txt四个文件。

    dump.txt  //描述.apk文件中所有类文件间的内部结构

    mapping.txt //列出了原始的类,方法和字段名与混淆后代码间的映射。这个文件很重要,当你从release版本中收到一个bug报告时,可以用它来翻译被混淆的代码。

    seeds.txt  //列出了未被混淆的类和成员

    usage.txt  //列出了从.apk中删除的代码

    配置 ProGuard:

    一些情况下,proguard.cfg文件中的默认配置就足够了。然而,有些情况ProGuard也很难正确分析,它可能会删除它认为不用的代码,但实际上正是你的程序所需要的。

    例如:

    只在AndroidManifest.xml文件中引用的类

    由JNI调用的方法

    动态引用的字段和方法

    默认的proguard.cfg文件努力去覆盖通用的情况,但有可能你会遇到如ClassNotFoundException这样的异常,而这正好是由于ProGuard移除了整个类造成的。

    你可以修正由于ProGuard移除代码造成的错误,只需要在proguard.cfg文件中添加一行“-keep”。例如:

    Java代码  收藏代码
    1. -keep public class <MyClass>  

    使用-keep选项时,有一些选项和建议,因此,强烈建议你阅读ProGuard手册来了解更多关于定制配置文件的信息。“Overview of Keep options”和“Examples section”将非常有用

  • 相关阅读:
    JetBrains Rider 在 Mac 环境下将 cs 文件生成 exe
    Unity3d 控制物体移动、旋转、缩放
    Unity3d 脚本使用规则
    Unity3D 脚本模板修改方法
    Intelli IDEA 设置项目编码(Mac)
    搭建LayaBox的生产环境,并helloWorld
    unity Lighting
    流畅度测试
    Failure [INSTALL_FAILED_USER_RESTRICTED: Install canceled by user]
    Unity GUI(uGUI)使用心得与性能总结
  • 原文地址:https://www.cnblogs.com/DswCnblog/p/4503204.html
Copyright © 2020-2023  润新知