配置文件build.gradle android {
signingConfigs { release { keyAlias 'XXX' keyPassword 'XXX' storeFile file('../key/XXX.jks') // 位置:xxApplication/key/XXX.jks' storePassword 'XXX' } } compileSdkVersion 23 buildToolsVersion "23.0.2" defaultConfig { applicationId "com.XXX.XXX" minSdkVersion 15 targetSdkVersion 22 versionCode 1 versionName "1.0" } buildTypes { release { //日志 buildConfigField "boolean", "LOG_DEBUG", "true" //混淆 minifyEnabled true //Zipalign优化 zipAlignEnabled true //移除无用的resource文件 shrinkResources true //签名 signingConfig signingConfigs.release //的混淆文件 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { buildConfigField "boolean", "LOG_DEBUG", "true" versionNameSuffix "-debug" zipAlignEnabled false shrinkResources false minifyEnabled false signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }}
混淆文件proguard-rules.pro
#保护注解-keepattributes *Annotation*#避免混淆泛型-keepattributes Signature-keepattributes EnclosingMethod#删除日志-assumenosideeffects class android.util.Log{ public static boolean isLoggable(java.lang.String, int); public static int v(...); public static int d(...); public static int i(...); public static int w(...); public static int e(...);} # 保持哪些类不被混淆(第三方)-keep class com.amap.api.** {*;}-dontwarn com.amap.api.**#实体类不被混淆-keep public class com.xxx.xxx.xxx.entity.** { public void set*(***); public *** get*();}#### 此处用 *; 替代,因为Gson解析内部类会实例化不了-keep public class com.xxx.xxx.xxx.entity.** { *;}#jackson-keepnames class com.fasterxml.jackson.** { *; }-dontwarn com.fasterxml.jackson.databind.**-keep class org.codehaus.** { *; }-keepclassmembers public final enum org.codehaus.jackson.annotate.JsonAutoDetect$Visibility { public static final org.codehaus.jackson.annotate.JsonAutoDetect$Visibility *; }#gson-keep class com.google.gson.** { *; }-keep class com.google.gson.stream.** { *; }#butterknife-keep class butterknife.** { *; }
混淆生成的文件
1.dump.txt apk包内所有class的内部结构
2.mapping.txt 混淆前后的映射
3.seeds.txt 未混淆的类和成员
4.usage.txt 列出从apk中删除的代码
还原混淆后的代码
GUI 工具:proguardgui 位于/tools/proguard/bin/ 目录1) 运行 proguardgui.bat2) 从左边的菜单选择 “ReTrace”3) 在上面的 mapping 文件中选择你的 mapping 文件 ,在下面输入框输入要还原的代码4) 点击 “ReTrace!” 按钮命令行工具:retrace.bat,1)把 mapping 文件和要还原的堆栈信息保存在 stacktrace 文件中2)把这两个文件复制到 retrace.bat 目录下,运行如下命令即可。3)retrace.bat -verbose mapping.txt stacktrace.txt > out.txt
参考
google android 文档
android混淆出现的问题与思考?
ProGuard 手册
安卓集成发布详解(二)
AndroidStudio 混淆打包
Android程序保护与破解浅析
ProGuard基础语法和打包配置