配置文件build.gradle android {html
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.projava
#保護註解 -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.** { *; }
混淆生成的文件linux
1.dump.txt apk包內全部class的內部結構android
2.mapping.txt 混淆先後的映射git
3.seeds.txt 未混淆的類和成員github
4.usage.txt 列出從apk中刪除的代碼api
還原混淆後的代碼app
GUI 工具:proguardgui 位於 <android-sdk>/tools/proguard/bin/ 目錄 1) 運行 proguardgui.bat 2) 從左邊的菜單選擇 「ReTrace」 3) 在上面的 mapping 文件中選擇你的 mapping 文件 ,在下面輸入框輸入要還原的代碼 4) 點擊 「ReTrace!」 按鈕 命令行工具:retrace.bat, 1)把 mapping 文件和要還原的堆棧信息保存在 stacktrace 文件中 2)把這兩個文件複製到 retrace.bat 目錄下,運行以下命令便可。 3)retrace.bat -verbose mapping.txt stacktrace.txt > out.txt
參考ide
google android 文檔 https://developer.android.com/studio/build/shrink-code.html工具
android混淆出現的問題與思考? https://www.zhihu.com/question/33184477
安卓集成發佈詳解(二) http://frank-zhu.github.io/android/2015/06/15/android-release_app_build_gradle/
AndroidStudio 混淆打包 http://www.cnblogs.com/permanent2012moira/p/5126276.html
Android程序保護與破解淺析 http://www.cnblogs.com/waylife/p/3675684.html
ProGuard基礎語法和打包配置 http://blog.csdn.net/weizaishouex2010/article/details/49865523