一、proguard 原理
Java代码编译成二进制class 文件,这个class 文件也可以反编译成源代码。除了注释外,
原来的code 基本都可以看到。为了防止重要code 被泄露,我们往往需要混淆(Obfuscation code ), 也就是把方法,字段,包和类这些java 元素的名称改成无意义的名称,这样代码结构没有变化,还可以运行,但是想弄懂代码的架构却很难。proguard 就是这样的混淆工具,它可以分析一组class 的结构,根据用户的配置,然后把这些class 文件的可以混淆java 元素名混淆掉。在分析class 的,同时他还有其他两个功能,删除无效代码(Shrinking 收缩),和代码进行优化(Optimization Options)。
缺省情况下,proguard 会混淆所有代码,但是下面几种情况是不能改变java 元素的名称,否则就会这样就会导致程序出错。
一, 我们用到反射的地方
二,我们代码依赖于系统的接口,比如被系统代码调用的回调方法,这种情况最复杂。
三,是我们的java 元素名称是在配置文件中配置好的。所以使用proguard时,我们需要有个配置文件告诉proguard 哪些java 元素是不能混淆的。
二、proguard 配置
Proguard.cfg文件是用来描述混淆配置的描述文件。自Android 2.3 SDK发布后,Google便在Android SDK Tools里加入了proguard,proguard是一个可以对.java文件进行一定程度上的代码混淆,使用proguard是一件极方便工作,在你项目中没有其他外部Jar包的情况下,在“project.properties”文件里,添加一行:proguard.config=proguard.cfg代码即可,然后通过Android Tools(右击项目名)里导出APK即可。如果项目所使用的的SDK版本低于2.3,只需要进行%android_dir%/tools/lib目录,复制proguard.cfg文件到项目的根目录下导出APK即可、 (2.3之前版本可以拷贝proguard.cfg文件到项目工程下) 这里我们重点看看proguard.cfg文件是如何配置的?Google默认的proguard.cfg
文件内容如下:
-optimizationpasses 5
-dontusemixedcaseclassnames
文档冲亿季,好礼乐相随
miniipad移动硬盘拍立得百度书包
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
<!--
指定类和类成员作为入口保留
-->
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
<!---
指定特定类做入口
->
-keep public class com.android.vending.licensing.ILicensingService
<!--
指定的类和类成员被保留
->
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclasseswithmembernames class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembernames class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
<!--
指定的类成员被保留
-->
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
混淆中保留了继承自Activity、Service、Application、BroadcastReceiver、ContentProvider等基本组件以及com.android.vending.licensing.ILicensingService, 并保留了所有的Native变量名及类名,所有类中部分以设定了固定参数格式的构造函数,枚举等等。