参考:
http://www.cnblogs.com/sunzn/archive/2013/03/06/2946952.html
http://www.apkbus.com/android-240707-1-1.html
1、在项目根目录找到project.properties文件,将下图中圈出来的代码注释去除,即申明我们的混淆文件为proguard-project.txt:
2、在项目根目录找到proguard-project.txt文件,按需求添加修改以下代码:
# 指定代码的压缩级别
-optimizationpasses 5
# 不使用大小写混合
-dontusemixedcaseclassnames
# 不混淆第三方jar
-dontskipnonpubliclibraryclasses
# 混淆时不做预校验
-dontpreverify
# 混淆时记录日志
#-verbose
# 混淆时所采用的算法
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
# 申明外部jar包不被混淆
-libraryjars libs/alipay.jar
-libraryjars libs/httpmime-4.1.1.jar
-libraryjars libs/ShareSDK-Core-2.4.2.jar
-libraryjars libs/ShareSDK-QZone-2.4.2.jar
-libraryjars libs/ShareSDK-SinaWeibo-2.4.2.jar
-libraryjars libs/ShareSDK-Wechat-2.4.2.jar
-libraryjars libs/ShareSDK-Wechat-Core-2.4.2.jar
-libraryjars libs/ShareSDK-Wechat-Moments-2.4.2.jar
# 不需要混淆的部分,如系统组件和API的类:
-keep public class * extends android.app.Fragment
-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 * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class * extends android.support.v4.**
# 保持native方法不被混淆
-keepclasseswithmembernames class * {
native <methods>;
}
# 缺省proguard 会检查每一个引用是否正确,但是第三方库里面往往有些不会用到的类
# 没有正确引用。如果不配置的话,系统就会报错
-dontwarn android.support.**
-dontwarn com.amap.api.**
# 指定的类成员被保留
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
# 指定的类和类成员被保留,假如指定的类成员存在的话
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
# 保持自定义控件类不被混淆
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
# 保持自定义控件类不被混淆
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
# 保持自定义控件类不被混淆
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
# 保持枚举 enum 类不被混淆
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
# 保持 Parcelable 不被混淆
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
# 保持自己定义的类不被混淆
-keep class MyClass
3、上面注释说的挺详细的,但重要的是以下几点:
(1) 这里申明的jar包只能是本项目中引用的,项目引用的其他工程中的jar包,无需在此混淆文件中申明:
# 申明外部jar包不被混淆
-libraryjars libs/alipay.jar
(2)以下申明需要根据自己项目中引用的jar包去添加,例如我就是先不添加,直接导出apk文件,这时在Console中我们可以看到报错信息,再逐一添加报错的类路径,例如com.amap.api.**就是申明com.amap.api.xxx都不会被混淆:
# 缺省proguard 会检查每一个引用是否正确,但是第三方库里面往往有些不会用到的类
# 没有正确引用。如果不配置的话,系统就会报错
-dontwarn android.support.**
-dontwarn com.alibaba.fastjson.**
-dontwarn org.eclipse.persistence.**
-dontwarn com.amap.api.**
-dontwarn javax.persistence.**