1、Android 打包为什么要使用混淆?
我简单理解:可以将代码片段打乱。使得代码不容易泄露 ,可以移除没用资源等。
1).创建紧凑的代码文档是为了更快的网络传输,快速装载和更小的内存占用.
2).创建的程序和程序库很难使用反向工程.
3).所以它能删除来自源文件中的没有调用的代码
4).充分利用java6的快速加载的优点来提前检测和返回java6中存在的类文件.
2、AndroidStudio中如何启用ProGuard
1)AndroidStudio 自带混淆插件。
2)如何启用 http://developer.android.com/intl/zh-cn/tools/help/proguard.html
3)我的做法 :在build.gralde 中找到buildTypes节点
<span style="font-family:SimHei;">debug {
minifyEnabled true<span style="white-space:pre"> </span>// 表示打开混淆控制
shrinkResources true<span style="white-space:pre"> </span>//打包时候剔除未使用的资源
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'<span style="white-space:pre"> </span>//添加要混淆规则文件。
}</span>
3、混淆规编写
2)简单描述两个。
参数:
-include {filename} 从给定的文件中读取配置参数
-basedirectory {directoryname} 指定基础目录为以后相对的档案名称
-injars {class_path} 指定要处理的应用程序jar,war,ear和目录
-outjars {class_path} 指定处理完后要输出的jar,war,ear和目录的名称
-libraryjars {classpath} 指定要处理的应用程序jar,war,ear和目录所需要的程序库文件
-dontskipnonpubliclibrary classes 指定不去忽略非公共的库类。
-dontskipnonpubliclibrary classmembers 指定不去忽略包可见的库类的成员。
保留选项
-keep {Modifier} {class_specification} 保护指定的类文件和类的成员
-keepclassmembers {modifier} {class_specification} 保护指定类的成员,如果此类受到保护他们会保护的更好
-keepclasseswithmembers {class_specification} 保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。
-keepnames {class_specification} 保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除)
-keepclassmembernames {class_specification} 保护指定的类的成员的名称(如果他们不会压缩步骤中删除)
-keepclasseswithmembernam es {class_specification} 保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)
-printseeds {filename} 列出类和类的成员-keep选项的清单,标准输出到给定的文件
4、使用实例
1)、EventBus 要keep的。http://greenrobot.org/eventbus/documentation/proguard/
-keepattributes *Annotation*
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
}
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
}
2)、roboguice 相关配置 https://github.com/roboguice/roboguice/wiki/ProGuard
# The -optimizations option disables some arithmetic simplifications that Dalvik 1.0 and 1.5 can't handle. -optimizations !code/simplification/arithmetic -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 class com.google.inject.Binder-keepclassmembers class * { @com.google.inject.Inject <init>(...);}# There's no way to keep all @Observes methods, so use the On*Event convention to identify event handlers-keepclassmembers class * { void *(**On*Event); }-keep public class * extends android.view.View { public <init>(android.content.Context); public <init>(android.content.Context, android.util.AttributeSet); public <init>(android.content.Context, android.util.AttributeSet, int); public void set*(...);} -keep public class roboguice.**-target 1.6 -dontobfuscate -dontoptimize -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontpreverify -verbose -dump ../bin/class_files.txt -printseeds ../bin/seeds.txt -printusage ../bin/unused.txt -printmapping ../bin/mapping.txt #上面这几条我自己都去掉了