最近在需要对所开发的项目进行了代码混淆,在android studio中开启代码混淆其实还是挺方便的,不过因为代码混淆产生的问题非常多,特别是对于一些涉及到反射的第三方库经常因为名称的变化导致无法使用。

  下面介绍android studio中对android项目进行代码混淆的详细步骤:

  (1)代码混淆开启

  想要开启代码混淆功能,只需要在相应的项目中将 build.gradle 的相应设置开启即可。

android{
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

  minifyEnable即为开启的开关,而proguard-rules.pro是设置代码混淆时的相关设置,可以过滤不代码混淆的对象。

  (2)代码混淆规则设置

  程序中每个module下面都有对应的proguard-rules.pro文件,设置其规则可以过滤掉一些类、方法、注解和属性名的混淆,下面是ProGuard的手册页面,详细的规则可以在其中了解。https://stuff.mit.edu/afs/sipb/project/android/sdk/android-sdk-linux/tools/proguard/docs/index.html#manual/introduction.html

  下面简单介绍

  ?  忽略任何单个字母

  * 匹配任何不包含分割符的字符串

  ** 匹配任意字符串  

  1)忽略混淆类

  -keep [,modifier,...] class_specification

  这个语法可以保留类或者成员变量的入口不变,举例如下

  

-keep public class *{
*;
}

  上面这个语法可以匹配任意 public的类以及其成员函数,忽略对其的混淆

-keep class com.example.**{
public static doSomething*(**);
}

  com.example下的任意类

  2) 忽略类的成员

  -keepclassmembers [,modifier,...] class_specification

  匹配保留类的成员,如果相应的类被保留,则匹配的成员也会被保留

-keepclassmembers class * implements java.io.Serializable {
private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}

  3)忽略类和类的成员

  -keepclasseswithmembers [,modifier,....] class_specification

  只有当所有条件都匹配的时候,它的成员变量和类才会避免被混淆

-keepclasseswithmembers public class * {
    public static void main(java.lang.String[]);
}

  忽略拥有main函数的类的混淆以及main函数的混淆

  4)保留类或者成员的名字

  -keepnames class_specification

  当条件匹配时,忽略混淆匹配的类名和成员名称

  

-keepnames class * implements java.io.Serializable

  5) 保留成员变量的名字

  -keepclassmembernames class_specification

  当条件匹配时,保留其中匹配的成员变量的名字

  6)所有条件匹配时,忽略制定类和成员的名字

  -keepclasseswithmembernames class_specification

  当类名和类的成员都匹配上时,忽略混淆才起效

  其中有几个特别有用的tips, 可以匹配子类或接口:

-keep class AClass extends PClass

-keep class CClass implements IClass

-keepclassmemberwithmembernames  class com.A.B.C.* {
@A.B.C.D <methods>
}

  具体更详细的细节,可以参详ProGuard的手册。

  (3)常见库的ProGuard设置

  EventBus的ProGuard设置

-keepattributes *Annotation*
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; } # Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
}

  ButterKnife的ProGuard设置

-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; } -keepclasseswithmembernames class * {
@butterknife.* <fields>;
} -keepclasseswithmembernames class * {
@butterknife.* <methods>;
}

  LeanCloud的ProGuard设置

  

# proguard.cfg

-keepattributes Signature
-dontwarn com.jcraft.jzlib.**
-keep class com.jcraft.jzlib.** { *;} -dontwarn sun.misc.**
-keep class sun.misc.** { *;} -dontwarn com.alibaba.fastjson.**
-keep class com.alibaba.fastjson.** { *;} -dontwarn sun.security.**
-keep class sun.security.** { *; } -dontwarn com.google.**
-keep class com.google.** { *;} -dontwarn com.avos.**
-keep class com.avos.** { *;} -keep public class android.net.http.SslError
-keep public class android.webkit.WebViewClient -dontwarn android.webkit.WebView
-dontwarn android.net.http.SslError
-dontwarn android.webkit.WebViewClient -dontwarn android.support.** -dontwarn org.apache.**
-keep class org.apache.** { *;} -dontwarn org.jivesoftware.smack.**
-keep class org.jivesoftware.smack.** { *;} -dontwarn com.loopj.**
-keep class com.loopj.** { *;} -dontwarn com.squareup.okhttp.**
-keep class com.squareup.okhttp.** { *;}
-keep interface com.squareup.okhttp.** { *; } -dontwarn okio.** -dontwarn org.xbill.**
-keep class org.xbill.** { *;} -keepattributes *Annotation*

  我自己在开发中使用LeanCloud的LeanMessage自定义消息,因为混淆的原因总是解析错误,加上下面两句忽略对继承

com.avos.avoscloud.im.v2.AVIMTypedMessage的混淆即可解决问题,代码如下
-keep class ** extends com.avos.avoscloud.im.v2.AVIMTypedMessage
-keepclassmembers class ** extends com.avos.avoscloud.im.v2.AVIMTypedMessage{
*;
}

android 代码混淆及问题大集锦的更多相关文章

  1. Android 代码混淆规则

    1. Proguard介绍 Android SDK自带了混淆工具Proguard.它位于SDK根目录toolsproguard下面.ProGuard是一个免费的Java类文件收缩,优化,混淆和预校验器 ...

  2. Android代码混淆官方实现方法

    首先查看一下 “project.properties” 这个文件: # This file is automatically generated by Android Tools.# Do not m ...

  3. Android代码混淆和项目宣布步骤记录器

    原本放在一起Android项目与发布的文件相混淆.我突然想到,为什么不写博客,分享.有这篇文章的情况下,. Android代码混淆及项目公布步骤记录 一.清理代码中的调试信息,如Log.System. ...

  4. Android 代码混淆 混淆方案

    本篇文章:自己在混淆的时候整理出比较全面的混淆方法,比较实用,自己走过的坑,淌出来的路.请大家不要再走回头路,可能只要我们代码加混淆,一点不对就会导致项目运行崩溃等后果,有许多人发现没有打包运行好好地 ...

  5. Android代码混淆及项目发布方法记录

     Android代码混淆及项目发布步骤记录 本来整理了一份Android项目混淆与发布的文档,突然想到何不写篇博客,分享一下呢,如是便有了本文. Android代码混淆及项目发布步骤记录 一.清理 ...

  6. 大公司怎么做Android代码混淆的?

    3月17日,网易资深安全工程师钟亚平在安卓巴士全球开发者论坛上做了<安卓APP逆向与保护>的演讲.其中就谈到了关于代码混淆的问题.现摘取部分重点介绍如下:   Java代码是非常容易反编译 ...

  7. Android 代码混淆、第三方平台加固加密、渠道分发 完整教程(图文)

    第一步:代码混淆(注意引入的第三方jar) 在新版本的ADT创建项目时,混码的文件不再是proguard.cfg,而是project.properties和proguard-project.txt. ...

  8. Android 代码混淆 防止反编译

    为了防止代码被反编译,因此需要加入混淆.混淆也可以通过第三方进行apk混淆,也可以用android中的proguard进行混淆. 混淆步骤: 1.配置混淆文件,名字可以随意,在这里使用proguard ...

  9. Android 代码混淆

    什么是代码混淆 Java 是一种跨平台的.解释型语言,Java 源代码编译成中间”字节码”存储于 class 文件中.由于跨平台的需要,Java 字节码中包括了很多源代码信息,如变量名.方法名,并且通 ...

随机推荐

  1. mysql 配置参数

    mysql JDBC Driver 常用的有两个,一个是gjt(Giant Java Tree)组织提供的mysql驱动,其JDBC Driver名称(JAVA类名)为:org.gjt.mm.mysq ...

  2. Ajax 整理总结(进阶)

    Ajax 进阶学习要点:1.加载请求2.错误处理3.请求全局事件4.JSON 和 JSONP5.jqXHR 对象 一.加载请求 在 Ajax 异步发送请求时,遇到网速较慢的情况,就会出现请求时间较长的 ...

  3. C语言 小游戏之贪吃蛇

    还记得非常久曾经听群里人说做贪吃蛇什么的,那时候大一刚学了C语言,认为非常难,根本没什么思路. 前不久群里有些人又在谈论C语言贪吃蛇的事了,看着他们在做,我也打算做一个出来. 如今大三,经过了这一年半 ...

  4. XMPP协议实现原理介绍

    本文介绍XMPP协议原理及相关信息. XMPP协议简介   XMPP(Extensible Messageing and Presence Protocol:可扩展消息与存在协议)是目前主流的四种IM ...

  5. Java GC 概念摘要

    很长时间,我想Java的GC做一个小小的总结,他有没有时间.根据最近看了java paper向上java gc文章,我觉得好,读读.顺便说一下,总结下. java paper的GC文章地址,里面有非常 ...

  6. gdb调试运行时的程序小技巧

    使用gdb调试运行时的程序小技巧 标签: 未分类 gdb pstack | 发表时间:2012-10-15 04:32 | 作者:士豪 分享到: 出处:http://rdc.taobao.com/bl ...

  7. (转载)关于ArrayList的5道面试题

    我以面试官的身份参加过很多Java的面试,以下是五个比较有技巧的问题,我发现有些初级到中级的Java研发人员在这些问题上没有完全弄明白,似懂非懂.所以我写了一篇相关的文章,帮助初级Java研发人员弄清 ...

  8. Linux 确定系统glibc版本

    在shell中,可以直接运行glibc共享库文件获取glibc版本,CentOS下执行: /lib/libc.so. 输出为: GNU C Library stable release version ...

  9. node express

    在某QQ群里,发现大家都在搞node,为了不被out,这周主要研究了一下,还挺高大上. 参考了下资料,适合初学者学习. Node和NPM的安装够便捷了,不细说...有几点基础顺手提一下: 安装命令中的 ...

  10. 黑马程序员-IO(二)

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 装饰设计模式: 当想要对已有对象进行功能增强时.可以定义类,将已经有的类传入,基于已经有的功能, ...