使用 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 亲测成功!
参考资料:
----------------------------------------------------------------update------------------------------------------------------------------
1.关于配置文件中的 -libraryjars ** 选项,刚开始我test的时候一直在犹豫加还是不加。直到今天出问题了,如果不加的话会出现这样的情况:
一些 @Override 方法的方法名也会被混淆,这样有可能在执行的过程中找不到某些回调的方法,就会出现错误,所以,以后还是要加这个东西。
2013-05-13