代码混淆的步骤

在 Android 开发中,代码混淆(ProGuard/R8)是保护代码安全和缩减应用体积的关键步骤。以下是详细的混淆流程和优化策略:


一、基础混淆步骤

1. 启用混淆

build.gradle 中配置:

android {buildTypes {release {minifyEnabled true   // 启用代码压缩和混淆shrinkResources true // 移除无用资源(需配合minifyEnabled)proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}
}
2. 选择默认规则文件
  • proguard-android.txt:基本优化(保守)
  • proguard-android-optimize.txt:激进优化(可能影响部分代码)
3. 自定义混淆规则(proguard-rules.pro)
# 保留实体类(避免JSON解析失败)
-keep class com.example.model.** { *; }# 保留View绑定类
-keep class * extends androidx.viewbinding.ViewBinding { *; }# 保留注解(某些框架依赖注解)
-keepattributes *Annotation*# 保留JNI方法
-keepclasseswithmembernames class * {native <methods>;
}

二、关键配置详解

1. 保留必要的类/方法
# 保留所有Activity(避免被重命名)
-keep public class * extends android.app.Activity# 保留回调方法(如点击事件)
-keepclassmembers class * {public void onClick(android.view.View);
}# 保留序列化类
-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);
}
2. 第三方库规则
# Retrofit
-keepattributes Signature
-keepattributes RuntimeVisibleAnnotations
-keep class retrofit2.** { *; }
-dontwarn retrofit2.**# OkHttp
-keep class okhttp3.** { *; }
-keep interface okhttp3.** { *; }
-dontwarn okhttp3.**# Glide
-keep public class * implements com.bumptech.glide.module.GlideModule
3. 避免过度混淆
# 保留R文件资源ID(避免动态获取资源失败)
-keepclassmembers class **.R$* {public static <fields>;
}# 保留自定义View的构造方法
-keep public class * extends android.view.View {public <init>(android.content.Context);public <init>(android.content.Context, android.util.AttributeSet);
}

三、高级优化技巧

1. 代码压缩策略
# 移除日志代码(需配合代码优化)
-assumenosideeffects class android.util.Log {public static *** d(...);public static *** v(...);
}
2. 资源混淆(配合AndResGuard)
// 在app/build.gradle中添加
apply plugin: 'AndResGuard'
buildAndResGuard {mappingFile = file("resource_mapping.txt")use7zip = truekeepRoot = false
}
3. 多模块配置

在库模块中声明:

# library/proguard-rules.pro
-consumerproguardfiles 'consumer-rules.pro'

四、验证与调试

1. 检查混淆结果
  • 查看 build/outputs/mapping/release/mapping.txt
  • 使用 retrace 工具还原堆栈:
    retrace -verbose mapping.txt stacktrace.txt
    
2. 测试关键场景
  • 反射调用的类是否保留
  • JNI方法是否正常工作
  • 动态加载的类是否可访问
3. 常见错误处理
错误类型解决方案
ClassNotFoundException检查是否过度混淆,添加-keep规则
NoSuchMethodError保留相关方法:-keepclassmembers class * { public void methodName(); }
JSON解析失败保留实体类字段:-keepclassmembers class * { *** get*(); void set*(***); }

五、ProGuard vs R8

特性ProGuardR8(Android默认)
速度快(Google优化版)
规则兼容性完全兼容部分特殊规则需调整
DEX处理需配合D8直接输出DEX
增量编译不支持支持

从 Android Studio 3.4 开始,R8 已成为默认混淆工具,但仍兼容ProGuard规则。


六、安全增强建议

  1. 字符串加密:使用第三方工具(如DexGuard)加密敏感字符串
  2. Native代码保护:关键逻辑放到JNI中并加固
  3. 反调试检测:在Application中植入反调试代码

通过合理配置混淆规则,可实现:

  • 代码体积减少 20%~50%
  • 反编译难度大幅提升
  • 运行时性能提升(移除无用代码)

建议每次发布前进行全量回归测试,确保混淆不会影响核心功能。

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

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

相关文章

分布式集合通信--学习笔记

分布式集合通信一 基础概念 分布式系统模型 节点与进程模型 多机多卡、多机多进程通信模式 同步 、异步 集合通信定义 点对点通信 vs 集合通信 点对点通信 定义 &#xff1a;两个节点之间的直接数据传输&#xff0c;通常基于专用链路或网络路径通信范围&#xff1a;仅涉及两…

工业显示器五大品牌推荐及分析

在智能制造与工业自动化中&#xff0c;工业显示器扮演着至关重要的角色&#xff0c;最近好多朋友问我有没有什么卖工业显示的厂家推荐。那今天我为大家整理了5个工业显示器厂家品牌推荐&#xff0c;希望可以帮助您挑选到合适的工业显示器一、佳维视&#xff08;JAWEST&#xff…

ComfyUI工作流:一键换背景体验不同场景

换背景效果展示 在图像编辑领域&#xff0c;背景替换是提升作品视觉效果与创意表达的重要手段。魔多 AI 社区推出的 “一键换背景” ComfyUI 工作流&#xff0c;凭借先进的 AI 技术与极简操作流程&#xff0c;为用户提供了高效、精准的背景替换解决方案。本文将从技术原理、功能…

图像旋转:从原理到 OpenCV 实践

在图像处理领域&#xff0c;图像旋转是一项基础且重要的操作。它不仅可以改变图像的方向&#xff0c;还在许多计算机视觉任务中发挥着关键作用&#xff0c;比如目标检测、图像配准等。本文将深入探讨图像旋转的原理&#xff0c;并结合 OpenCV 库提供具体的实现代码。 一、图像…

微服务架构下的抉择:Consul vs. Eureka,服务发现该如何选型?

微服务架构下的抉择&#xff1a;Consul vs. Eureka&#xff0c;服务发现该如何选型&#xff1f; 引言 想象一下&#xff0c;我们正在构建一个大型电商平台。在“双十一”大促期间&#xff0c;流量洪峰涌入&#xff0c;订单服务、商品服务、用户服务等都需要弹性伸缩&#xff…

基于Java+SpringBoot的宠物爱心组织管理系统

源码编号&#xff1a;S572 源码名称&#xff1a;基于SpringBoot的宠物爱心组织管理系统 用户类型&#xff1a;双角色&#xff0c;用户、管理员 数据库表数量&#xff1a;15 张表 主要技术&#xff1a;Java、Vue、ElementUl 、SpringBoot、Maven 运行环境&#xff1a;Windo…

数字样机:改写卫星物联网的研制范式

01. 卫星物联网&#xff1a;技术边界的自然延伸 随着物联网在城市、工业、农业等领域的广泛部署&#xff0c;万物互联的愿景正在不断逼近技术的边界。尤其是在海洋、沙漠、高原、边远山区等传统通信网络难以覆盖的区域&#xff0c;人们对无盲点物联网连接的需求日益增强。这一…

springsecurity---使用流程、加密机制、自定义密码匹配器、token字符串生成

目录 权限控制 相关框架 SpringSecurity springsecurity使用流程 1、搭建环境实现默认用户名和密码登录 2、使用数据库表中定义好的用户名和密码访问实现等值密码匹配 1&#xff09;sql文件 2)搭建jdbc或者mybatis或者mybatis-plus环境 3&#xff09;配置mybatis-plus环…

在 Ubuntu 22.04 上使用 Minikube 部署 Go 应用到 Kubernetes

文章目录 环境说明目标步骤与问题解决1. 构建 Go 应用和 Docker 镜像问题 1&#xff1a;Go 依赖下载卡住问题 2&#xff1a;Docker 镜像拉取失败 2. 设置 Minikube 集群安装 Minikube问题 3&#xff1a;Minikube 启动失败问题 4&#xff1a;Minikube 镜像拉取失败 3. 部署 Kube…

Android Studio-Git的使用指南

一、git的基本使用流程 git clone 克隆远程资源到本地目录&#xff0c;作为工作目录&#xff1b;然后在本地的克隆目录上添加或修改文件&#xff1b;如果远程修改了&#xff0c;需要同步远程的内容&#xff0c;直接git pull就可以更新本地的文件&#xff1b;本地在修改之后&…

【github】想fork的项目变为私有副本

在 GitHub 上&#xff0c;所有的 fork 都会继承其上游仓库&#xff08;upstream&#xff09;的可见性&#xff08;visibility&#xff09;设置&#xff1a; 可见性继承 如果你 fork 的原仓库是 public&#xff0c;那么你的 fork 也必须是 public。如果原仓库是 private&#xf…

微软发布新一代存储优化型虚拟机:Azure Laosv4、Lasv4 和 Lsv4 系列

微软宣布&#xff0c;全新一代存储优化型虚拟机——Azure Laosv4、Lasv4 和 Lsv4 系列已正式面世。 与前一代虚拟机系列相比&#xff0c;全新的 L 系列虚拟机实现了重大突破。它支持高达 23TB 的本地 NVMe SSD&#xff0c;在 CPU、网络以及远程存储性能方面均有显著提升。该系…

python调用pybind11导出的pyd,出现UnicodeDecodeError

python调用pybind11导出的pyd&#xff0c;出现UnicodeDecodeError 1. 问题描述 举个例子&#xff0c;当有以下C代码以及Pybind11的绑定代码时&#xff0c;在python访问包含中文的Name和Value会有UnicodeDecodeError的异常&#xff01; class VxUserProp{public:VxUserProp();…

MySQL别名在GROUP BY中的使用规则

-- 设置变量&#xff1a;SET earliest_date ... 用于定义并赋值一个用户变量 earliest_date。 -- 用户定义的变量必须以 符号开头&#xff0c;例如 earliest_date。 -- 符号是MySQL中用户变量的标识符&#xff0c;用于区分系统变量和用户变量。 SET earliest_date (SELECT …

2025.7.4总结

感恩环节:感谢今日工作顺利度过&#xff0c;明天终于能美美的睡个懒觉了。感谢这周有个美好的双休。今日去实验室参观设备&#xff0c;感谢我的一个同事解答了我关于硬件设备与所做软件业务之间的关系&#xff0c;通过控制器控制网元等相关设备&#xff0c;同时&#xff0c;虽然…

Prompt 精通之路(五)- 构建你的“AI 指令系统”:超越简单提问的 CRISPE 与 APE 框架

&#x1f680; Prompt 精通之路&#xff1a;系列文章导航 第一篇&#xff1a;[本文] AI 时代的新语言&#xff1a;到底什么是 Prompt&#xff1f;为什么它如此重要&#xff1f;第二篇&#xff1a;告别废话&#xff01;掌握这 4 个黄金法则&#xff0c;让你的 Prompt 精准有效第…

#NFT艺术品哈希值唯一性与《民法典》“网络虚拟财产”认定的冲突

首席数据官高鹏律师数字经济团队创作&#xff0c;AI辅助 一、当区块链的「绝对唯一」遇上法律的「弹性空间」 每个NFT艺术品背后的哈希值&#xff0c;都像用数学密码刻在区块链上的指纹——世界上没有任何两个完全相同的编码。这种由0和1构筑的「数字DNA」&#xff0c;被技术信…

【arXiv2025】计算机视觉|即插即用|LBMamba:革新视觉模型效率,性能炸裂

论文地址&#xff1a;https://arxiv.org/pdf/2506.15976 代码地址&#xff1a;https://github.com/CiaoHe/bi-mamba 关注UP CV缝合怪&#xff0c;分享最计算机视觉新即插即用模块&#xff0c;并提供配套的论文资料与代码。 https://space.bilibili.com/473764881 摘要 Mamba…

【狂飙AGI】第7课:AGI-行业大模型(系列1)

目录 &#xff08;一&#xff09;服装史的GPT时刻&#xff08;二&#xff09;AI多学科诊疗系统&#xff08;三&#xff09;医疗大模型&#xff08;四&#xff09;生物医药大模型&#xff08;五&#xff09;教育大模型&#xff08;六&#xff09;心理大模型&#xff08;七&#…

(LeetCode 每日一题) 3307. 找出第 K 个字符 II (位运算、数学)

题目&#xff1a;3307. 找出第 K 个字符 II 思路&#xff1a;位运算&#xff0c;时间复杂度0(logk)。 当2^(i-1) <k 且 2^i>k &#xff0c;说明k在K2^i的右半段 &#xff0c;k和其前半段的某个字符有关系 即当k>K时&#xff0c;k是由k-K位置上的字符变化而来&#xf…