有些时候我们希望我们自己的apk包不能被别人反编译而获取自己的源代码。这就需要我们通过Android提供的混淆打包技术来完成。
一、没有引用外部包的情况:
这种情况下代码混淆的方式相对简单:
1)只需要复制一份proguard.cfg文件到项目主目录中(不需要做任何改动)
2)修改project.properties文件,向文件中加上一段代码:proguard.config=proguard.cfg即可
到此第一种情况的混淆结束。
二、再我们引用了外部包的情况下,例如:google的gson.jar,微信,人人,地图等外部引用包时,我们就需要对这些包做特殊处理了。
1)在proguard.cfg文件中引入这些jar文件。例如:
-libraryjars libs/activation.jar -libraryjars libs/additionnal.jar -libraryjars libs/alipay.jar -libraryjars libs/android-support-v4.jar -libraryjars libs/gson-2.2.4.jar -libraryjars libs/libammsdk.jar -libraryjars libs/mail.jar
2)指定这些包中的类不被混淆
-keep class com.google.**{ *; } -keep class com.alipay.android.** { *; } -keep class com.sun.activation.registries.** { *; } -keep class javax.activation.** { *; } -keep class com.tencent.mm.** { *; } -keep class com.sum.mail.** { *; } -keep class javax.mail.** { *; } -keep class myjava.awt.datatransfer.** { *; } -keep class org.apache.harmony.** { *; }
3)去除警告
-dontwarn com.google.** -dontwarn javax.activation.** -dontwarn com.alipay.android.** -dontwarn com.sun.activation.registries.** -dontwarn com.tencent.mm.** -dontwarn com.sun.mail.** -dontwarn javax.mail.** -dontwarn myjava.awt.datatransfer.** -dontwarn org.apache.harmony.**
4)修改project.properties文件,向文件中加上一段代码:proguard.config=proguard.cfg
5)到此为止任务完成,混淆编译后就是你想要的效果。
特别说明:当你在用到Google提供的包gson.jar时,除了要对该jar包做特殊处理外还需要对你项目中的JavaBean最特殊处理(保证这些JavaBean不被反编译)
假如你项目中的JavaBean为com.test.Order.java(订单)、com.test.User(用户)等。
那么在你的proguard.cfg文件中就需要加上如下代码:
-keep class com.test.** {*;}
然后再加上下面的这段代码:
-keepattributes Signature -keep class sun.misc.Unsafe { *; } -keep class com.google.gson.examples.android.model.** { *; }
具体为什么这样做,下面我将给出解释:
因为客户端代码中的JavaBean(实体类)的字段名称必须与服务端返回json字符串中的key要一致,才能进行解析,而混淆编
译之后,客户端代码中的JavaBean(实体类)的类名与其字段名称全部变成了a、b、c、d等等字符串,这与服务端返回的json字符串中的key不一致,导致解析失败。所以,解决的办法是:在进行混淆编译进行打包apk的时候,过滤掉存放所有JavaBean(实体类)的包不进行混淆编译。
下面给出网上查到的一段代码:
在proguard.cfg文件中添加: # removes such information by default, so configure it to keep all of it. -keepattributes Signature # Gson specific classes -keep class sun.misc.Unsafe { *; } #-keep class com.google.gson.stream.** { *; } # Application classes that will be serialized/deserialized over Gson -keep class com.google.gson.examples.android.model.** { *; } //这句非常重要,主要是滤掉 com.bgb.scan.model包下的所有.class文件不进行混淆编译 -keep class com.bgb.scan.model.** {*;}