Android代码混淆

Android之代码混淆

  • 代码混淆的作用
  • 设置混淆
    • 1. 在模块目录下的 build.gradle 文件中配置以下代码
    • 2. 在 proguard-rules.pro 文件中添加混淆规则
  • 通用混淆规则
  • 常用匹配符
  • 常用命令
  • 注意事项
  • 如何查看是否已混淆

代码混淆的作用

	1.APK 难以被逆向工程,即很大程度上增加反编译的成本;
	2.在打包时移除无用资源,显著减少 APK 体积;
	3.对字节码进行优化,移除无用指令,应用运行更快;
	4.以变通方式避免 Android 中常见的 64k 方法数引用的限制。

设置混淆

1. 在模块目录下的 build.gradle 文件中配置以下代码

	buildTypes {
        release {
            minifyEnabled true // 开启混淆
            shrinkResources true // 优化无用资源
        }
    }

2. 在 proguard-rules.pro 文件中添加混淆规则

通用混淆规则

-optimizationpasses 5                       # 代码混淆的压缩比例,值介于0-7,默认5
-verbose                                    # 混淆时记录日志
-dontoptimize                               # 不优化输入的类文件
-dontshrink                                 # 关闭压缩
-dontpreverify                              # 关闭预校验(作用于Java平台,Android不需要,去掉可加快混淆)
-dontoptimize                               # 关闭代码优化
-dontobfuscate                              # 关闭混淆
-ignorewarnings                             # 忽略警告
-dontwarn com.squareup.okhttp.**            # 指定类不输出警告信息
-dontusemixedcaseclassnames                 # 混淆后类型都为小写
-dontskipnonpubliclibraryclasses            # 不跳过非公共的库的类
-printmapping mapping.txt                   # 生成原类名与混淆后类名的映射文件mapping.txt
-useuniqueclassmembernames                  # 把混淆类中的方法名也混淆
-allowaccessmodification                    # 优化时允许访问并修改有修饰符的类及类的成员
-renamesourcefileattribute SourceFile       # 将源码中有意义的类名转换成SourceFile,用于混淆具体崩溃代码
-keepattributes SourceFile,LineNumberTable  # 保留行号
-keepattributes *Annotation*,InnerClasses,Signature,EnclosingMethod # 避免混淆注解、内部类、泛型、匿名类
-optimizations !code/simplification/cast,!field/ ,!class/merging/   # 指定混淆时采用的算法

常用匹配符

	# * 星号
	匹配指定包下的类或者类的子类:
		-keep class top.gaojc.model.*
		-keep class top.gaojc.model.**
	# 释义:
	1. 一个*号表示只保持该包(top.gaojc.model)下的类名不被混淆,而子包下的类名还是会混淆,比如model下面有个bean子包,它里面的类会被混淆
	2. 两个*号表示保持该包(top.gaojc.model)下及该包下子包的包名不被混淆
	3. 如果既想保持类名,又想保持方法和成员变量不被混淆,需要使用以下方式:
		-keep class top.gaojc.model.*{*;}
	
	<init> 匹配类中所有构造函数

	<methods> 匹配类、接口中所有方法

	<fileds> 匹配类、接口中所有字段

常用命令

# 保留类和类成员,防止类和类成员被移除或被混淆;
-keep

# 保留类和类成员,防止被混淆,但没有被引用的类成员会被移除
-keepnames

# 只保留类成员,防止类成员被移除或被混淆;
-keepclassmembers

# 只保留类成员,防止被混淆,但没有被引用的成员会被移除
-keepclassmembernames

# 保留类和类成员,防止被混淆或移除,如果指定的类成员不存在还是会被混淆
-keepclasseswithmembers

# 保留类和类成员,防止被混淆,如果指定的类成员不存在还是会被混淆,没有被引用的类成员会被移除
-keepclasseswithmembernames     

# 不混淆某个类的类名及类中的内容
-keep class top.gaojc.gameapp.debug.DebugActivity { *; }

# 不混淆指定包名下的类名,不包括子包下的类名
-keep class top.gaojc.gameapp*

# 不混淆指定包名下的类名,及类里的内容
-keep class top.gaojc.gameapp* {*;}

# 不混淆指定包名下的类名,包括子包下的类名
-keep class top.gaojc.gameapp**

# 不混淆某个类的子类
-keep public class * extends top.gaojc.gameapp.base.BaseActivity

# 不混淆实现了某个接口的类
-keep class * implements top.gaojc.gameapp.dao.ChatDaiImpl

# 不混淆类名中包含了"entity"的类,及类中内容
-keep class **.*entity*.** {*;}

# 不混淆内部类中的所有public内容
-keep class top.gaojc.gameapp.view.CustomView$OnClickInterface {
    public *;
}

# 不混淆指定类的所有方法
-keep top.gaojc.gameapp.debug.DebugActivity {
    public <methods>;
}

# 不混淆指定类的所有字段
-keep top.gaojc.gameapp.debug.DebugActivity {
    public <fields>;
}

# 不混淆指定类的所有构造方法
-keep top.gaojc.gameapp.debug.DebugActivity {
    public <init>;
}

# 不混淆指定参数作为形参的方法
-keep top.gaojc.gameapp.debug.DebugActivity {
    public <methods>(java.lang.String);
}

# 不混淆类的特定方法
-keep top.gaojc.gameapp.debug.DebugActivity {
    public test(java.lang.String);
}

# 不混淆native方法
-keepclasseswithmembernames class * {
    native <methods>;
}

# 不混淆枚举类
-keepclassmembers enum * {
  public static **[] values();
  public static ** valueOf(java.lang.String);
}

#不混淆资源类
-keepclassmembers class **.R$* {
    public static <fields>;
}

# 不混淆自定义控件
-keep public class * entends android.view.View {
    *** get*();
    void set*(***);
    public <init>;
}

# 不混淆实现了Serializable接口的类成员,此处只是演示,也可以直接 *;
-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();
}

# 不混淆实现了parcelable接口的类成员
-keep class * implements android.os.Parcelable {
    public static final android.os.Parcelable$Creator *;
}

注意事项

	-. jni方法不可混淆,方法名需与native方法保持一致
		-keepclasseswithmembernames class * {
    		native <methods>;
		}
		
	-. 反射用到的类不混淆,否则反射可能出问题
	
	-. 四大组件、Application子类、Framework层下的类、自定义的View默认不会被混淆,无需另外配置
	
	-. WebView的JS调用接口方法不可混淆
	
	-. 注解相关的类不混淆
	
	-. GSON、Fastjson等解析的Bean数据类不可混淆
	
	-. 与服务端交互解析成的实体对象不能设置混淆,否则不能解析出正确的对象
		-keep class top.gaojc.model.bean.*{*;} # 自定义数据模型的bean目录
		
	-. 枚举enum类中的values和valuesof这两个方法不可混淆(反射调用)
	
	-. 继承Parceable和Serializable等可序列化的类不可混淆
	
	-. 第三方库或SDK,请参考第三方提供的混淆规则,没提供的话,建议第三方包全部不混淆

如何查看是否已混淆

在 Android Studio 的 Build 菜单下点击 Analyze APK 选项,选择生成的apk包,然后点击 classes.dex 文件即可看到混淆后的代码结构
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/315616.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nightingale 夜莺监控系统 - 监控篇(2)

Author&#xff1a;rab 官方文档&#xff1a;https://flashcat.cloud/docs/content/flashcat-monitor/categraf/3-configuration/ 目录 前言一、Categraf 配置文件二、Input 插件配置文件2.1 插件说明2.2 通用配置2.2.1 配置采集频率 interval2.2.2 配置采集实例 instances2.2…

Spring Boot - Application Events 的发布顺序_ContextRefreshedListener

文章目录 Pre概述Code源码分析 Pre Spring Boot - Application Events 的发布顺序_ApplicationEnvironmentPreparedEvent 概述 Spring Boot 的广播机制是基于观察者模式实现的&#xff0c;它允许在 Spring 应用程序中发布和监听事件。这种机制的主要目的是为了实现解耦&#…

AI语音识别模块--whisper模块

1.下载 ffmpeg&#xff0c;挑一个自己电脑系统的版本&#xff0c;下载&#xff0c;如我win64&#xff1a; 地址&#xff1a; Releases BtbN/FFmpeg-Builds GitHub 下载压缩包zip&#xff0c;到本地 解压安装&#xff0c;其实无需安装&#xff0c;只需把对应的目录下的bin&…

2024年第1周,第一期技术动态

大家好&#xff0c;才是真的好。 今天周五&#xff0c;我们继续介绍与Domino相关产品新闻&#xff0c;以及互联网或其他IT行业动态等。 一、Notes/Domino V9和V10技术支持结束和假消息 今年2024年6月1号&#xff0c;HCL将结束IBM Notes/Domino 9.0.x和10.0.x产品的技术支持声…

制作 CentOS Stream9 的U盘系统启动盘

一、简述 注:请勿用于商用&#xff0c;如有版权纠纷&#xff0c;于博主无任何关系。&#xff08;仅用于学习研究使用&#xff09; 由于CentOs Linux 7和CentOs Stream8终止日期是2024年&#xff0c;需要将系统升级到最新版本的CentOs Stream9&#xff0c;下面是刻录系统盘的操…

用js做个转盘

样式 <style>.wheel {position: relative;width: 400px;height: 400px;border: 1px solid black;border-radius: 50%;overflow: hidden;margin: auto;}.slice {position: absolute;left: 0;top: 0;width: 0;height: 0;border: 200px solid red;/* border-width: 100px 10…

Linux/SwagShop

Enumeration nmap 仍然一样&#xff0c;先使用nmap探索目标开放端口情况 看到开启了22端口和80端口&#xff0c;还是一样的&#xff0c;先从80端口开始探索&#xff0c;从nmap给出的结果&#xff0c;我们可以看到有一个域名&#xff0c;因此在/etc/hosts中添加域名到IP的映射…

ODBC 在指定的DSN中,驱动程序和应用程序之间的体系结构不匹配

常规办法就是64位或32位匹配&#xff0c;如果解决不了&#xff0c;往下看。 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓解决方案↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 解压AccessDatabaseEngine_X64.exe&#xf…

【C++】C++11中的常见语法(下)

C11 一、可变参数模板1. 递归函数方式展开参数包2. 逗号表达式展开参数包3. STL容器中的 empalce 相关接口函数 二、lambda 表达式1. C98 中的一个例子2. 使用 lambda 表达式3. lambda 表达式语法&#xff08;1&#xff09;lambda 表达式各部分说明&#xff08;2&#xff09;捕…

池化、线性、激活函数层

一、池化层 池化运算是深度学习中常用的一种操作&#xff0c;它可以对输入的特征图进行降采样&#xff0c;从而减少特征图的尺寸和参数数量。 池化运算的主要目的是通过“收集”和“总结”输入特征图的信息来提取出主要特征&#xff0c;并且减少对细节的敏感性。在池化运算中…

基于SSM的电脑测评系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的电脑测评系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spri…

Python教父推荐:《Python基础教程》(第3版) 中文PDF电子版限免

《Python基础教程 第3版》包括Python程序设计的方方面面&#xff1a;首先&#xff0c;从Python的安装开始&#xff0c;随后介绍了Python的基础知识和基本概念&#xff0c;包括列表、元组、字符串、字典以及各种语句&#xff1b;然后循序渐进地介绍了一些相对高-级的主题&#x…

旅游数据可视化大屏:一屏掌控,畅游数据之海

随着旅游业的蓬勃发展&#xff0c;如何有效地管理和分析旅游数据成为行业关注的焦点。旅游数据可视化大屏作为一种新兴的技术手段&#xff0c;为旅游业带来了前所未有的机遇和挑战。 旅游数据可视化大屏集成了丰富的数据资源&#xff0c;通过直观的图表、图像和交互界面&#x…

MySQL面试题 | 03.精选MySQL面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

基于面向对象编程,C++实现单链表

链表&#xff1a;在内存空间中是非连续存储 组成&#xff1a;链表是由一个个节点组成的&#xff0c;每个节点都包含两个元素&#xff1a;数据和指针 节点头文件&#xff1a; 建立一个ListNode.h头文件 #pragma once class ListNode { public:int value;ListNode* next;Lis…

web前端算法简介之队列

队列 队列基本操作 入队&#xff08;enqueue&#xff09;&#xff1a;将元素添加到队列的尾部。出队&#xff08;dequeue&#xff09;&#xff1a;从队列的头部移除元素。队首&#xff08;front&#xff09;&#xff1a;获取队列头部的元素&#xff0c;但不移除它。队尾&#x…

【机器学习300问】5、什么是强化学习?

我将从三个方面为大家简明阐述什么是强化学习&#xff0c;首先从强化学习的定义大家的了解强化学习的特点&#xff0c;其次学习强化学习里特殊的术语加深对强化学习的理解&#xff0c;最后通过和监督学习与无监督学习的比较&#xff0c;通过对比学习来了解强化学习。 一、强化…

canvasdrawer 微信原生小程序生成海报图片

在小程序中生成海报是一种非常有效的推广方式 用户可以使用小程序的过程中生成小程序海报并分享给他人 通过海报的形式&#xff0c;用户可以直观地了解产品或服务的特点和优势 常见绘制海报方式 目前&#xff0c;小程序海报有两种常见的实现方式&#xff1a; canvas 绘制…

Hive基础知识(十):Hive导入数据的五种方式

1. 向表中装载数据&#xff08;Load&#xff09; 1&#xff09;语法 hive> load data [local] inpath 数据的 path[overwrite] into table student [partition (partcol1val1,…)]; &#xff08;1&#xff09;load data:表示加载数据 &#xff08;2&#xff09;local:表示…

视频SDK的技术架构优势和价值

为了满足企业对于高质量视频的需求&#xff0c;美摄科技推出了一款强大的视频SDK&#xff08;软件开发工具包&#xff09;&#xff0c;旨在帮助企业轻松实现高效、稳定的视频功能&#xff0c;提升用户体验&#xff0c;增强企业竞争力。 一、美摄视频SDK的技术实现方式 美摄视…