有些时候我们希望我们自己的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.** {*;}

更多相关文章

  1. Android(安卓)studio使用NDK编译和调试(生成so文件)
  2. 在线看Android系统源码,AndroidXRef的简易使用方法
  3. Service与Android系统设计(2)
  4. Android(安卓)自定义绚丽的进度条(类似H5实现的一种效果)
  5. Android基础入门教程——8.3.10 Paint API之—— ColorFilter(颜
  6. ORB_SLAM2在android studio上用cmake编译
  7. 带你一步一步手动实现Android热更新
  8. Android从0到完整项目(1)使用Android(安卓)studio 创建项目
  9. Android实现两个Activity界面的跳转并传值

随机推荐

  1. Androidx和Android(安卓)support库的冲突
  2. Android(安卓)可任意拖动的悬浮窗(类似悬
  3. 【Java】java和android网络编程 - 对byte
  4. Android进度条样式
  5. Android 之retrofit2 之 @body上传服务器
  6. 16个最热门的 Android Apps 推荐下载
  7. Android 之listview \gridview 属性设置
  8. Android点击返回按钮两次退出系统
  9. 在Android程序中使用MQTT
  10. Android Studio 插件之 Android ButterKn