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 文件即可看到混淆后的代码结构
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源项目CuteSqlite开发笔记(七):CuteSqlite释放BETA版本啦

经过大半年的开发&#xff0c;CuteSqlite程序代码不知不觉来到了6万行&#xff0c;有效行数4万行&#xff0c;CuteSqlite开发完成了一个小版本&#xff0c;进入下一个阶段&#xff0c;并于2024元旦释放BETA版本&#xff0c;有兴趣的朋友可以下载试用。 GitHub下载https://gith…

Handsfree_ros_imu:ROS机器人IMU模块的get_imu_rpy.py文件学习记录

上一篇博客写了关于Handsfree_ros_imu&#xff1a;ROS机器人IMU模块ARHS姿态传感器&#xff08;A9&#xff09;Liunx系统Ubuntu20.04学习启动和运行教程&#xff1a; https://blog.csdn.net/qq_54900679/article/details/135539176?spm1001.2014.3001.5502 这次带来get_imu_r…

池化、线性、激活函数层

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

ElasticSearch 学习9 spring-boot ,elasticsearch7.16.1实现中文拼音分词搜索

一、elasticsearch官网下载&#xff1a;Elasticsearch 7.16.1 | Elastic 二、拼音、ik、繁简体转换插件安装 ik分词&#xff1a;GitHub - medcl/elasticsearch-analysis-ik: The IK Analysis plugin integrates Lucene IK analyzer into elasticsearch, support customized d…

高质量训练数据助力大语言模型摆脱数据困境 | 景联文科技

目前&#xff0c;大语言模型的发展已经取得了显著的成果&#xff0c;如OpenAI的GPT系列模型、谷歌的BERT模型、百度的文心一言模型等。这些模型在文本生成、问答系统、对话生成、情感分析、摘要生成等方面都表现出了强大的能力&#xff0c;为自然语言处理领域带来了新的突破。 …

ROS2——launcher

在ROS2中&#xff0c;launcher 文件是通过Python构建的&#xff0c;它们的功能是声明用哪些选项或参数来执行哪些程序&#xff0c;可以通过 launcher 文件快速同时启动多个节点。一个 launcher 文件内可以引用另一个 launcher 文件。 使用 launcher 文件 ros2 launch 可以代替…

掌握 Vue 响应式系统,让数据驱动视图(上)

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

GitLab任意用户密码重置漏洞(CVE-2023-7028)

GitLab CVE-2023-7028 POC user[email][]validemail.com&user[email][]attackeremail.com 本文链接&#xff1a; https://www.黑客.wang/wen/47.html

Webhook端口中的自定义签名身份认证

概述 如果需要通过 Webhook 端口从交易伙伴处接收数据&#xff0c;但该交易伙伴可能对于安全性有着较高的要求&#xff0c;而不仅仅是用于验证入站 Webhook 要求的基本身份验证用户名/密码&#xff0c;或者用户可能只想在入站 Webhook 消息上增加额外的安全层。 使用 Webhook…

【数据采集与预处理】流数据采集工具Flume

目录 一、Flume简介 &#xff08;一&#xff09;Flume定义 &#xff08;二&#xff09;Flume作用 二、Flume组成架构 三、Flume安装配置 &#xff08;一&#xff09;下载Flume &#xff08;二&#xff09;解压安装包 &#xff08;三&#xff09;配置环境变量 &#xf…

环形链表[简单]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你一个链表的头节点head&#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪next指针再次到达&#xff0c;则链表中存在环。为了表示给定链表中的环&#xff0c;评测系统内部使用整数pos来表示链…

数据结构中的一棵树

一、树是什么&#xff1f; 有根有枝叶便是树&#xff01;根只有一个&#xff0c;枝叶可以有&#xff0c;也可以没有&#xff0c;可以有一个&#xff0c;也可以有很多。 就像这样&#xff1a; 嗯&#xff0c;应该是这样&#xff1a; 二、一些概念 1、高度 树有多高&#x…

MySQL之导入导出远程备份(详细讲解)

文章目录 一、Navicat导入导出二、mysqldump命令导入导出2.1导出2.2导入&#xff08;使用mysqldump导入 包含t_log表的整个数据库&#xff09; 三、LOAD DATA INFILE命令导入导出3.1设置;3.2导出3.3导入(使用单表数据导入load data infile的方式) 四、远程备份4.1导出4.2导入 一…

redis系列:01 数据类型及操作

redis的数据类型有哪些 string,list,set,sorted_set,hash 操作 sting: set name maliao get name exists name expire name 5 ttl name del name setex name 10 maliao 设置key和过期时间 setnx name maliao 当key不存在时才添加list&#xff1a; lpush letter a lpush le…

OpenCV-22高斯滤波

一、高斯函数的基础 要理解高斯滤波首先要直到什么是高斯函数&#xff0c;高斯函数是符合高斯分布的&#xff08;也叫正态分布&#xff09;的数据的概率密度函数。 高斯函数的特点是以x轴某一点&#xff08;这一点称为均值&#xff09;为对称轴&#xff0c;越靠近中心数据发生…

【Linux实用篇】Linux常用命令(1)

目录 1.1 Linux命令初体验 1.1.1 常用命令演示 1.1.2 Linux命令使用技巧 1.1.3 Linux命令格式 1.2 文件目录操作命令 1.2.1 ls 1.2.2 cd 1.2.3 cat 1.2.4 more 1.2.5 tail 1.2.6 mkdir 1.2.7 rmdir 1.2.8 rm 1.1 Linux命令初体验 1.1.1 常用命令演示 在这一部分中…

遥感影像-语义分割数据集:Landsat8云数据集详细介绍及训练样本处理流程

原始数据集详情 简介&#xff1a;该云数据集包括RGB三通道的高分辨率图像&#xff0c;在全球不同区域的分辨率15米。这些图像采集自Lansat8的五种主要土地覆盖类型&#xff0c;即水、植被、湿地、城市、冰雪和贫瘠土地。 KeyValue卫星类型landsat8覆盖区域未知场景水、植被、…

uniapp中按钮点击跳转页面失效,纠正错误(亲测可用)

不知道伙伴你的错误和我是否一致&#xff1f; 我当时为了点击跳转按钮发现跳转不了&#xff0c;如下错误提示&#xff1a; worker.js?libNameWAAccelerateWorker.js:1 [Deprecation] SharedArrayBuffer will require cross-origin isolation as of M92, around July 2021. S…

【Java SE语法篇】6.数组

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ 文章目录 1.数组的基本概念1.1 为什么使用数组&#xff1f;1.…

MATLAB - 四旋翼飞行器动力学方程

系列文章目录 前言 本例演示了如何使用 Symbolic Math Toolbox™&#xff08;符号数学工具箱&#xff09;推导四旋翼飞行器的连续时间非线性模型。具体来说&#xff0c;本例讨论了 getQuadrotorDynamicsAndJacobian 脚本&#xff0c;该脚本可生成四旋翼状态函数及其雅各布函数…