使用 ProGuard 混淆 Android 源代码
1. APK文件混淆方法
请参考:
《Android:Develop/Tools/ProGuard》
《Android 2.3 代码混淆proguard技术介绍 》
2. Jar包的混淆方法
我们在做项目的时候会把一些公共的东西打成 Jar 包,让程序去调用。通过反编译工具,别人可以轻松的获取我们 Jar 包的源代码。为了不让别人轻松的获取我们的劳动果实,我们可以使用 ProGuard 对我们的 Jar 包进行混淆。
在你的 Android SDK 目录下找到 tools\proguard\bin 文件夹,下面有三个文件,我们找到 proguardgui 文件,我们通过它来对我们的 Jar 包进行混淆
首先,双击 proguardgui 文件,出现如下对话框
我们编写我们的配置项
我们先来看一下 Android 标准的 proguard.cfg (android 工程自动生成,路径为 <project_root>/proguard.cfg
)配置项
-optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontpreverify -verbose -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -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 com.android.vending.licensing.ILicensingService -keepclasseswithmembernames class * { native <methods>; } -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); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; }
我们需要编辑如下
-injars test.jar # test.jar 为你要混淆的 jar 包,可以输入路径,没有路径默认为和 proguard 在同一个目录下 -outjars test_out.jar # test_out.jar 为你混淆后的 jar包,可以输入路径,没有路径默认为和 proguard 在同一个目录下 -libraryjars libs\env.jar #libs\env.jar 为支持的库包,可能有很多(类似于该语句一句一句的加),这里用一个做演示 -optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontpreverify -verbose -dontshrink #不压缩,有时候不设置可能会混淆不通过 -ignorewarnings #忽略warnings,自己根据需求设置 #这里只说这两个配置项,还有很多配置项,有时间可以去研究 -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -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 class com.test.OpenClass # 假设 com.test.OpenClass 为我们开放给别人调用的类,我们 keep 它不被混淆,这里做演示 -keep public class com.android.vending.licensing.ILicensingService -keepclasseswithmembernames class * { native <methods>; } -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); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class com.test.* { public <fields>; public <methods>; *** set*(***); *** get*(); } #这里我们 keep com.test 包里面所有类的公共 fields 和 methods 以及 set 和 get 方法 #更多的keep 方法可以多加研究 -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; }保存该文件为 xx.pro,然后 通过 Load Configuration
导入,然后一路 Next 直到结束,如果没有成功,就根据提示找出错误,然后修改配置信息,ReStart
2013-4-30 11:47 亲测成功!
参考资料:
《一步步教你用ProGuard混淆Java源代码》
《ProGuard用法》
《ProGuard使用指南》
----------------------------------------------------------------update------------------------------------------------------------------
1.关于配置文件中的 -libraryjars ** 选项,刚开始我test的时候一直在犹豫加还是不加。直到今天出问题了,如果不加的话会出现这样的情况:
一些 @Override 方法的方法名也会被混淆,这样有可能在执行的过程中找不到某些回调的方法,就会出现错误,所以,以后还是要加这个东西。
2013-05-13