📜  proguards 的改造问题 (1)

📅  最后修改于: 2023-12-03 14:45:40.197000             🧑  作者: Mango

Proguard 的改造问题

Proguard 是一款用于压缩、优化和混淆 Android 应用代码的工具。它可以大大减小应用的大小,并增加应用运行时的性能。然而,在使用 Proguard 进行改造时,程序员可能会遇到一些问题。本文将介绍一些常见的 Proguard 改造问题,并提供解决方案。

1. 类或方法找不到(NoSuchMethodError、ClassNotFoundException)

当使用 Proguard 对代码进行混淆时,有时会出现类或方法找不到的问题。这是因为 Proguard 默认会删除未使用的代码,并重新命名类和方法,这可能导致运行时找不到相关的类或方法。

解决方案:

  • 配置保留类和方法: 可以通过在 Proguard 配置文件中添加 -keep 选项来保留特定的类和方法,确保它们不会被删除或重命名。
  • 使用 -keepnames: 这个选项可以保留类和方法的名称,而不对其进行重命名。

例子:

-keep class com.example.MyClass
-keepclassmembers class com.example.MyClass {
    public <methods>;
}
2. 资源文件丢失或混淆(ResourceNotFoundException)

Proguard 还可能导致应用的资源文件丢失或混淆,例如布局文件、图片和字符串等。这是因为 Proguard 默认会删除未使用的资源文件,并将资源文件的名称进行混淆。

解决方案:

  • 保留资源文件: 添加 -keep 选项来保留特定的资源文件,确保它们不会被删除或混淆。
  • 使用资源文件规则: 在 Proguard 配置文件中添加规则来保护资源文件,例如 -keepresources

例子:

-keep class com.example.R$layout
-keepresources layout/my_layout.xml
3. 反射失效(Reflection Not Working)

在使用反射机制访问类、方法或字段时,Proguard 可能导致反射失效。这是因为 Proguard 默认会重命名类和成员,反射机制无法正确找到它们。

解决方案:

  • 配置保留类和成员: 使用 -keep 选项来保留特定的类和成员,确保它们不会被删除或重命名。
  • 使用注解: 在需要反射的类或方法上添加注解,告诉 Proguard 不要对其进行混淆。

例子:

-keep class com.example.MyClass
-keepclassmembers class com.example.MyClass {
    @com.example.MyAnnotation *;
}
4. Obfuscation Mapping 文件丢失(No Mapping File)

Proguard 生成的 obfuscation mapping 文件用于将混淆后的类和成员对应回原始名称。然而,有时候这个文件可能丢失,导致无法还原混淆后的代码。

解决方案:

  • 配置生成 mapping 文件: 可以在 Proguard 配置文件中添加 -printmapping 选项,指定 mapping 文件的路径和名称。
  • 检查构建工具配置: 确保构建工具(如 Gradle)正确配置了生成 mapping 文件的任务。

例子:

-printmapping path/to/mapping.txt

以上是一些常见的 Proguard 改造问题及其解决方案。通过正确配置 Proguard 并灵活运用相关选项,可以解决大部分与 Proguard 改造相关的问题,为 Android 应用提供更好的性能和安全性。