最近在需要对所开发的项目进行了代码混淆,在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. 泛型类、Map集合

    ————泛型: JDK1.5之后出现的新特性:用于解决安全问题,是一个类型安全机制. 好处: 1.将运行时期出现的问题ClassCastException ,转移到了编译时期,方便于程序员解决问题,让 ...

  2. ABAP SAPGUI_PROGRESS_INDICATOR 显示数据处理进度

    ABAP处理的数据量较大时,盯着一动不动的选择屏幕是不是很无聊?? LOOP AT I_TAB. DESCRIBE TABLE I_TAB[] LINES L_LIN. L_PERC = SY-TAB ...

  3. 子窗体与父窗体传值操作的js示例

    //返回值给父窗体 function returnParent(value) {//获取子窗体返回值    var parent = window.dialogArguments; //获取父页面   ...

  4. [CSS] Targeting Elements with CSS Attribute Selectors

    Beyond classes and IDs CSS also provides selectors to target element based on their attributes. In t ...

  5. PureMVC(JS版)源码解析(三):Observer类

          上一篇博客中,我们讲到了Notification类(消息类),Notification(消息)是连接观察者(observer)和通知者(notifier)之间的桥梁.这一篇博客,主要是在代 ...

  6. python学习笔记--Django入门0 安装dangjo

    经过这几天的折腾,经历了Django的各种报错,翻译的内容虽然不错,但是与实际的版本有差别,会出现各种奇葩的错误.现在终于找到了解决方法:查看英文原版内容:http://djangobook.com/ ...

  7. 使用内省方式操作JavaBean

    内省,英文中称作introspector.主要对javaBean进行操作,JavaBean是一个特殊的Java类,该类中方法名符合特定的规则(其实就是getXXX,setXXX),我们一般是利用get ...

  8. MYSQL批处理

    待更新 版权声明:本文为博主原创文章,未经博主允许不得转载.

  9. javascript 之闭包-理解不了来找我

    1,闭包是什么 (百度百科定义)--闭包是可以包含自由(未绑定到特定对象)变量的代码块:这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变 量).“闭包” 一词 ...

  10. Java-Hirbernate中文乱码问题

    当你从前台接收的值一直到Action 里面都没有乱码的时候,然而写入数据库的时候确实乱码的 这里有几个原因: 1.你的数据库字符编码指定出问题了 当你指定varchar类型的时候,字符集一定要指定成u ...