当前位置: 首页 > news >正文

深入理解 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 模块下。常见的规则包括:

  1. -keep:指定需要保留的类、方法或字段,防止被混淆。
  2. -dontwarn:忽略指定类或包的警告。
  3. -optimizations:启用特定的优化选项。
  4. -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 项目中启用混淆只需以下几步:

  1. 确认使用的构建工具版本:确保使用的 Gradle Plugin 支持混淆(通常 R8 默认启用)。
  2. 配置 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'}
}
  1. 编辑 proguard-rules.pro 文件:添加适合项目的混淆规则。

混淆规则的最佳实践

  1. 测试和调试
    在开发阶段开启混淆规则进行测试。
    使用 mapping.txt 文件排查混淆导致的问题。
  2. 保护重要类和方法
    保留必要的反射调用,防止运行时崩溃。
    对需要与外部交互的接口、API 保留清晰的命名。
  3. 使用默认配置
    Android 提供了默认的优化规则文件(如 proguard-android-optimize.txt)。
    在此基础上根据项目需求进行扩展。
  4. 定期更新工具
    使用最新版本的 Gradle Plugin 和混淆工具,获取最新的性能优化和安全保护。

常见问题解答

1. 混淆后应用崩溃?

这是由于必要的类或方法被错误混淆导致的。检查日志并调整 -keep 规则。

2. 如何调试混淆问题?

使用 mapping.txt 文件,它位于混淆后的 build/outputs/mapping 文件夹中,可以将混淆后的代码映射回原始代码。

3. 混淆是否影响应用性能?

一般不会影响运行时性能,反而可能通过优化提高性能。


通过正确配置和使用混淆规则,不仅能保护代码安全,还能提升应用的整体表现。

相关文章:

深入理解 Android 混淆规则

在 Android 开发中&#xff0c;混淆&#xff08;Obfuscation&#xff09;是一种保护代码安全的重要手段&#xff0c;通常通过 ProGuard 或 R8 工具来实现。本文将详细介绍 Android 混淆规则的基本原理、配置方法以及最佳实践&#xff0c;帮助开发者更好地保护应用代码。 博主博…...

《Keras 3 在 TPU 上的肺炎分类》

Keras 3 在 TPU 上的肺炎分类 作者&#xff1a;Amy MiHyun Jang创建日期&#xff1a;2020/07/28最后修改时间&#xff1a;2024/02/12描述&#xff1a;TPU 上的医学图像分类。 &#xff08;i&#xff09; 此示例使用 Keras 3 在 Colab 中查看 GitHub 源 简介 设置 本教程将介…...

从 Android 进行永久删除照片恢复的 5 种方法

从 Android 设备中丢失珍贵的照片可能是一种毁灭性的经历。无论是由于意外删除、软件故障还是系统更新&#xff0c;如何从 Android 永久恢复已删除的照片是一个普遍的问题。 幸运的是&#xff0c;有一些解决方案可以帮助找回丢失的记忆。本指南将涵盖您需要了解的有关如何检索…...

SDL2:Android APP编译使用

SDL2&#xff1a;Android APP编译使用 3. SDL2&#xff1a;Android APP编译使用3.1 Android Studio环境准备&#xff1a;3.2 构建Android APP&#xff08;1&#xff09;方式一&#xff1a;快速构建APK工程&#xff08;2&#xff09;方式二&#xff1a;自定义APK工程&#xff08…...

linux systemd 服务连续启动失败,不会再重启分析

1. 问题现象 在Linux 系统中&#xff0c;将自已写的可执行文件放到 systemd 服务中做成service 服务&#xff0c;以支持开机自启和失败重启。但是发现服务在重启多次失败后再也起不来&#xff0c;服务状态是 failed&#xff0c;并且报 start request repeated too quickly. 2.…...

【云岚到家】-day03-门户缓存方案选择

【云岚到家】-day03-门户缓存方案选择 1.门户常用的技术方案 什么是门户 说到门户马上会想到门户网站&#xff0c;中国比较早的门户网站有新浪、网易、搜狐、腾讯等&#xff0c;门户网站为用户提供一个集中的、易于访问的平台&#xff0c;使他们能够方便地获取各种信息和服务…...

在IDEA中使用通义灵码插件:全面提升开发效率的智能助手

在IDEA中使用通义灵码插件&#xff1a;全面提升开发效率的智能助手 随着软件开发行业对效率和质量要求的不断提高&#xff0c;开发者们一直在寻找能够简化工作流程、提升代码质量的工具。阿里云推出的通义灵码插件正是这样一个旨在帮助开发者更高效地编写高质量代码的强大工具…...

【正则表达式】从0开始学习正则表达式

正则表达式&#xff08;英语&#xff1a;Regular Expression&#xff0c;在代码中常简写为regex、regexp或RE&#xff09; 一、推荐学习网站 正则表达式 – 语法 | 菜鸟教程 正则表达式30分钟入门教程 | 菜鸟教程 编程胶囊-打造学习编程的最好系统 二、必知必记 2.1 元字符…...

PHP智慧小区物业管理小程序

&#x1f31f;智慧小区物业管理小程序&#xff1a;重塑社区生活&#xff0c;开启便捷高效新篇章 &#x1f31f; 智慧小区物业管理小程序是一款基于PHPUniApp精心雕琢的智慧小区物业管理小程序&#xff0c;它犹如一股清新的科技之风&#xff0c;吹进了现代智慧小区的每一个角落…...

Linux安装Docker教程(详解)

如果想要系统学习docker,建议进入官方文档中学习&#xff1a;docker官方文档 一. 基本概念 Docker Desktop 和 Docker Engine 有什么区别&#xff1f; Docker Desktop for Linux 提供用户友好的图形界面&#xff0c;可简化容器和服务的管理。它包括 Docker Engine&#xff0c…...

开源AI微调指南:入门级简单训练,初探AI之路

112&#xff0c;如何让 113&#xff1f; 简单的微调你的 AI&#xff0c; 微调前的效果&#xff0c;怎么调教它都是 112. 要对其进行微调&#xff08;比如训练113&#xff09;&#xff0c;可以按以下步骤进行。 确保你已经安装了以下工具和库&#xff1a; ollamallama3.2Pyt…...

Leetcode 91. 解码方法 动态规划

原题链接&#xff1a;Leetcode 91. 解码方法 自己写的代码&#xff1a; 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进行请求时&#xff0c;是在地址:端口/Controller名称进行访问的&#xff0c;这个时候Controller的默认路由配置如下 访问接口时&#xff0c;是通过请求方法&#xff08;GET、Post、Put、Delete&#xff09;进行接口区分的&…...

将 AzureBlob 的日志通过 Azure Event Hubs 发给 Elasticsearch(2 换掉付费的Event Hubs)

前情回顾&#xff1a; 将 AzureBlob 的日志通过 Azure Event Hubs 发给 Elasticsearch&#xff08;1&#xff09;-CSDN博客 前边的方案是挺好的&#xff0c;但 Azure Event Hubs 是付费服务&#xff0c;我这里只是一个获取日志进行必要的分析&#xff0c;并且不要求实时性&am…...

idea 如何安装 github copilot

idea 如何安装 github copilot 要在 IntelliJ IDEA 中安装 GitHub Copilot&#xff0c;可以按照以下步骤操作&#xff1a; 打开 IntelliJ IDEA: 启动 IntelliJ IDEA。 打开插件管理器: 点击菜单栏中的 File。 选择 Settings&#xff08;Windows/Linux&#xff09;或 Prefere…...

1.17学习

crypto nssctf-[SWPUCTF 2021 新生赛]crypto8 不太认识这是什么编码&#xff0c;搜索一下发现是一个UUENCODE编码&#xff0c;用在线工具UUENCODE解码计算器—LZL在线工具解码就好 misc buuctf-文件中的秘密 下载附件打开后发现是一个图片&#xff0c;应该是一个图片隐写&…...

Redis系列之底层数据结构整数集IntSet

Redis系列之底层数据结构整数集IntSet 什么是IntSet IntSet&#xff0c;整数集合&#xff0c;是Redis集合类型的一种底层数据结构&#xff0c;当一个集合只包含整数值元素&#xff0c;并且这个集合的元素数量不多时&#xff0c;redis就会选用intset作为底层实现。 IntSet的数…...

外包公司名单一览表(成都)

大家好&#xff0c;我是苍何。 之前写了一篇武汉的外包公司名单&#xff0c;评论区做了个简单统计&#xff0c;很多人说&#xff0c;在外包的日子很煎熬&#xff0c;不再想去了。 有小伙伴留言说有些外包会强制离职&#xff0c;不行就转岗&#xff0c;让人极度没有安全感。 这…...

个人vue3-学习笔记

声明:这只是我个人的学习笔记(黑马),供以后复习用 。一天学一点,随时学随时更新。明天会更好的! 这里只给代码,不给运行结果,看不出来代码的作用我也该进厂了。。。。。 Day1 使用create-vue创建项目。 1.检查版本。 node -v 2.创建项目 npm init vue@latest 可…...

STM32 FreeRTOS消息队列

队列简介 队列是任务间通信的主要形式。 它们可以用于在任务之间以及中断和任务之间发送消息。 队列是线程安全的数据结构&#xff0c;任务可以通过队列在彼此之间传递数据。有以下关键特点&#xff1a; FIFO顺序&#xff1a;队列采用先进先出 (FIFO) 的顺序&#xff0c;即先…...

保姆级教程:在PVE上5分钟搞定一个Ubuntu LXC容器,并配置好Docker环境

5分钟极速部署&#xff1a;PVE上Ubuntu LXC容器与Docker环境全自动配置指南 刚接触家庭服务器的朋友往往被复杂的虚拟化环境劝退。今天分享的这套方案&#xff0c;能让你在PVE平台上用不到5分钟时间&#xff0c;快速获得一个开箱即用的Ubuntu容器&#xff0c;并预装好Docker环境…...

Gemma-3-12b-it镜像免配置实战:单命令启动多模态服务并集成Flask API

Gemma-3-12b-it镜像免配置实战&#xff1a;单命令启动多模态服务并集成Flask API 1. 快速了解Gemma-3-12b-it多模态能力 Gemma-3-12b-it是Google推出的轻量级多模态模型&#xff0c;它最大的特点就是能同时理解文字和图片。想象一下&#xff0c;你给它一张照片&#xff0c;它…...

GORM实战避坑指南:从‘小白’到‘老鸟’必须知道的10个细节(含MySQL连接配置)

GORM实战避坑指南&#xff1a;从‘小白’到‘老鸟’必须知道的10个细节&#xff08;含MySQL连接配置&#xff09; 1. MySQL连接配置的隐藏陷阱 charsetutf8mb4的必要性 MySQL默认的utf8编码只支持最多3字节的字符&#xff0c;而emoji表情等特殊字符需要4字节存储。若不指定utf8…...

Scratch3.0离线编辑器安装指南:一步步教你轻松搞定

1. 为什么你需要Scratch3.0离线编辑器 Scratch作为全球最受欢迎的少儿编程工具&#xff0c;它的在线版本虽然方便&#xff0c;但经常会遇到网络不稳定、加载缓慢的问题。我去年给小学生上课时就遇到过这种情况——全班40个孩子同时登录在线编辑器&#xff0c;结果服务器直接卡死…...

虚幻引擎PicoVR开发避坑指南:PicoXR与PicoOpenXR插件选型与实战解析

1. PicoXR与PicoOpenXR插件核心差异解析 第一次接触PicoVR开发时&#xff0c;很多开发者都会被两个相似的插件名称搞懵——PicoXR和PicoOpenXR。这两个插件虽然名字相近&#xff0c;但在功能特性和适用场景上存在本质区别。我在去年开发健身类VR应用时就因为选错插件&#xff0…...

Photon OS 监控与运维:7个必备工具和最佳实践

Photon OS 监控与运维&#xff1a;7个必备工具和最佳实践 【免费下载链接】photon Minimal Linux container host 项目地址: https://gitcode.com/gh_mirrors/phot/photon Photon OS 作为一款轻量级 Linux 容器主机&#xff0c;高效的监控与运维是保障其稳定运行的关键。…...

深度解析CloverBootloader内存管理:AptioMemoryFix原理与实现详解

深度解析CloverBootloader内存管理&#xff1a;AptioMemoryFix原理与实现详解 【免费下载链接】CloverBootloader Bootloader for macOS, Windows and Linux in UEFI and in legacy mode 项目地址: https://gitcode.com/gh_mirrors/cl/CloverBootloader CloverBootloade…...

【人物传记】模拟单片集成电路之父-鲍勃·魏德拉

1 鲍勃魏德拉简介 鲍勃魏德拉&#xff08;Bob Widlar&#xff09; (1937-1991)模拟集成电路的奠基人&#xff0c;以μA702、μA709等开创性设计定义了模拟芯片的规则&#xff0c;用反叛与幽默改写了硅谷的精神&#xff0c;其创造的电流源、带隙基准等技术至今仍运行在每一块芯…...

Python金融数据获取终极指南:用mootdx高效处理通达信股票数据

Python金融数据获取终极指南&#xff1a;用mootdx高效处理通达信股票数据 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 在量化投资和金融数据分析领域&#xff0c;获取稳定、免费的股票数据一直…...

macOS玩家必备:OpenClaw+nanobot自动化办公实战

macOS玩家必备&#xff1a;OpenClawnanobot自动化办公实战 1. 为什么选择OpenClawnanobot组合&#xff1f; 作为一个长期在macOS上折腾自动化工具的老用户&#xff0c;我一直在寻找一个既能保持本地数据隐私&#xff0c;又能灵活处理办公场景的解决方案。直到遇到OpenClawnan…...