实现Android项目代码混淆三步走战略:
一、修改工程下的project.properties文件如下:
# This file is automatically generated by Android Tools. # Do not modify this file -- YOUR CHANGES WILL BE ERASED! # # This file must be checked in Version Control Systems. # # To customize properties used by the Ant build system edit # "ant.properties", and override values to adapt the script to your # project structure. # # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt # Project target. target=android-10 proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
其中最后一行为自行添加的 混淆脚本路径,具体脚本编写在 proguard-project.txt 脚本文件内进行。
二、修改脚本文件
为什么说事修改呢? 很简单因为Google已经替我们完成了大部分功能,只需按自己需要增加规则就OK,我得 proguard-project.txt 文件如下:
# This is a configuration file for ProGuard. # http://proguard.sourceforge.net/index.html#manual/usage.html -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -verbose # ignorewarnings -ignorewarnings # Optimization is turned off by default. Dex does not like code run # through the ProGuard optimize and preverify steps (and performs some # of these optimizations on its own). -dontoptimize -dontpreverify # Note that if you want to enable optimization, you cannot just # include optimization flags in your own project configuration file; # instead you will need to point to the # "proguard-android-optimize.txt" file instead of this one from your # project.properties file. -keepattributes *Annotation* -keep public class com.google.vending.licensing.ILicensingService -keep public class com.android.vending.licensing.ILicensingService # For native methods, see http://proguard.sourceforge.net/manual/examples.html#native -keepclasseswithmembernames class * { native <methods>; } # keep setters in Views so that animations can still work. # see http://proguard.sourceforge.net/manual/examples.html#beans -keepclassmembers public class * extends android.view.View { void set*(***); *** get*(); } # We want to keep methods in Activity that could be used in the XML attribute onClick -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); } # For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } -keepclassmembers class **.R$* { public static <fields>; } # The support library contains references to newer platform versions. # Don't warn about those in case this app is linking against an older # platform version. We know about them, and they are safe. -dontwarn android.support.** # -keep class android.support.v4.**{*;} -keep class org.phprpc.**{*;} -keep class com.google.gson.**{*;} -keep class com.baidu.**{*;} -keep class com.novell.sasl.client.**{*;} -keep class org.**{*;} -keep class com.hp.hpl.**{*;} -keep class net.sourceforge.**{*;} -keep class pinyindb.**{*;} -keep class demo.**{*;}
其中因为引用第三方jar包,所以自己写了忽略混淆第三方jar包规则,如文件最后的 -keep class * , 最后在增加 -ignorewarnings 忽略警告。
三、打包签名并反编译验证
打包后工程中会出现 proguard 文件夹,内部文件自动生成 如下:
dump.txt mapping.txt seeds.txt usage.txt
反编译验证,至于反编译具体过程请自行Baidu 、Google 编译结果如下截图:
操作期间遇到个问题:如果把脚本中这行 # -keep class android.support.v4.**{*;} 的注释去掉,反编译后无法看到类的内容,类名倒还是如上图,不知道这情况是否正常?