Proguard的Mapping文件

本文介绍了Proguard如何通过替换有意义的字符串来混淆代码,并保留映射关系。此外还讲解了如何利用编译后的mapping文件找回被删除的第三方SDK的class文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Proguard会用无意义的文字替换掉代码中有意义的字符串,并在build/outputs/mapping/debug中留下替换的字符串和被替换的字符串的映射关系的文本:mapping.txt 。在用第三方sdk时有可能因为Proguard而将所用到的class删除掉,可以在编译的mapping文件中找到原本的class的名字,从而keep起来。
### 关于 ProGuard 配置文件的示例及用法 ProGuard 是一种用于 Java 应用程序的工具,能够优化、缩小和混淆代码。其配置文件通常命名为 `proguard-rules.pro` 或类似的名称,并包含了定义如何处理应用程序的各种规则。 #### 1. **基本配置结构** ProGuard 的配置文件由一系列命令组成,这些命令决定了哪些部分的代码会被保留、移除或者混淆。以下是常见的配置项及其作用: - `-injars`: 输入 jar 文件的位置。 - `-outjars`: 输出 jar 文件的目标位置。 - `-libraryjars`: 指定外部库文件的位置。 - `-keep`: 定义需要保持不变的部分(不被压缩或混淆)。这通常适用于入口点或其他重要组件。 - `-dontwarn`: 忽略某些警告信息。 - `-optimizationpasses`: 设置优化过程执行的次数。 完整的配置文件可能如下所示[^1]: ```plaintext -injars input.jar -outjars output.jar -libraryjars /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/rt.jar -dontwarn com.example.** -keep public class * { public protected *; } -optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -verifysharedlibraries -optimizecode true -obfuscationdictionary obfuscation.txt -classobfuscationdictionary class_obfuscation.txt -packageobfuscationdictionary package_obfuscation.txt ``` #### 2. **Android 中的具体配置** 在 Android 开发中,ProGuard 主要用来保护 APK 不易被反编译并减少体积。默认情况下,Gradle 已经集成好了 ProGuard 支持,只需修改 `build.gradle` 和对应的 `.pro` 文件即可生效。 下面是一个典型的 Android ProGuard 配置文件示例[^2]: ```plaintext # 保留 R 类中的资源 ID 字段名 -keepclassmembers class **.R$* { public static <fields>; } # 保留 Parcelable 实现类的信息 -keep class * implements android.os.Parcelable { public static final ** CREATOR; } # 保留自定义 View 组件的方法签名 -keepclasseswithmembernames class * { native <methods>; } # 如果使用 Retrofit,则需添加以下规则来防止接口被混淆 -keep,allowobfuscation interface * extends retrofit2.CallAdapter -keep,allowobfuscation interface * extends retrofit2.Converter -keepattributes Signature -keepattributes Exceptions ``` #### 3. **Spring Boot 示例项目中的配置** 对于基于 Spring Boot 的项目,ProGuard 可以进一步精简最终打包的应用程序大小。例如,在一个名为 `proguard-spring-boot-example` 的教程中提到过这样的场景[^4]: 假设我们有一个简单的 REST API 接口服务,为了确保功能正常运行而不破坏依赖关系,可以在 ProGuard 配置文件中加入类似的内容: ```plaintext # 保留所有的 Controller 层逻辑不受影响 -keep @org.springframework.stereotype.Controller public class * { public protected private *; } # 对 Hibernate 查询语句做特殊处理以防 SQL 被错误替换掉 -keepclassmembers class * extends org.hibernate.cfg.Configuration { void addAnnotatedClass(java.lang.Class); } ``` #### 4. **高级调试技巧** 当遇到复杂情况时,可以通过调整参数观察中间状态的变化。比如设置日志级别更详细的输出模式,便于定位问题所在之处[^3]: ```plaintext -printmapping mapping.txt # 打印映射表到指定文件 -renamesourcefileattribute SourceFile # 记录源码文件名对应关系 -verbose # 显示更多细节消息 ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值