📅  最后修改于: 2023-12-03 15:13:21.379000             🧑  作者: Mango
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,以满足我们对代码混淆的要求。