引用:http://www.linuxidc.com/Linux/2012-04/58952.htm


无混淆的基本语句:

-useuniqueclassmembernames
-dontshrink
-dontusemixedcaseclassnames
-dontoptimize
-ignorewarnings
-verbose

-dontwarn org.*

-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod

-keep public class *
-keep class org.* {*; }


-keep class **.R$* {
*;
}


-keep class **.$* {
*;
}


-keepclasseswithmembernames class * {
public <methods>;
public <fields>;
}


-keepclasseswithmembernames class * {
public <methods>;
private <methods>;
protected <methods>;
public <fields>;
private <fields>;
protected <fields>;
}


proguard 原理

Java代码编译成二进制class 文件,这个class 文件也可以反编译成源代码 ,除了注释外,原来的code 基本都可以看到。为了防止重要code 被泄露,我们往往需要混淆(Obfuscation code , 也就是把方法,字段,包和类这些java 元素的名称改成无意义的名称,这样代码结构没有变化,还可以运行,但是想弄懂代码的架构却很难。 proguard 就是这样的混淆工具,它可以分析一组class 的结构,根据用户的配置,然后把这些class 文件的可以混淆java 元素名混淆掉。在分析class 的同时,他还有其他两个功能,删除无效代码(Shrinking 收缩),和代码进行优化 (Optimization Options)。

缺省情况下,proguard 会混淆所有代码,但是下面几种情况是不能改变java 元素的名称,否则就会这样就会导致程序出错。

一, 我们用到反射的地方。

二, 我们代码依赖于系统的接口,比如被系统代码调用的回调方法,这种情况最复杂。

三, 是我们的java 元素名称是在配置文件中配置好的。

所以使用proguard时,我们需要有个配置文件告诉proguard 那些java 元素是不能混淆的。

proguard 配置最常用的配置选项

-dontwarn 缺省proguard 会检查每一个引用是否正确,但是第三方库里面往往有些不会用到的类,没有正确引用。如果不配置的话,系统就会报错。

-keep 指定的类和类成员被保留作为 入口 。

-keepclassmembers 指定的类成员被保留。

-keepclasseswithmembers 指定的类和类成员被保留,假如指定的类成员存在的话。


proguard 问题和风险代码混淆后虽然有混淆优化的好处,但是它往往也会带来如下的几点问题

1,混淆错误,用到第三方库的时候,必须告诉 proguard 不要检查,否则proguard 会报错。

2,运行错误,当code 不能混淆的时候,我们必须要正确配置,否则程序会运行出错,这种情况问题最多。

3,调试苦难,出错了,错误堆栈是混淆后的代码 ,自己也看不懂。


为了防止混淆出问题,你需要熟悉你所有的code ,系统的架构 ,以及系统和你code的集成的接口,并细心分析。 同时你必须需要一轮全面的测试。 所以混淆也还是有一定风险的。 为了避免风险,你可以只是混淆部分关键的代码,但是这样你的混淆的效果也会有所降低。


常见的不能混淆的AndroidCodeAndroid 程序 ,下面这样代码混淆的时候要注意保留。

Android系统组件,系统组件有固定的方法被系统调用。

被AndroidResource 文件引用到的。名字已经固定,也不能混淆,比如自定义的View 。

AndroidParcelable ,需要使用android 序列化的。

其他Anroid 官方建议 不混淆的,如

Android.app.backup.BackupAgentHelper
Android.preference.Preference
com.Android.vending.licensing.ILicensingService
Java序列化方法,系统序列化需要固定的方法。

枚举 ,系统需要处理枚举的固定方法。

本地方法,不能修改本地方法名

annotations 注释

数据库驱动

有些resource 文件

用到反射的地方


如何实施现在的系统已经配置为混淆时候会保留

Android系统组件

自定义View

AndroidParcelable

AndroidR 文件

AndroidParcelable

枚举

各个开发人员必须检查自己的code 是否用到反射 ,和其他不能混淆的地方。告诉我来修改配置文件(已经保留的就不需要了)

目前系统部检查的第三方库为

-dontwarnAndroid.support.**

-dontwarn com.tencent.**

-dontwarn org.dom4j.**

-dontwarn org.slf4j.**

-dontwarn org.http.mutipart.**

-dontwarn org.apache.**

-dontwarn org.apache.log4j.**

-dontwarn org.apache.commons.logging.**

-dontwarn org.apache.commons.codec.binary.**

-dontwarn weibo4Android.**

各个开发人员如果新增加第三方库,需要考虑到其混淆的问题。

具体如何过滤掉反射的R文件及第三方包?http://www.linuxidc.com/Linux/2012-04/58953.htm

更多Android相关信息见Android专题页面http://www.linuxidc.com/topicnews.aspx?tid=11

--------------------------------------------------------------------------------------------------------------

引用:http://baike.baidu.com/view/1834969.htm

ProGuard是一个压缩、优化和混淆Java 字节码文件的免费的工具,它可以删除无用的类、字段、方法和属性。可以删除没用的注释,最大限度地优化字节码文件。它还可以使用简短的无意义的名称来重命名已经存在的类、字段、方法和属性。

编辑本段什么是压缩:

  JAVA 源代码(.java文件)通常被编译为 字节码(.class文件)。而完整的程序或 程序库通常被压缩和发布成Java文档(.jar文件)。字节码比 Java源文件更简洁,但是它仍然包含大量的无用代码,尤其它是一个程序库的时候。ProGuard的压缩程序操作能分析字节码,并删除无用的类、字段和方法。程序只保留功能上的等价,包括异常 堆栈描述所需要的信息。

编辑本段什么是混淆:

  通常情况下,编译后的 字节码仍然包含了大量的调试信息:源文件名,行号, 字段名,方法名,参数名, 变量名等等。这些信息使得它很容易被反编译和通过 逆向工程获得完整的程序。有时,这是令人厌恶的。例如像ProGuard这样的 混淆器就能删除这些调试信息,并用无意义的字符序列来替换所有名字,使得它很难进行逆向工程,它进一步免费的精简代码。除了异常 堆栈信息所需要的类名,方法名和行号外,程序只会保留功能上的等价。通过以上的了解,你应该明白为什么需要混淆了。

编辑本段ProGuard支持那些种类的优化:

  除了在压缩操作删除的无用类,字段和方法外,ProGuard也能在 字节码级提供 性能优化,内部方法有:   常量表达式求值   删除不必要的字段存取   删除不必要的方法调用   删除不必要的分支   删除不必要的比较和instanceof验证   删除未使用的代码   删除只写字段   删除未使用的方法参数   像push/pop简化一样的各种各样的peephole优化   在可能的情况下为类添加static和final 修饰符   在可能的情况下为方法添加private, static和final修饰符   在可能的情况下使get/set方法成为内联的   当接口只有一个实现类的时候,就取代它   选择性的删除日志代码   实际的优化效果是依赖于你的代码和执行代码的 虚拟机的。简单的虚拟机比有复杂JIT编译器的高级虚拟机更有效。无论如何,你的字节码会变得更小。

编辑本段仍有一些明显需要优化的技术不被支持:

  使非final的常量字段成为内联   像get/set方法一样使其他方法成为内联   将常量表达式移到循环之外   Optimizations that require escape analysis

扩展阅读:
  • 1

    http://proguard.sourceforge.net/

  • 2

    http://www.hijava.org/

更多相关文章

  1. Android 购物车加减功能的实现代码
  2. android 查找联系人方法(支持首拼,全拼,英文)
  3. Android之TabHost的几种使用方法
  4. Android保持屏幕常亮的方法总结
  5. Android中RadioGroup RadioButton CheckBox多选按钮实现方法以及
  6. Android几个常用功能代码(校园助手开发笔记)
  7. Android小代码——设置全屏
  8. Android 修改系统时间代码
  9. Android-Intent的使用方法详解

随机推荐

  1. android studio修改配置文件(.android .g
  2. 图解Android(安卓)- Android(安卓)GUI 系
  3. android使用键盘钩子实现按键劫持
  4. Android(安卓)UI设计——ListView控件与S
  5. 低功耗蓝牙(BLE)之概念理解
  6. 获取Android的Java源代码并在Eclipse中关
  7. 安卓TextView的常用属性
  8. Android(安卓)NDK系列(三)-AS编写C文件没有
  9. Android使用ActivityGroup设置android:wi
  10. Android进阶(二十七)Android原生扰人烦的