文章目录

  • 前言
  • 一、什么是代码混淆
    • 好处
    • 坏处
  • 二、开启混淆
    • 1.修改build.gradle
    • 2.修改混淆文件
      • 常用混淆命令
      • 类修饰常用规则
      • 例子
    • 3.生成混淆结果文件
    • 4.混淆代码模板
  • 三、混淆注意事项

前言

本篇记录笔者对Android开发中代码混淆的认知

一、什么是代码混淆

关于代码混淆的定义,这里笔者选择自己认为讲的相对完整的话进行呈现

Java 是一种跨平台的、解释型语言,Java 源代码编译成中间”字节码”存储于 class 文件中。由于跨平台的需要,Java 字节码中包括了很多源代码信息,如变量名、方法名,并且通过这些名称来访问变量和方法,这些符号带有许多语义信息,很容易被反编译成 Java 源代码。为了防止这种现象,我们可以使用 Java 混淆器对 Java 字节码进行混淆。

混淆就是对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正语义。被混淆过的程序代码,仍然遵照原来的档案格式和指令集,执行结果也与混淆前一样,只是混淆器将代码中的所有变量、函数、类的名称变为简短的英文字母代号,在缺乏相应的函数名和程序注释的况下,即使被反编译,也将难以阅读。同时混淆是不可逆的,在混淆的过程中一些不影响正常运行的信息将永久丢失,这些信息的丢失使程序变得更加难以理解。

混淆器的作用不仅仅是保护代码,它也有精简编译后程序大小的作用。由于以上介绍的缩短变量和函数名以及丢失部分信息的原因, 编译后 jar文件体积大约能减少25%

好处

根据以上定义,可以简单对混淆的好处和坏处总结如下

  • 防止反编译获取项目源码
  • 精简编译后的apk文件大小

坏处

混淆的坏处如下

  • 会延长编译时间,所以切记请勿在debug模式下开启混淆
  • 混淆会让代码失去可读性,且无法还原

二、开启混淆

1.修改build.gradle

将minifyEnabled的值改为true即开启:其中debug为测试版本,release为发布版本

2.修改混淆文件

开启混淆后Android会用自带的混淆进行代码混淆,如在安装Android SDK的目录下的proguard-android.txt或proguard-android-optimize.txt文件为默认混淆文件。对于自己定义的混淆需要在proguard-rules.pro文件中进行配置:

常用混淆命令

类修饰常用规则

  • 类:需要使用完全限定名;

  • *:通配符,任意字符串,不包含包名分隔符(.);

  • **:通配符,任意字符串,包含包名分隔符(.);

  • extends:继承某类的类;

  • implement:实现某接口的类;

  • $:内部类;

  • :所有构造方法;

  • :所有成员变量;

  • :所有方法;

  • …:任意参数;

  • 修饰符:public private protected

例子

3.生成混淆结果文件

因为我们提供给别人的一般都是release版本的库,所以要在build.gradle中开启release版代码混淆,配置好混淆规则后在Android studio的Terminal界面输入:
gradlew assembleRelease 再回车进行编译打包,如果编译失败则检查配置的混淆规则。成功后即可得到混淆后的aar或apk文件:

4.混淆代码模板

将报错的或者自己不需要的删除即可,然后在最后添加自己不需要混淆的代码:

#---------这里提供一份这个lib中最好不要混淆的地方,前边的配置都差不多,主要是第三方包以及其他不需要混淆的代码----
#---------------------------------基本指令以及一些固定不混淆的代码--开始--------------------------------#<基本指令>
-optimizationpasses 5
-dontskipnonpubliclibraryclassmembers
-optimizations !code/simplification/cast,!field/*,!class/merging/*
-keepattributes *Annotation*,InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
#忽略警告
-ignorewarning
#记录生成的日志数据,gradle build时在本项目根目录输出apk 包内所有 class 的内部结构
-dump class_files.txt
#未混淆的类和成员
-printseeds seeds.txt
#列出从 apk 中删除的代码
-printusage unused.txt
#混淆前后的映射
-printmapping mapping.txt
#</基本指令>#<基础>
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.support.multidex.MultiDexApplication
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class * extends android.view.View
-keep public class com.android.vending.licensing.ILicensingService
-keep class android.support.** {*;}
#</基础>#<view相关>
-keep public class * extends android.view.View{*** get*();void set*(***);public <init>(android.content.Context);public <init>(android.content.Context, android.util.AttributeSet);public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclasseswithmembers class * {public <init>(android.content.Context, android.util.AttributeSet);public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * {public void *(android.view.View);
}
#</view相关>#<Serializable、Parcelable>
-keepclassmembers class * implements java.io.Serializable {static final long serialVersionUID;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();
}
-keep public class * implements java.io.Serializable {*;}-keep class * implements android.os.Parcelable {public static final android.os.Parcelable$Creator *;
}
#</Serializable、Parcelable>#<R文件>
-keep class **.R$* {*;
}
#</R文件>#<enum>
-keepclassmembers enum * {public static **[] values();public static ** valueOf(java.lang.String);
}
#</enum>#<natvie>
-keepclasseswithmembernames class * {native <methods>;
}
#</natvie>#---------------------------------基本指令以及一些固定不混淆的代码--结束-----------#---------------------------------第三方包--开始-------------------------------#<okhttp3.x>
-dontwarn com.squareup.okhttp3.**
-keep class com.squareup.okhttp3.** { *;}
-dontwarn okio.**
#</okhttp3.x>#<retrofit2.x>
-dontnote retrofit2.Platform
-dontwarn retrofit2.Platform$Java8
-keepattributes Signature
-keepattributes Exceptions
-dontwarn okio.**
#</retrofit2.x>#</okhttp3.x>#<ButterKnife 7.0 以上>-keep class butterknife.** { *; }-dontwarn butterknife.internal.**-keep class **$$ViewBinder { *; }-keepclasseswithmembernames class * {@butterknife.* <fields>;}-keepclasseswithmembernames class * {@butterknife.* <methods>;}
#</ButterKnife 7.0 以上>#<eventbus 3.0>
-keepattributes *Annotation*
-keepclassmembers class ** {@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {<init>(java.lang.Throwable);
}
#</eventbus 3.0>#<Gson>
-keep class com.google.gson.** {*;}
-keep class com.google.**{*;}
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }
-keep class com.google.gson.examples.android.model.** { *; }
#</Gson>#<glide>
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {**[] $VALUES;public *;
}
#</glide>#<Rxjava RxAndroid>
-dontwarn rx.*
-dontwarn sun.misc.**-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {long producerIndex;long consumerIndex;
}-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {rx.internal.util.atomic.LinkedQueueNode producerNode;
}-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {rx.internal.util.atomic.LinkedQueueNode consumerNode;
}
#</Rxjava RxAndroid>#----------------------------------第三方包--结束--------------------------#---------------------------------一些不要混淆的代码--开始--------------------keep class net.arvin.afbaselibrary.nets.** { *; }
-keep class net.arvin.afbaselibrary.data.** { *; }#<反射>
-keep class net.arvin.afbaselibrary.nets.BaseNet{*;}
#</反射>#<js>#</js>#<自定义View的类>
-keep class net.arvin.afbaselibrary.ui.views.** {*;}
#</自定义View的类>#---------------------------------一些不要混淆的代码--结束-------------------

三、混淆注意事项

  • 混淆时对外暴露的接口层不能混淆,实体类不能混淆。

Android:代码混淆概念整理相关推荐

  1. android代码混淆个人总结及踩坑

    android代码混淆个人总结及踩坑 前言 公司项目使用组件化开发的形式,需要对自己负责的模块进行一些混淆配置,关于混淆相信做android开发的都或多或少有过一些接触,通过对混淆文件的配置从而将代码 ...

  2. Android代码混淆配置说明

    1.为什么需要代码混淆 Proguard混淆用于保护APP不被破解和逆向分析,Proguard通过移除没有用到的代码以及通过特定规则重命名类.变量.方法来压缩.优化.混淆你的代码.这样可以让你APK更 ...

  3. Android 代码混淆Proguard

    混淆概念 Android代码混淆,又称Android混淆,是伴随着Android系统的流行而产生的一种APP保护技术,用于保护APP不被破解和逆向分析. 在Android的具体表现就是打包时,将项目里 ...

  4. android aidl混淆代码,Android代码混淆

    什么是代码混淆 代码混淆就是将代码中的各种元素,如变量,方法,类和包的名字改写成无意义的名字,增加项目反编译后被读懂的难度. Android代码混淆使用ProGuard工具,ProGuard是一个压缩 ...

  5. android 混淆后的机制,Android 代码混淆机制

    Android 代码混淆机制 由于Android项目是基于java语言的,而java属于高层抽象语言,易于反编译,其编译后的程序包包含了大量的源代码变量.函数名.数据结构等信息,根据其编译打包后的AP ...

  6. android加密墙,Android代码混淆加密配置(Proguard文件解析)

    Android代码混淆加密配置(Proguard文件解析) Android代码混淆加密配置(Proguard文件解析) 为了防止自己的APP被轻易反编译,我们需要对APK进行混淆,或者特殊加密处理.可 ...

  7. android混淆语法(android代码混淆工具)

    android 代码混淆算法有哪些 根据SDK的版本不同有2中不同的代码混淆方式,以上的proguard.cfg参数详解中所涉及到的信息是在较低版本SDK下的混淆脚本,事实上在高版本的SDK下混淆的原 ...

  8. Android 代码混淆语法讲解及常用模板(转)

    转载请注明原博客地址  Android 代码混淆语法讲解及常用模板 前言 混淆对于每一个开发者来说都不陌生,对于大多数 APP 而言,在上线之前,通常会进行代码混淆,加固,防止自己的 APP 被别人轻 ...

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

    首先查看一下 "project.properties" 这个文件: # This file is automatically generated by Android Tools. ...

最新文章

  1. qq说说时间轴php实现,PHP实现时间轴函数
  2. ReSharper“无法解析符号”,即使在项目构建时
  3. python 轨迹识别
  4. python程序实例源代码-Python 神经网络手写识别实例源码
  5. 为什么阿里巴巴建议集合初始化时,指定集合容量大小
  6. Java通过JDBC连接SQL Server2017数据库
  7. Linux上的Systemctl命令
  8. Django死活不跳转的问题
  9. 窗体间跳转及传值 01
  10. 上达最高精度,下到最快速度,Scaled-YOLOv4:模型缩放显神威
  11. coc java_基于REST+CoC构建Java Web快速开发框架的架构思路
  12. secureCRT/telnet工具使用技巧(二):设置快捷登录
  13. 乐鑫Esp32学习之旅30 对接华为IoT物联网平台适配踩坑,使用ESP-IDF 编程使用HTTPS请求固件跳过证书校验,实现OTA远程升级文件。(附带源码)
  14. windows下namp的基本操作命令
  15. 升级到Tomcat9之后js中文乱码解决办法
  16. Mysql(免安装版)安装、配置与卸载
  17. discuz模板制作中关于css使用的一些指导说明
  18. Pr 2019版安装教程
  19. CodeForces 417D Cunning Gena 状压dp
  20. HW红队攻防基础建设—C2 IP隐匿技术

热门文章

  1. 美丽的窗花java分形_美丽的窗花活动反思
  2. VUE 怎么样做 ‘暂无数据’
  3. sockert组成部分_IOT-OS之RT-Thread(十六)--- WLAN管理框架 + AP6181(BCM43362) WiFi模块
  4. 全志A33平台调通AP6181(分色排版)
  5. 汇编——多字节有符号加法
  6. 【董天一】如何在IPFS里面上传一张图片
  7. js操作excel数据转json数据
  8. uniapp中nvue页面中设置超出显示省略号
  9. Python学习笔记----入门基础
  10. 史上最全Python学习笔记(基于《Python学习手册(第4版)》)——Part7 异常和工具