Android安全-代码安全1-ProGuard混淆处理
Android安全-代码安全1-ProGuard混淆处理
ProGuard简介
ProGuard是一个SourceForge上非常知名的开源项目。官网网址是:http://proguard.sourceforge.net/。
Java的字节码一般是非常容易反编译的。为了很好的保护Java源代码,我们往往会对编译好的class文件进行混淆处理。ProGuard的主要作用就是混淆。当然它还能对字节码进行缩减体积、优化等,但那些对于我们来说都算是次要的功能。
Android Eclipse开发环境与ProGuard
在新版本的ADT创建项目时,混码的文件不再是proguard.cfg,而是project.properties和proguard-project.txt。
如果需要对项目进行全局混码,只需要进行一步操作:
将project.properties的中
“# proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt”的“#”去掉就可以了。
如 果有一些代码不能被混淆,比如需要加入了so文件,需要调用里面的方法,那么调用JNI访问so文件的方法就不能被混码。在导出的时候,可能不会报错。但 是在手机上运行的时候,需要调用so文件的时候,就会报某某方法无法找到。这个时候就需要用到proguard-project.txt。
在老版本中,创建项目的时候,会给出proguard.cfg,但是在的新版中创建项目则不会有任何提示。这个时候需要只要将proguard.cfg的内容加入到proguard-project.txt中,再根据自己的需要进行编辑即可。
在Android 2.3以前,混淆Android代码只能手动添加proguard来实现代码混淆,非常不方便。而2.3以后,Google已经将这个工具加入到了SDK 的工具集里。具体路径:SDK\tools\proguard。当创建一个新的Android工程时,在工程目录的根路径下,会出现一个proguard 的配置文件proguard.cfg。也就是说,我们可以通过简单的配置,在我们的elipse工程中直接使用ProGuard混淆Android工程。
具体混淆的步骤非常简单。首先,我们需要在工程描述文件default.properties中,添加一句话,启用ProGuard。如下所示:
- # 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 use,
- # "ant.properties", and override values to adapt the script to your
- # project structure.
- # Project target.
- target=android-8
- proguardproguard.config=proguard.cfg
这样,Proguard就可以使用了。当我们正常通过Android Tools导出Application Package时,Proguard就会自动启用,优化混淆你的代码。

导出成功后,你可以反编译看看混淆的效果。一些类名、方法名和变量名等,都变成了一些无意义的字母或者数字。证明混淆成功!
附件:proguard.cfg 配置文件
# -------------------------------------# android 原始混淆模板# -------------------------------------# ----------------------------------# 通过指定数量的优化能执行# -optimizationpasses n# -----------------------------------optimizationpasses 5# ----------------------------------# 混淆时不会产生形形色色的类名 # -dontusemixedcaseclassnames# ----------------------------------#-dontusemixedcaseclassnames# ----------------------------------# 指定不去忽略非公共的库类# -dontskipnonpubliclibraryclasses# ----------------------------------#-dontskipnonpubliclibraryclasses# ----------------------------------# 不预校验# -dontpreverify# ----------------------------------# -dontpreverify# ----------------------------------# 输出生成信息# -verbose# -----------------------------------verbose# ----------------------------------# 优化选项# optimizations {optimization_filter} # -----------------------------------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>;}# -----------------# modify 修改合并# ------------------keep public class * extends android.view.View { public <init>(android.content.Context); public <init>(android.content.Context, android.util.AttributeSet); public <init>(android.content.Context, android.util.AttributeSet, int); public void set*(...);}-keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String);}-keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *;}#--------------------------# 保护类型 -keepattributes 说明# Exceptions, Signature, Deprecated, SourceFile, SourceDir, LineNumberTable, LocalVariableTable, # LocalVariableTypeTable, Synthetic, EnclosingMethod, RuntimeVisibleAnnotations, RuntimeInvisibleAnnotations, # RuntimeVisibleParameterAnnotations, RuntimeInvisibleParameterAnnotations, and AnnotationDefault# ---------------------keepattributes **-libraryjars <java.home>/lib/rt.jar# ----------------------# 不压缩指定的文件# -dontshrink# -----------------------dontshrink# ----------------------# 不优化指定的文件# -dontoptimize# ------------------------dontoptimize# -----------------------# 不混淆指定的文件# -dontobfuscate# -----------------------# ----- 混淆包路径 --------repackageclasses ''-flattenpackagehierarchy ''-target 1.6# -------- 以下是使用了 roboguice-1.1.2.jar 以及 guice-2.0-no_app.jar 功能需要保护的字段及类相关 ---------keep class com.google.inject.Binder-keepclassmembers class * { @com.google.inject.Inject <init>(...);}-keepclassmembers class * { void *(**On*Event); }-keepclassmembers class **.R$* { public static <fields>;}# ------ 编译时需要用到的 jar 包-libraryjars D:/dev_rc/android-sdk-windows/add-ons/addon_google_apis_google_inc_11/libs/maps.jar# ------ 保护 谷歌第三方 jar 包,界面特效 -----------keep class android.support.v4.**-dontwarn android.support.v4.**# ------ 保护百度地址jar包 ---------keep class com.baidu.mapapi.** { *; }-dontwarn com.baidu.mapapi.**# --- 打包时忽略以下类的警告 ---dontwarn com.classpackage.AA#-keepnames class * implements java.io.Serializable# ---------保护所有实体中的字段名称-----------keepclassmembers class * implements java.io.Serializable { <fields>;}# --------- 保护类中的所有方法名 -------------keepclassmembers class * { public <methods>;}

浙公网安备 33010602011771号