📜  Android 中的 ProGuard(1)

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

Android 中的 ProGuard

ProGuard 是 Android 中用于混淆和优化代码的工具。它可以去除未使用的类、字段和方法,缩小 APK 大小,并将代码变得更难以被反编译。在发布 Android 应用时使用 ProGuard 是一项很好的实践。

配置

ProGuard 默认被包含在 Android SDK 中。要使用 ProGuard,请将以下行添加到你的 build.gradle 文件中:

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

这将使 ProGuard 对 release 应用启用混淆。getDefaultProguardFile 方法返回了一个默认的 ProGuard 规则文件,该文件包含了 Android 平台和其他常见库中的规则。我们还可以使用自己的规则文件,它们将优先于默认规则。在本示例中,我们使用了名为 proguard-rules.pro 的自定义规则文件。

我们可以在 proguard-rules.pro 文件中添加自己的规则。例如,以下规则将避免在混淆期间从 View 中删除其字段名称:

-keepclassmembers class * extends android.view.View {
    public void set*(***);
    public *** get*();
}
常见问题
运行时错误

在运行混淆的应用时,可能会发生此类错误:

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.myapp/com.example.myapp.MainActivity}: java.lang.ClassNotFoundException: Didn't find class "com.example.myapp.MainActivity" on path: DexPathList[[zip file "/data/app/com.example.myapp-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]

这是因为 ProGuard 将代码中使用的类和方法重命名,而应用在打包过程中并没有正确地处理这些变化。

为避免这样的问题,我们可以添加以下规则:

-keep class com.example.myapp.MainActivity

-keep 指令告诉 ProGuard 保留指定的类,以避免在混淆时将其移除。

混淆代码不正常工作

在检查混淆应用时,你可能会发现应用不再按预期方式运行。在这种情况下,你可能需要告诉 ProGuard 留下更多的代码。

以下指令将保留整个包 com.example.myapp 中的类:

-keep class com.example.myapp.**

请注意,此操作可能会使 APK 文件更大。因此,需要谨慎使用。

结论

在发布 Android 应用时,使用 ProGuard 是一个很好的实践。它有助于保护应用代码,使其更少更短,而且减少 APK 文件大小。我们可以通过添加自己的规则来定制 ProGuard,以满足我们对代码混淆的要求。