android代码混淆
ProGuard是一个java代码混合工具,能够压缩、优化、混淆、预先审核(preverify) java class文件。压缩是指删除没用的类、变量、方法和属性,优化是指分析优化字节码,混淆是指使用一些无意义的名字重命名类名、变量名和方法方法名。预先审核(preverify)是给j2me用的,在android可能没用到吧,因为android的官方文档里没提这个,哈哈。
android的build系统集成了ProGuard,ProGuard 会在release的时候自动执行,但是ProGuard 是可选的,但是官方是强烈建议使用ProGuard。
修改<project_root>/project.properties文件,添加一行:
proguard.config=proguard-project.txt
设置混淆配置文件的路径,可以使用相对路径或者绝对路径。
当在eclipse中导出apk时,ProGuard会自动检查project.properties文件,看里面是否配置了proguard.config属性,如果配置了,就根据其属性值找到混合用的配置文件(这里是proguard-project.txt),在把所有东西打包到apk文件之前,根据这个配置文件对代码进行混淆。
在高版本的sdk中,project.properties和proguard-project.txt这两个文件在使用adt新建android project时已经建好了,只需要修改里面的内容就可以了。
有些时候ProGuard认为一些代码是没有用的,但是在你的application中它是确实有用的,这时ProGuard也会把这些代码删除,导致程序出错,所以需要告诉ProGuard哪些代码不做处理,也就是在proguard-project.txt做一些配置。
详细的配置写法可以参考ProGuard的官方手册,下面仅列出一些我在项目中的配置。
#设置混淆的压缩比率 0 ~ 7
-optimizationpasses 5
#Aa aA不使用这种类名
-dontusemixedcaseclassnames
#不忽略jar包里的非public类,如果应用程序引入的有jar包,并且想混淆jar包里面的class
-dontskipnonpubliclibraryclasses
#在处理过程中显示详细处理信息,如果出异常的话,可以输出详细的异常栈信息
-verbose
#指定优化的方法
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
#不进行preverify
-dontpreverify
-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
# 保持 native 方法不被混淆
-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);
}
# 保持枚举 enum 类不被混淆
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
# 保持 Parcelable 不被混淆
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
#指定第三方jar文件
-libraryjars libs/aaa.jar
#这个jar文件里的类不警告(如果有警告的话,可能会导致export失败)
-dontwarn com.xx.yy.**
#这个包里的所有东西不混淆
-keep class com.xx.yy.** { *;}
例如,我在项目中使用appche httpclient的第3方jar包,需要如下配置
#指定使用appche httpclient使用的jar文件,一共三个
-libraryjars libs/commons-httpclient-3.1.jar
-libraryjars libs/commons-net-3.3.jar
-libraryjars libs/httpmime-4.1.3.jar
#查看这些jar包里的包结构,都是在包org.apache包下的
#偷懒一下,用这一个就可以了,如果将来还引入apache的东西,这个地方就不用动了
-dontwarn org.apache.**
-keep class org.apache.** { *;}
正常引入第3方jar包的情况,根据1.2.4的方法就能解决,但是如果还是出错,就需要具体问题具体分析了
http://developer.baidu.com/map/index.php?title=androidsdk/qa
矢量版SDK(即2.0.0及之后的版本):
如果是用proguard ,以下配置供参考:
-libraryjars libs/baidumapapi_v2_1_2.jar 替换成自己所用版本的jar包
-keep class com.baidu.** { *; }
-keep class vi.com.gdi.bgl.android.**{*;}
其他混淆工具也请进行与此类似的配置,指定对mapapi中的类和方法不进行混淆
附:其实那两个包也能在jar包里找到,但是 vi.com.gdi.bgl.android这个包有点不明显
https://code.google.com/p/google-gson/source/browse/trunk/examples/android-proguard-example/proguard.cfg 这个是gson给人sample里的proguard配置,不单单是关于gson的proguard配置,其他通用配置也值得借鉴。
正常看gson在经过2.4的步骤后,反序列化会出现问题
以下是sample里的混淆
##---------------Begin: proguard configuration for Gson ----------
# Gson uses generic type information stored in a class file
# when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature
# For using GSON @Expose annotation
-keepattributes *Annotation*
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
#-keep class com.google.gson.stream.** { *; }
# Application classes that will be serialized/deserialized over Gson
# 所有需要序列化、反序列化的类,都不混淆
# 这里配置自己的bean包
-keep class com.google.gson.examples.android.model.** { *; }
##---------------End: proguard configuration for Gson ----------
参考文献
1 http://developer.android.com/tools/help/proguard.html android中关于proguard的文档
2 http://proguard.sourceforge.net/ proguard的官方网站
来自为知笔记(Wiz)