ProGuard配置详解

ProGuard是一个开源的Java class文件缩小器、优化器、混淆器和预验证器。它通过删除未使用的类、字段、方法和属性,优化字节码指令,并重命名类、字段和方法,使反编译后的代码难以理解,从而提高应用的安全性。以下是对ProGuard配置文件的一些详细解释和常见配置项的说明。

ProGuard配置文件结构

ProGuard的配置文件通常命名为proguard-rules.pro,并包含在Android项目的根目录或app模块目录中。配置文件由各种规则和选项组成,每个选项都定义了ProGuard在混淆和优化代码时应该执行的操作。

常见配置项

1. -keep 指令

-keep指令用于保留类、方法、字段不被混淆。可以指定具体的类、方法、字段或带有某些特征的类。

# 保留所有继承自Activity的类
-keep class * extends android.app.Activity# 保留所有带有特定注解的类
-keep @interface com.example.MyAnnotation# 保留所有实现特定接口的类
-keep class * implements java.io.Serializable
2. -keepclassmembers 指令

-keepclassmembers指令用于保留类中的特定成员不被混淆。

# 保留所有实现Serializable接口的类中的所有字段和方法
-keepclassmembers class * implements java.io.Serializable {static final long serialVersionUID;private static final java.io.ObjectStreamField[] serialPersistentFields;private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException;private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException;java.lang.Object writeReplace() throws java.io.ObjectStreamException;java.lang.Object readResolve() throws java.io.ObjectStreamException;
}
3. -dontwarn 指令

-dontwarn指令用于告诉ProGuard忽略特定类的警告信息。

# 忽略某些库的警告信息
-dontwarn com.squareup.okhttp3.**
-dontwarn com.google.gson.**
4. -keepattributes 指令

-keepattributes指令用于保留类文件中的特定属性。

# 保留注解属性
-keepattributes *Annotation*# 保留签名属性
-keepattributes Signature
5. -dontobfuscate 指令

-dontobfuscate指令用于告诉ProGuard不要混淆代码,只进行代码优化和压缩。

-dontobfuscate
6. -optimizations 指令

-optimizations指令用于指定哪些优化步骤可以被应用。

# 应用所有优化步骤
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
7. -printmapping 指令

-printmapping指令用于生成一个映射文件,记录了混淆前后的类、方法、字段的对应关系。

# 生成混淆映射文件
-printmapping mapping.txt

示例ProGuard配置文件

以下是一个常见的ProGuard配置文件示例,涵盖了基本的保留规则和常见的库配置。

# 保留所有注解属性
-keepattributes *Annotation*# 保留四大组件的类
-keep class * extends android.app.Activity
-keep class * extends android.app.Service
-keep class * extends android.content.BroadcastReceiver
-keep class * extends android.content.ContentProvider# 保留应用程序类
-keep public class * extends android.app.Application# 保留自定义视图类
-keep class * extends android.view.View {*** get*();void set*(***);void *(android.content.Context);
}# 保留 Parcelable 接口的实现类
-keep class * implements android.os.Parcelable {public static final android.os.Parcelable$Creator *;
}# 保留 Gson 注解
-keep class com.google.gson.annotations.SerializedName { *; }# 保留 Retrofit 的类
-keep class retrofit2.** { *; }
-keep class okhttp3.** { *; }
-keep class okio.** { *; }# 保留 ButterKnife 注解
-keep class butterknife.** { *; }
-keepclasseswithmembernames class * {@butterknife.* <fields>;
}# 保留序列化类
-keepclassmembers class * implements java.io.Serializable {static final long serialVersionUID;private static final java.io.ObjectStreamField[] serialPersistentFields;private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException;private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException;java.lang.Object writeReplace() throws java.io.ObjectStreamException;java.lang.Object readResolve() throws java.io.ObjectStreamException;
}# 忽略一些库的警告信息
-dontwarn com.squareup.okhttp3.**
-dontwarn com.google.gson.**# 生成混淆映射文件
-printmapping mapping.txt

注意事项

  1. 逐步调试:如果应用在混淆后崩溃或行为异常,可以逐步添加保留规则,以找出哪些类或方法需要保留。
  2. 保留规则覆盖范围要适当:保留规则覆盖范围过大可能会导致混淆效果减弱,覆盖范围过小可能会导致应用运行异常。
  3. 结合混淆报告:使用ProGuard生成的混淆报告(mapping文件)来调试和分析混淆后的代码,以确保代码混淆的正确性。

通过合理配置ProGuard,可以在保持应用功能完整的前提下,最大化混淆和优化效果,提高应用的安全性和性能。

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

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

相关文章

大语言模型-对比学习-Contrastive Learning

一、对比学习概念 对比学习是一种特殊的无监督学习方法。 旨在通过拉近相关样本的距离并且推远不相关样本的距离&#xff0c;来学习数据表示。 通常使用一种高自由度、自定义的规则来生成正负样本。在模型预训练中有着广泛的应用。 二、对比学习小案例 对比学习主要分为三个…

Git关联本地仓库和远程仓库

Step 1 添加远程仓库: git remote add <远程仓库别名><远程仓库地址> Step 2 git push -u <远程仓库名><分支名> 查看远程仓库: git remote -v 拉取远程仓库内容: 拉取服务器仓库过程中&#xff0c;如果本地和服务器有文件冲突&#xff0c;则会拉取失…

02 MySQL数据库管理

目录 1.数据库的结构 sql语言主要由以下几部分组成 2. 数据库与表的创建和管理 1&#xff0c;创建数据库 2&#xff0c;创建表并添加数据 3&#xff0c;添加一条数据 4&#xff0c;查询数据 5&#xff0c;更新数据 6&#xff0c;删除数据 3.用户权限管理 1.创建用户 …

js轮播图制作

实现一个简单的JavaScript轮播图可以通过以下步骤完成&#xff1a; 创建HTML结构&#xff0c;包括轮播图容器和图片列表。 使用CSS进行样式设置&#xff0c;包括隐藏多余的图片。 使用JavaScript编写函数来控制图片的切换。

wsl 下执行 systemctl 报错:Failed to get D-Bus connection: Operation not permitted

2024-07-21 01:31:47 补充 经过一系列查阅&#xff0c;关键词 wsl bad performance , 虚拟机启动慢可能是因为systemd 的启动项过多或耗时长。通过 dmesg 可以打印一些系统的启动信息&#xff0c;可以看到&#xff1a; [ 1.215065] systemd-journald[59]: Received reques…

C#中栈和堆以及修饰符

关于堆中字符串的存放 string s1"123" string s2"123" string s1"456" 此时s1输出为456 而s2仍然为123 因为在使用 String str "字符串" 的方式来创建String变量的时候&#xff0c;那么String的值便会存储在String常量池中&#x…

apache.commons.pool2 使用指南

apache.commons.pool2 使用指南 为什么要使用池 创建对象耗时较长&#xff0c;多线程频繁调用等因素限制了我们不能每次使用时都重新创建对象&#xff0c;使用池化思想将对象放进池内&#xff0c;不同线程使用同一个池来获取对象&#xff0c;极大的减少每次业务的调用时间。 …

Keepalived和Haproxy

Keepalived和Haproxy 一、Keepalived 1、keepalived概念 调度器的高可用 vip地址主备之间的切换&#xff0c;主在工作时&#xff0c;vip地址值在主上&#xff0c;主停止工作&#xff0c;vip飘移到备服务器 在主备的优先级不变的情况下&#xff0c;主恢复工作&#xff0c;v…

C++——编译报重复定义错误的解决办法

原因&#xff1a; 头文件被多次编译。 解决办法&#xff1a; 找到包含头文件的地方&#xff0c;仔细检查。 比如&#xff1a; 这两句话是包含关系&#xff0c;写了第一句就不用第二句了。 因为&#xff1a;第一句是编译 tracker/detector/rknn_model_zoo/examples/yolov5/c…

【MySQL进阶之路 | 高级篇】简谈redo日志

1. 前言 事务有四种特性&#xff1a;原子性&#xff0c;一致性&#xff0c;隔离性和持久性。那么事务的四种特性到底是基于什么机制实现呢&#xff1f; 事务的隔离性由锁机制实现。而事务的原子性&#xff0c;一致性和持久性由事务的redo日志和undo日志来保证。 REDO LOG称为…

云计算实训13——DNS域名解析、ntp时间服务器配置、主从DNS配置、多区域DNS搭建

一、DNS域名解析 1.正向解析 将域名解析为IP地址 DNS正向解析核心配置 (1)安装bind [rootdns ~]# yum -y install bind (2)编辑配置文件 编辑named.conf文件&#xff0c;限定访问权限 [rootdns ~]# vim /etc/named.conf 编辑named.rfc文件&#xff0c;指定要访问的域名 [ro…

【数据结构】:用Java实现链表

在 ArrayList 任意位置插入或者删除元素时&#xff0c;就需要将后序元素整体往前或者往后搬移&#xff0c;时间复杂度为 O(n)&#xff0c;效率比较低&#xff0c;因此 ArrayList 不适合做任意位置插入和删除比较多的场景。因此&#xff1a;java 集合中又引入了 LinkedList&…

Golang Gin框架部署二级目录打包的Vue前端项目小记

概述 因为最近在公司开发项目遇到一个需求 - 我们自己开发的B/S系统(以下简称&#xff1a;二级系统)作为二级子系统嵌入到三方企业的主系统&#xff0c;界面入口是主系统。经过一番折腾&#xff0c;成功实现&#xff0c;故而博文记录&#xff0c;用以备忘 可行方案 针对上述…

一步一步测试DNS隧道

目录 0、前言 1、DNS解析 1.1 DNS简介 1.2 DNS查询类型 1.3 DNS解析过程 2、DNS隧道准备工作 2.1 DNS隧道介绍 2.1.1 什么是DNS隧道&#xff1f; 2.1.2 DNS隧道的原理 2.2 客户端、服务端准备 2.3 域名准备 2.4 连接隧道 2.5 遇坑 3、隧道确认和利用…

Windows本地启动Redis

找到本地redis目录 输入cmd,然后输入redis-server.exe redis.windows.conf&#xff0c;默认端口为6379 再新打开一个cmd&#xff0c;输入redis-cli.exe -p 6379 -a &#xff08;你在redis.windows.conf中设置的密码&#xff09;

Kylin跨Cube查询:数据洞察的无限可能

Kylin跨Cube查询&#xff1a;数据洞察的无限可能 Apache Kylin是一个开源的分布式分析引擎&#xff0c;旨在为Hadoop平台提供快速的SQL查询能力。它通过预计算和存储数据立方体&#xff08;Cube&#xff09;来实现这一点。然而&#xff0c;随着数据量的增长和业务需求的多样化…

如何做好服务器的安全管理

以下是一些服务器安全防护措施&#xff1a; 1、安装杀毒软件&#xff1a;安装杀毒软件是保护服务器免受病毒和恶意软件攻击的基本措施之一。保持杀毒软件更新至最新版本&#xff0c;定期扫描检测服务器以确保其不被病毒、蠕虫等恶意软件入侵。保护服务器免受侵害。像360杀毒&am…

HarmonyOS NEXT星河版零基础入门到实战

文章目录 一、HarmonyOS NEXT介绍学习内容1、鸿蒙APP开发2、能力套件开发3、全场景开发适合人群 持续更新中✒️总结 一、HarmonyOS NEXT介绍 放弃安卓框架之后&#xff0c;HarmonyOS NEXT成为真正独立于安卓、iOS的操作系统&#xff0c;堪称是一场史无前例的脱胎换骨。在其众多…

服务器利用宝塔面板部署Django项目

目录 1. 使用命令启动Django项目1.1 使用 Xshell 连接服务器1.2 安装Anaconda1.3 启动Django项目1.4 使用tmux实现项目的后台运行 2. 使用Python项目管理器部署项目2.1 安装宝塔面板和软件2.2 添加站点2.3 上传项目文件2.3.1 收集静态文件2.3.2 生成依赖文件 2.4 安装安装Pytho…

【周记】2024暑期集训第二周(未完待续)

文章目录 日常刷题记录合并果子题目解析算法思路代码实现 中位数题目解析算法思路代码实现 C学习笔记队列queue双端队列 deque优先队列 priority_queue定义常见操作 upper_bound 日常刷题记录 合并果子 题目解析 有一堆果子&#xff0c;每次可以将两小堆合并&#xff0c;耗费…