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

Android 混淆打包的更多相关文章

  1. Android混淆打包配置总结

    Android打包失败出现Proguard returned with error code 1. See console的错误 这个问题是由于代码混淆引起的,找不到引用包. 只需在你的proguar ...

  2. android -------- 混淆打包报错(warning - InnerClass annotations are missing corresponding EnclosingMember annotations)

    最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations ...

  3. android——混淆打包

    网上搜了一大堆,在此不一一赘诉. 直接讲解了 如上图这么配置,其实就是加上一句话而已.告诉打包工具混淆打包的代码放在./proguard-project.txt这里 proguard.config=. ...

  4. Android 混淆打包不混淆第三方jar包

    项目由于要公布,所以要混淆打包. 混淆打包流程: 1.在proguard-project.txt文件里加入不须要混淆的类和第三方的jar包   这个是保持自己包中不须要混淆的类,假设有些类调用了jni ...

  5. Android混淆打包

    一.理论知识   ProGuard是一款免费的Java类文件压缩器.优化器和混淆器.它能发现并删除无用类.字段(field).方法和属性值(attribute).它也能优化字节码并删除无用的指令.最后 ...

  6. 微信android混淆打包减少安装包大小

    首先,感谢微信android团队的分享 微信中的资源混淆工具主要为了混淆资源ID长度(例如将res/drawable/welcome.png混淆为r/s/a.png),同时利用7z深度压缩,大大减少了 ...

  7. android混淆打包配置(忽略第三方jar)

    在project.properties里加上   proguard.config=proguard.cfg proguard.cfg 配置如下: -optimizationpasses 5-dontu ...

  8. android studio...混淆打包全揭秘

    前言,当前android studio使用的版本较新,低版本的如果有差异,或者问题,欢迎拍砖! 1.修改配置文件 找到配置文件,build.gradle,修改如下.    signingConfigs ...

  9. apk混淆打包注意事项

    混淆打包搞了好几天才初步了解,其中碰到很多Debug正常,Release的apk不能用,基本都是第三方的jar的问题,所以要排除混淆. 1. Json解析对象出错 用到fastJson或者GJson的 ...

随机推荐

  1. 【读书笔记】iOS-网络-使用推送通知

    一,本地通知 本地通知有64位的最大限制.虽然,你依然可以调度通知,不过到到达的通知数被限定为接近64个,并且按照fireDate的顺序排序,系统会忽略掉其余的通知.这意味着如果现在有64个调用的本地 ...

  2. VC工程从Win32环境往Win64环境迁移的经验总结

    作者:朱金灿 来源:http://blog.csdn.net/clever101 首先需要安装Win64的开发环境,具体参考: VS 2008的64位编译环境的安装和使用 其次在工程属性设置中作如下修 ...

  3. WOSA/XFS PTR FORM—基础知识

    目录 一.XFS PTR 二.XFS PTR FORM 三.Form.子Form.字段.框架.表单和媒介的定义 正文 一.XFS PTR Class Name PTR Class Identifier ...

  4. DOS中的ECHO命令详解

    1. 作为控制批处理命令在执行时是否显示命令行自身的开关  格式:ECHO [ON|OFF]  如果想关闭“ECHO OFF”命令行自身的显示,则需要在该命令行前加上“@”.  2. 显示当前ECHO ...

  5. [Sublime-Text] Linux下用Sublime-Text3编译输出Java文件

    因为现在在借着经典的书籍巩固一些基础知识,所以会经常跑一些简单的程序,可又不想开庞大的IDE.所以就想试着用Sublime-Text来编译程序,哦,当然如果习惯的话,用 terminal 也可以.其实 ...

  6. python基础一数据类型之列表

    摘要: python基础一中写到列表,那么这篇主要讲列表. 1,定义列表 2,列表.元祖.字符串都属于序列,都可以用用索引和切片. 3,列表的方法 1,定义列表 list1 = ['a','b',1, ...

  7. 表的垂直拆分和水平拆分-zz

    https://www.kancloud.cn/thinkphp/mysql-design-optimalize/39326 http://www.cnblogs.com/nixi8/tag/mysq ...

  8. axios的配置项

    最近在学习vue,涉及到axios的ajax操作,记录一下相关Config,方便日后查阅 { // `url`是将用于请求的服务器URL url: '/user', // `method`是发出请求时 ...

  9. ELF文件结构描述

    ELF目标文件格式最前部ELF文件头(ELF Header),它包含了描述了整个文件的基本属性,比如ELF文件版本.目标机器型号.程序入口地址等.其中ELF文件与段有关的重要结构就是段表(Sectio ...

  10. cisco查看机框 板卡 电源 SN 风扇环境运行状态和一些常用命令 巡检命令

    查看设备运行环境及状态 show environment 查看设备环境show environment temperature --查设备温度 show environment fans --查看设备 ...