最近在需要对所开发的项目进行了代码混淆,在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. iptables的实战整理

    一.iptables使用场景:             内网情况下使用:在大并发的情况下不要开iptables否则影响性能 二.iptables出现下面的问题:             在yewufa ...

  2. Yii2 自动更新时间created_at updated_at

    创建model之后,新建一条记录,结果设计的表中created_at 字段 updated_at 字段 都是datetime 类型的,却不能自动插入当前时间.查看了资料,解决如下: 1.在class ...

  3. 关于虚拟机VM

    装Vmware虚拟机+安装系统不再困难 不要再以为你是女生,你就可以不用学装系统,亲,我们是计算机系的女生,顶起!!呼啦呼啦,这篇我装VM+系统的记录,作为勉励. 想必很多人都会使用到虚拟机,因为我们 ...

  4. Windows下安装Eric5时出现的“Sorry, please install QtHelp.”问题解决办法

    解决Windows下安装Eric5时出现的“Sorry, please install QtHelp.”问题   PyQt4在Windows中使用了DirectX作为加速,不过,PyQt4没有使用最新 ...

  5. MobilePhone正则表达式

    电话号码正则表达式(支持手机号码,3-4位区号,7-8位直播号码,1-4位分机号) ((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3} ...

  6. uva 11195 Another queen (用状态压缩解决N后问题)

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  7. oracle设定用户密码使用时间

    强制用户定期更换密码,要怎么设置? 假设密码用10天之后必须修改,宽限期为2天: 把电脑时间往后调十天,然后登录: 系统提示用户密码两天内失效,这时把电脑系统再往后调两天,然后登录: 系统提示密码已经 ...

  8. 微信45028错误,微信has no masssend quota hint错误

    微信45028,微信has no masssend quota hint 微信测试账号群发出现45028,has no masssend quota hint错误 >>>>&g ...

  9. 使用jquery.validate.js实现boostrap3的校验和验证

    使用jquery.validate.js实现boostrap3的校验和验证 boostrap3验证框架 jquery.validate.js校验表单 >>>>>>& ...

  10. quartz简单实现

    quartz介绍 在我们的项目中,经常会遇到某个任务需要在特定的时间点执行,这个时间点可能是每天的某分某秒,可能是一周的指定某个星期某个时间等:quartz就是实现这样一个复杂任务调度逻辑的框架. 官 ...