如何使用 Proguard 缩小 Flutter 应用程序?
How to minify a Flutter app with Proguard?
我已经制作了一个 Flutter 应用程序。发行版 apk 大约 14MB。我搜索了缩小它的方法并找到了这个:https://flutter.io/android-release/#enabling-proguard
但我的问题是,我如何才能了解我在第 1 步中使用的所有其他库?是否有任何命令可以了解它们,或者只是我添加到 pubspec.yaml
的所有依赖项?
我如何在这个文件/android/app/proguard-rules.pro
中实现它们?
如果您使用的是 Firebase,请参阅
接下来,您需要考虑 pubspec.yaml
中的依赖关系 您可以立即忽略任何纯 Dart 包 - 您只是在寻找插件。在这些插件中,您只对那些利用现有库的插件感兴趣。您可能已将这些添加到 gradle。这些是您需要防止名称缩短的内容。
最简单的方法可能就是尝试一下,看看 NoClassDefFoundError
中会弹出哪些包名称,然后不断迭代添加它们。
正如 Remi 所说,您的收益将是微乎其微的,所以这真的值得麻烦。在即将发布的版本中,您应该会看到 APK 大小有所改进。
首先,我们将在构建文件中启用收缩和混淆。找到位于 /android/app/
文件夹内的 build.gradle
文件并添加粗体行
android {
...
buildTypes {
release {
signingConfig signingConfigs.debug
minifyEnabled true
useProguard true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
接下来我们将创建一个配置来保留整个 Flutter 包装器代码。创建 /android/app/proguard-rules.pro
文件并插入其中:
#Flutter Wrapper
-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.** { *; }
-keep class io.flutter.util.** { *; }
-keep class io.flutter.view.** { *; }
-keep class io.flutter.** { *; }
-keep class io.flutter.plugins.** { *; }
我会在这里留下这个答案,作为对任何必须处理这个问题并遇到这个话题的可怜人的补充。
截至 2021 年 12 月,使用最新的 Android Sdk、Studio 和 Flutter 版本,如果您尝试这样做useProguard true
,它将无法工作,因为它已过时。
可悲的是,Gradle 不会告诉你这个,相反,你会得到这样的错误:
A problem occurred evaluating project ':app'.
> No signature of method: build_7cqkbrda1q788z3b02yxbvrx9.android() is applicable for argument types: (build_7cqkbrda1q788z3b02yxbvrx9$_run_closure2) values: [build_7cqkbrda1q788z3b02yxbvrx9$_run_closure2@41108b15]
如您所见,这完全是胡言乱语,毫无用处。秘诀就是根本不使用 useProguard
。默认情况下,Flutter 设置为使用 R8,它现在在 Android.
上处理缩小
这里有一个post关于这个的供参考:
我已经制作了一个 Flutter 应用程序。发行版 apk 大约 14MB。我搜索了缩小它的方法并找到了这个:https://flutter.io/android-release/#enabling-proguard
但我的问题是,我如何才能了解我在第 1 步中使用的所有其他库?是否有任何命令可以了解它们,或者只是我添加到 pubspec.yaml
的所有依赖项?
我如何在这个文件/android/app/proguard-rules.pro
中实现它们?
如果您使用的是 Firebase,请参阅
接下来,您需要考虑 pubspec.yaml
中的依赖关系 您可以立即忽略任何纯 Dart 包 - 您只是在寻找插件。在这些插件中,您只对那些利用现有库的插件感兴趣。您可能已将这些添加到 gradle。这些是您需要防止名称缩短的内容。
最简单的方法可能就是尝试一下,看看 NoClassDefFoundError
中会弹出哪些包名称,然后不断迭代添加它们。
正如 Remi 所说,您的收益将是微乎其微的,所以这真的值得麻烦。在即将发布的版本中,您应该会看到 APK 大小有所改进。
首先,我们将在构建文件中启用收缩和混淆。找到位于 /android/app/
文件夹内的 build.gradle
文件并添加粗体行
android {
...
buildTypes {
release {
signingConfig signingConfigs.debug
minifyEnabled true
useProguard true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
接下来我们将创建一个配置来保留整个 Flutter 包装器代码。创建 /android/app/proguard-rules.pro
文件并插入其中:
#Flutter Wrapper
-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.** { *; }
-keep class io.flutter.util.** { *; }
-keep class io.flutter.view.** { *; }
-keep class io.flutter.** { *; }
-keep class io.flutter.plugins.** { *; }
我会在这里留下这个答案,作为对任何必须处理这个问题并遇到这个话题的可怜人的补充。
截至 2021 年 12 月,使用最新的 Android Sdk、Studio 和 Flutter 版本,如果您尝试这样做useProguard true
,它将无法工作,因为它已过时。
可悲的是,Gradle 不会告诉你这个,相反,你会得到这样的错误:
A problem occurred evaluating project ':app'.
> No signature of method: build_7cqkbrda1q788z3b02yxbvrx9.android() is applicable for argument types: (build_7cqkbrda1q788z3b02yxbvrx9$_run_closure2) values: [build_7cqkbrda1q788z3b02yxbvrx9$_run_closure2@41108b15]
如您所见,这完全是胡言乱语,毫无用处。秘诀就是根本不使用 useProguard
。默认情况下,Flutter 设置为使用 R8,它现在在 Android.
这里有一个post关于这个的供参考: