参考:
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.**