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;为自然语言处理领域带来了新的突破。 …

Spring Boot集成Redis简单示例

要在Spring Boot中集成Redis&#xff0c;你可以使用Spring Data Redis库来简化操作。 下面是一个示例代码&#xff1a; 首先&#xff0c;在你的Spring Boot项目的pom.xml文件中添加以下依赖&#xff1a; <dependencies><!-- 其他依赖... --><dependency>&…

springboot启动加载数据库数据到内存

1、概述 一般来说&#xff0c;springboot工程环境配置放在properties文件中&#xff0c;启动的时候将工程中的properties/yaml文件的配置项加载到内存中。但这种方式改配置项的时候&#xff0c;需要重新编译部署&#xff0c;考虑到这种因素&#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; 蓝桥云课签约作者、已在蓝桥云…

问答机器人prompt

def build_prompt(prompt_template, **kwargs): ‘’‘将 Prompt 模板赋值’‘’ prompt prompt_template for k, v in kwargs.items(): if isinstance(v, str): val v elif isinstance(v, list) and all(isinstance(elem, str) for elem in v): val ‘\n’.join(v) else: v…

人机协同中的偏序关系

偏序关系是指集合中的元素之间存在一种有限的、非全序的关系。在该关系下&#xff0c;元素之间可以进行比较&#xff0c;但不一定能够确定它们的相对顺序。 在人机协同中&#xff0c;偏序关系可以用来描述人和机器之间的合作关系、信息传递关系或任务分配关系。例如&#xff0c…

数据库面经---10则

数据库范式有哪些&#xff1a;​​​​​​​ 第一范式&#xff08;1NF&#xff09;&#xff1a; 数据表中的每一列都是不可分割的原子值。每一行数据在关系表中都有唯一标识&#xff0c;通常是通过主键来实现。第二范式&#xff08;2NF&#xff09;&#xff1a; 满足第一范式。…

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

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

[论文笔记] PAI-Megatron中qwen和mistral合并到Megtron-LM

一、千问 关于tokenizer的改动: 1.1、更改build_tokenizer中tokenizer类的加载。 /mnt/nas/pretrain/code/Megatron-LM/megatron/tokenizer/__init__.py 或者 tokenizer.py 在build_tokenizer.py函数中: ​elif args.tokenizer_type == "QwenTokenizer":assert a…

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

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

Servlet-基本概念

一、概念 根据百度百科&#xff1a;Servlet&#xff08;Server Applet&#xff09;是Java Servlet的简称&#xff0c;是用Java编写的服务器端程序&#xff0c;主要功能在于交互式地浏览和生成数据&#xff0c;生成动态Web内容。 加深理解&#xff1a; 上面提到的Web内容我们…

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

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

【Java 设计模式】设计原则之迪米特法则

文章目录 1. 定义2. 好处3. 应用4. 示例结语 在软件开发中&#xff0c;设计原则是创建灵活、可维护和可扩展软件的基础。 这些原则为我们提供了指导方针&#xff0c;帮助我们构建高质量、易理解的代码。 ✨单一职责原则&#xff08;SRP&#xff09; ✨开放/封闭原则&#xff08…

新一代通信协议 - Socket.D

一、简介 Socket.D 是一种二进制字节流传输协议&#xff0c;位于 OSI 模型中的5~6层&#xff0c;底层可以依赖 TCP、UDP、KCP、WebSocket 等传输层协议。由 Noear 开发。支持异步流处理。其开发背后的动机是用开销更少的协议取代超文本传输协议(HTTP)&#xff0c;HTTP 协议对于…

环形链表[简单]

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