android代码混淆

android代码混淆

ProGuard是一个java代码混合工具,能够压缩、优化、混淆、预先审核(preverify) java class文件。压缩是指删除没用的类、变量、方法和属性,优化是指分析优化字节码,混淆是指使用一些无意义的名字重命名类名、变量名和方法方法名。预先审核(preverify)是给j2me用的,在android可能没用到吧,因为android的官方文档里没提这个,哈哈。

androidbuild系统集成了ProGuardProGuard 会在release的时候自动执行,但是ProGuard 是可选的,但是官方是强烈建议使用ProGuard

eclipse中进行混淆

修改<project_root>/project.properties文件,添加一行:

proguard.config=proguard-project.txt

设置混淆配置文件的路径,可以使用相对路径或者绝对路径。

当在eclipse中导出apk时,ProGuard会自动检查project.properties文件,看里面是否配置了proguard.config属性,如果配置了,就根据其属性值找到混合用的配置文件(这里是proguard-project.txt),在把所有东西打包到apk文件之前,根据这个配置文件对代码进行混淆。

在高版本的sdk中,project.propertiesproguard-project.txt这两个文件在使用adt新建android project时已经建好了,只需要修改里面的内容就可以了。

2 proguard-project.txt写法

有些时候ProGuard认为一些代码是没有用的,但是在你的application中它是确实有用的,这时ProGuard也会把这些代码删除,导致程序出错,所以需要告诉ProGuard哪些代码不做处理,也就是在proguard-project.txt做一些配置。

详细的配置写法可以参考ProGuard的官方手册,下面仅列出一些我在项目中的配置。

2.1 基本配置

#设置混淆的压缩比率 0 ~ 7

-optimizationpasses 5

#Aa aA不使用这种类名

-dontusemixedcaseclassnames

#不忽略jar包里的非public类,如果应用程序引入的有jar包,并且想混淆jar包里面的class 

-dontskipnonpubliclibraryclasses

#在处理过程中显示详细处理信息,如果出异常的话,可以输出详细的异常栈信息

-verbose

#指定优化的方法

-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

#不进行preverify

-dontpreverify

 

2.2 默认不混淆 Activity 、Service等类的子类

-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

 

2.3 不混淆native方法、自定义控件类、enum、Parcelable

保持 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 *;

}

2.4 避免引入第三方包导致出错

#指定第三方jar文件

-libraryjars libs/aaa.jar

#这个jar文件里的类不警告(如果有警告的话,可能会导致export失败)

-dontwarn com.xx.yy.**

#这个包里的所有东西不混淆

-keep class com.xx.yy.** { *;}

 

例如,我在项目中使用appche httpclient的第3jar包,需要如下配置

#指定使用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.** { *;}

 

2.5 具体问题具体分析

正常引入第3jar包的情况,根据1.2.4的方法就能解决,但是如果还是出错,就需要具体问题具体分析了

2.5.1 百度地图

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这个包有点不明显

2.5.2 gson

https://code.google.com/p/google-gson/source/browse/trunk/examples/android-proguard-example/proguard.cfg 这个是gson给人sample里的proguard配置,不单单是关于gsonproguard配置,其他通用配置也值得借鉴。

正常看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  ----------

 

 

参考文献

http://developer.android.com/tools/help/proguard.html android中关于proguard的文档

http://proguard.sourceforge.net/ proguard的官方网站

 

 

 

 

 

 



来自为知笔记(Wiz)



你可能感兴趣的:(android代码混淆)