深入理解 Android 混淆规则
在 Android 开发中,混淆(Obfuscation)是一种保护代码安全的重要手段,通常通过 ProGuard 或 R8 工具来实现。本文将详细介绍 Android 混淆规则的基本原理、配置方法以及最佳实践,帮助开发者更好地保护应用代码。
博主博客
- https://blog.uso6.com
- https://blog.csdn.net/dxk539687357
什么是混淆?
混淆是一种通过对代码进行重命名、删除无用代码等操作,来降低代码可读性和反编译风险的技术。在 Android 开发中,ProGuard 和 R8 是最常用的混淆工具。两者均可通过缩小代码体积、优化性能来提升应用的整体表现,同时保护应用逻辑。
ProGuard 与 R8 的区别
- ProGuard:一个独立的代码混淆工具,主要作用是对代码进行优化、缩小和混淆。
- R8:Google 开发的替代工具,默认集成在 Android Gradle Plugin 中,相比 ProGuard 提供更高效的混淆和优化。
混淆规则基础
混淆规则文件通常以 proguard-rules.pro 命名,位于项目的 app 模块下。常见的规则包括:
- -keep:指定需要保留的类、方法或字段,防止被混淆。
- -dontwarn:忽略指定类或包的警告。
- -optimizations:启用特定的优化选项。
- -dontoptimize:禁用所有优化。
常见的混淆规则示例
# 保留所有公有类和方法
-keep public class * {public *;
}# 忽略特定包的警告
-dontwarn com.example.unusedpackage.**# 保留带有特定注解的类
-keep @interface com.example.MyAnnotation# 保留继承特定父类的所有子类
-keep class * extends com.example.BaseClass# 保留类名和方法名,但不保护方法的内部实现
-keepclassmembers class com.example.MyClass {public <methods>;
}# 如果想保持特定方法名不混淆
-keepclassmembers class com.example.MyClass {public void myMethod(...);
}# 指定代码的压缩级别
-optimizationpasses 5# 是否使用大小写混合
-dontusemixedcaseclassnames# 混淆时是否做预校验
-dontpreverify# 混淆时是否记录日志
-verbose# 混淆时所采用的算法
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*# 保持哪些类不被混淆
-keep public class * extends android.app.Activity# 保持哪些类不被混淆
-keep public class * extends android.app.Application# 保持哪些类不被混淆
-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 com.android.vending.licensing.ILicensingService# 保持 native 方法不被混淆
-keepclasseswithmembernames class * {native <methods>;
}# 保持自定义控件类不被混淆
-keepclasseswithmembers class * {public <init>(android.content.Context, android.util.AttributeSet);
}# 保持自定义控件类不被混淆
-keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet, int);
}# 保持自定义控件类不被混淆
-keepclassmembers class * extends android.app.Activity {public void *(android.view.View);
}# 保持枚举 enum 类不被混淆
-keepclassmembers enum * {public static **[] values(); public static ** valueOf(java.lang.String);
}# 保持 Parcelable 不被混淆
-keep class * implements android.os.Parcelable {public static final android.os.Parcelable$Creator *;
}# Explicitly preserve all serialization members. The Serializable interface
# is only a marker interface, so it wouldn't save them.
# 显式保留所有序列化成员。可序列化接口只是一个标记接口,因此不会保存它们。
-keep public class * implements java.io.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();
}-keepclassmembers class * { public <init> (org.json.JSONObject);
}# com.example 是你的包名
-keep public class com.example.R$*{public static final int *;
}
配置混淆规则
在 Android 项目中启用混淆只需以下几步:
- 确认使用的构建工具版本:确保使用的 Gradle Plugin 支持混淆(通常 R8 默认启用)。
- 配置 build.gradle 文件:
buildTypes {release {buildConfigField "boolean", "LOG_DEBUG", "false" // 不显示log zipAlignEnabled true // Zipalign优化 shrinkResources true // 移除无用的resource文件minifyEnabled true // 启用代码混淆proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}
}
- 编辑 proguard-rules.pro 文件:添加适合项目的混淆规则。
混淆规则的最佳实践
- 测试和调试:
在开发阶段开启混淆规则进行测试。
使用mapping.txt文件排查混淆导致的问题。 - 保护重要类和方法:
保留必要的反射调用,防止运行时崩溃。
对需要与外部交互的接口、API 保留清晰的命名。 - 使用默认配置:
Android 提供了默认的优化规则文件(如proguard-android-optimize.txt)。
在此基础上根据项目需求进行扩展。 - 定期更新工具:
使用最新版本的 Gradle Plugin 和混淆工具,获取最新的性能优化和安全保护。
常见问题解答
1. 混淆后应用崩溃?
这是由于必要的类或方法被错误混淆导致的。检查日志并调整 -keep 规则。
2. 如何调试混淆问题?
使用 mapping.txt 文件,它位于混淆后的 build/outputs/mapping 文件夹中,可以将混淆后的代码映射回原始代码。
3. 混淆是否影响应用性能?
一般不会影响运行时性能,反而可能通过优化提高性能。
通过正确配置和使用混淆规则,不仅能保护代码安全,还能提升应用的整体表现。
相关文章:
深入理解 Android 混淆规则
在 Android 开发中,混淆(Obfuscation)是一种保护代码安全的重要手段,通常通过 ProGuard 或 R8 工具来实现。本文将详细介绍 Android 混淆规则的基本原理、配置方法以及最佳实践,帮助开发者更好地保护应用代码。 博主博…...
《Keras 3 在 TPU 上的肺炎分类》
Keras 3 在 TPU 上的肺炎分类 作者:Amy MiHyun Jang创建日期:2020/07/28最后修改时间:2024/02/12描述:TPU 上的医学图像分类。 (i) 此示例使用 Keras 3 在 Colab 中查看 GitHub 源 简介 设置 本教程将介…...
从 Android 进行永久删除照片恢复的 5 种方法
从 Android 设备中丢失珍贵的照片可能是一种毁灭性的经历。无论是由于意外删除、软件故障还是系统更新,如何从 Android 永久恢复已删除的照片是一个普遍的问题。 幸运的是,有一些解决方案可以帮助找回丢失的记忆。本指南将涵盖您需要了解的有关如何检索…...
SDL2:Android APP编译使用
SDL2:Android APP编译使用 3. SDL2:Android APP编译使用3.1 Android Studio环境准备:3.2 构建Android APP(1)方式一:快速构建APK工程(2)方式二:自定义APK工程(…...
linux systemd 服务连续启动失败,不会再重启分析
1. 问题现象 在Linux 系统中,将自已写的可执行文件放到 systemd 服务中做成service 服务,以支持开机自启和失败重启。但是发现服务在重启多次失败后再也起不来,服务状态是 failed,并且报 start request repeated too quickly. 2.…...
【云岚到家】-day03-门户缓存方案选择
【云岚到家】-day03-门户缓存方案选择 1.门户常用的技术方案 什么是门户 说到门户马上会想到门户网站,中国比较早的门户网站有新浪、网易、搜狐、腾讯等,门户网站为用户提供一个集中的、易于访问的平台,使他们能够方便地获取各种信息和服务…...
在IDEA中使用通义灵码插件:全面提升开发效率的智能助手
在IDEA中使用通义灵码插件:全面提升开发效率的智能助手 随着软件开发行业对效率和质量要求的不断提高,开发者们一直在寻找能够简化工作流程、提升代码质量的工具。阿里云推出的通义灵码插件正是这样一个旨在帮助开发者更高效地编写高质量代码的强大工具…...
【正则表达式】从0开始学习正则表达式
正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE) 一、推荐学习网站 正则表达式 – 语法 | 菜鸟教程 正则表达式30分钟入门教程 | 菜鸟教程 编程胶囊-打造学习编程的最好系统 二、必知必记 2.1 元字符…...
PHP智慧小区物业管理小程序
🌟智慧小区物业管理小程序:重塑社区生活,开启便捷高效新篇章 🌟 智慧小区物业管理小程序是一款基于PHPUniApp精心雕琢的智慧小区物业管理小程序,它犹如一股清新的科技之风,吹进了现代智慧小区的每一个角落…...
Linux安装Docker教程(详解)
如果想要系统学习docker,建议进入官方文档中学习:docker官方文档 一. 基本概念 Docker Desktop 和 Docker Engine 有什么区别? Docker Desktop for Linux 提供用户友好的图形界面,可简化容器和服务的管理。它包括 Docker Engine,…...
开源AI微调指南:入门级简单训练,初探AI之路
112,如何让 113? 简单的微调你的 AI, 微调前的效果,怎么调教它都是 112. 要对其进行微调(比如训练113),可以按以下步骤进行。 确保你已经安装了以下工具和库: ollamallama3.2Pyt…...
Leetcode 91. 解码方法 动态规划
原题链接:Leetcode 91. 解码方法 自己写的代码: class Solution { public:int numDecodings(string s) {int ns.size();vector<int> dp(n,1);if(s[n-1]0) dp[n-1]0;for(int in-2;i>0;i--){if(s[i]!0){string ts.substr(i,2);int tmpatoi(t.c…...
ASP .NET Core 学习(.NET9)配置接口访问路由
新创建的 ASP .NET Core Web API项目中Controller进行请求时,是在地址:端口/Controller名称进行访问的,这个时候Controller的默认路由配置如下 访问接口时,是通过请求方法(GET、Post、Put、Delete)进行接口区分的&…...
将 AzureBlob 的日志通过 Azure Event Hubs 发给 Elasticsearch(2 换掉付费的Event Hubs)
前情回顾: 将 AzureBlob 的日志通过 Azure Event Hubs 发给 Elasticsearch(1)-CSDN博客 前边的方案是挺好的,但 Azure Event Hubs 是付费服务,我这里只是一个获取日志进行必要的分析,并且不要求实时性&am…...
idea 如何安装 github copilot
idea 如何安装 github copilot 要在 IntelliJ IDEA 中安装 GitHub Copilot,可以按照以下步骤操作: 打开 IntelliJ IDEA: 启动 IntelliJ IDEA。 打开插件管理器: 点击菜单栏中的 File。 选择 Settings(Windows/Linux)或 Prefere…...
1.17学习
crypto nssctf-[SWPUCTF 2021 新生赛]crypto8 不太认识这是什么编码,搜索一下发现是一个UUENCODE编码,用在线工具UUENCODE解码计算器—LZL在线工具解码就好 misc buuctf-文件中的秘密 下载附件打开后发现是一个图片,应该是一个图片隐写&…...
Redis系列之底层数据结构整数集IntSet
Redis系列之底层数据结构整数集IntSet 什么是IntSet IntSet,整数集合,是Redis集合类型的一种底层数据结构,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,redis就会选用intset作为底层实现。 IntSet的数…...
外包公司名单一览表(成都)
大家好,我是苍何。 之前写了一篇武汉的外包公司名单,评论区做了个简单统计,很多人说,在外包的日子很煎熬,不再想去了。 有小伙伴留言说有些外包会强制离职,不行就转岗,让人极度没有安全感。 这…...
个人vue3-学习笔记
声明:这只是我个人的学习笔记(黑马),供以后复习用 。一天学一点,随时学随时更新。明天会更好的! 这里只给代码,不给运行结果,看不出来代码的作用我也该进厂了。。。。。 Day1 使用create-vue创建项目。 1.检查版本。 node -v 2.创建项目 npm init vue@latest 可…...
STM32 FreeRTOS消息队列
队列简介 队列是任务间通信的主要形式。 它们可以用于在任务之间以及中断和任务之间发送消息。 队列是线程安全的数据结构,任务可以通过队列在彼此之间传递数据。有以下关键特点: FIFO顺序:队列采用先进先出 (FIFO) 的顺序,即先…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
