📜  如何在 Android 应用中正确使用 Proguard?(1)

📅  最后修改于: 2023-12-03 15:38:12.706000             🧑  作者: Mango

如何在 Android 应用中正确使用 Proguard?

Proguard 是一个 Java 字节码混淆工具。它可以将 Java 代码中的类、方法、变量名等信息混淆,从而增加反编译难度,保护源代码不被恶意使用。Proguard 可以极大地减小应用的大小,提高应用的安全性和性能。本文将介绍如何在 Android 应用中正确使用 Proguard。

1. 配置 Proguard

首先需要在 Android 项目中配置 Proguard,可以在 build.gradle 文件中添加以下代码:

android {
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

其中 minifyEnabled true 表示启用代码混淆,getDefaultProguardFile('proguard-android-optimize.txt') 表示使用默认的 Proguard 配置文件,proguard-rules.pro 表示自定义的 Proguard 配置文件。

Proguard 配置文件是一个以 .pro 结尾的文件,可以在文件中配置需要保留的类、方法、变量名等信息。

2. 配置 Proguard 规则

在 Proguard 配置文件中可以添加多条规则,规定需要保留的类、方法、变量名等信息。以下是一些常用规则:

2.1 保留 Application 类
-keep class com.example.app.MyApplication {
    *;
}

这条规则表示保留 MyApplication 类中的所有成员变量和方法。

2.2 保留特定包下的所有类和成员变量
-keep class com.example.app.** {
    *;
}

这条规则表示保留 com.example.app 包下的所有类中的所有成员变量和方法。

2.3 保留特定类中的所有方法
-keepclassmembers class com.example.app.MyClass {
    public *;
}

这条规则表示保留 Myclass 类中的所有 public 方法。

2.4 保留特定类中的特定方法
-keep class com.example.app.MyClass {
    void myMethod(int);
}

这条规则表示保留 Myclass 类中的 myMethod(int) 方法。

2.5 保留特定类中的特定成员变量
-keepclassmembers class com.example.app.MyClass {
    int myField;
}

这条规则表示保留 Myclass 类中的 myField 成员变量。

3. 配置 Proguard 规则插件

在 Proguard 配置文件中添加规则可以保留特定的类、方法、变量名等信息。但是,手动添加规则十分繁琐,而且容易出错。因此可以使用 Android Studio 提供的 Proguard 规则插件来自动生成 Proguard 规则。

打开 Android Studio,选择菜单栏中的 File -> New -> Plugin -> Proguard Rules,输入需要保留的类、方法、变量名等信息,插件会自动生成相应的 Proguard 规则。将生成的规则复制到 Proguard 配置文件中即可。

4. 配置 Proguard 日志

使用 Proguard 时可能会出现一些问题,例如应用崩溃、类找不到等。可以通过配置 Proguard 日志来查看详细的错误信息。

在 build.gradle 文件中添加以下代码:

android {
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            // 配置 Proguard 日志
            // 以下配置将日志输出到文件
            // 也可以将文件名改为 /dev/stdout ,将日志输出到控制台
            // 也可以使用 Android Studio 自带的 Logcat 工具查看日志
            // Android Studio 中的日志过滤器为 Proguard
            // 也可以在命令行中使用 adb logcat -s Proguard 查看日志
            // 这些日志将自动添加到 Android Studio 中。点击「Build」->「Edit Configurations」->「Logs」->「Proguard」,将文件名改为 /dev/stdout。
            // 如果需要输出更详细的日志,可以在 Proguard 配置文件中添加以下配置:
            // -dontobfuscate
            // -printobfuscation
            // -printmapping
            // -printseeds
            // -printusage
            // -dump class_files.txt
            // -dump xml_files.txt
            // -dump html_files.txt
            // -printconfiguration
            // -verbose
            // -whyareyoukeeping com.example.app.MyClass
            // -keepattributes Signature,InnerClasses
            // -keepdirectories
            // -dontskipnonpubliclibraryclasses
            // -dontskipnonpubliclibraryclassmembers
            // -dontshrink
            // -dontoptimize
            // -dontnote
            // -dontwarn
            // 以上配置将在日志中输出相应的信息。
            // 相关配置可以参考 Proguard 官方文档。
            // Proguard 官方文档中还有一些高级配置,可以根据需要进行配置。
            // 地址为:https://www.guardsquare.com/en/products/proguard/manual
            consumerProguardFiles 'proguard-rules.pro'
            proguardFile 'proguard-rules.pro'
            seedFile file('proguard-seeds.txt')
            mappingFile file('proguard-mapping.txt')
        }
    }
}

在 Proguard 配置文件中添加以下代码:

# 配置 Proguard 日志
# 输出报错信息到控制台
-printseeds seeds.txt
-printusage usage.txt
-printmapping mapping.txt
-printconfiguration configuration.txt
-dontwarn

以上配置将在应用构建时生成 seeds.txt、usage.txt、mapping.txt、configuration.txt 文件,包含相应的详细信息。可以根据需要进行配置。

5. 总结

本文介绍了如何在 Android 应用中正确使用 Proguard。在使用 Proguard 时需要注意以下几点:

  1. 配置 Proguard 时不能将所有的类、方法、变量名都混淆掉,否则将影响应用的正常运行。
  2. 需要保留 Android 系统中的一些类,例如 Activity、Service、BroadcastReceiver 等。
  3. 需要保留应用中用到的一些库,例如 Retrofit、OkHttp、Gson 等。
  4. 在使用 Proguard 时可能会出现一些问题,例如应用崩溃、类找不到等。可以通过配置 Proguard 日志来查看详细的错误信息。

Proguard 是一个非常强大的工具,它可以保证应用的安全性和性能,减小应用的大小。但是,在使用 Proguard 时也需要认真对待,仔细配置。如果配置不当,将会对应用的正常运行造成严重影响。