最近在需要对所开发的项目进行了代码混淆,在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. PostgreSQL相关的软件,库,工具和资源集合

    PostgreSQL相关的软件,库,工具和资源集合. 备份 wal-e - Simple Continuous Archiving for Postgres to S3, Azure, or Swif ...

  2. Kerberos验证过程

    参考文献: How the Kerberos Version 5 Authentication Protocol Works: Logon and Authentication SQL Kerbero ...

  3. Hibernate中inverse属性与cascade属性

    Hibernate集合映射中,经常会使用到"inverse"和"cascade"这两个属性.对于我这样,Hibernate接触不深和语文水平够烂的种种因素,发现 ...

  4. 模板引擎 Velocity

    模板引擎 Velocity 一.Velocity简介: Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template langu ...

  5. NYOJ 38 布线问题_(解法2 Prim算法)

    时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描写叙述 南阳理工学院要进行用电线路改造.如今校长要求设计师设计出一种布线方式.该布线方式须要满足下面条件: 1.把全部的楼都供 ...

  6. N!末尾有多少个零

    题目一:210!最后结果有几个零. 请自己思索10分钟以上再看解释 凡是这种题目必有规律可言, 关键是你找到这个规律的恒心.可采用笨拙的方法思考. 1!  =  1                   ...

  7. PropertyGrid仿VS的属性事件窗口

    效果图:. 首先我们去重写一下PropertyGrid: internal class MyPropertyGrid : System.Windows.Forms.PropertyGrid { pri ...

  8. hdu4504java

    import java.util.*;  class   Main{ public static void main(String[] args) { Scanner cin=new Scanner( ...

  9. java转义xml中的多余尖括号

    xml中的敏感字符是尖括号,如果xml的值中含有尖括号,那么在解析的时候就会报错,如: <?xml version="1.0" encoding="UTF-8&qu ...

  10. [学习笔记]设计模式之Adapter

    写在前面 为方便读者,本文已添加至索引: 设计模式 学习笔记索引 Adapter(适配器)模式主要解决接口不匹配的问题.为此,让我们要回到最初Builder模式创建平行世界时,白雪公主和小霍比特人的谜 ...