如何使用 Proguard 缩小 Flutter 应用程序?

Posted

技术标签:

【中文标题】如何使用 Proguard 缩小 Flutter 应用程序?【英文标题】:How to minify a Flutter app with Proguard? 【发布时间】:2019-02-24 23:49:30 【问题描述】:

我已经制作了一个 Flutter 应用。发布的 apk 约为 14MB。我搜索了缩小这个的方法,发现了这个:https://flutter.io/android-release/#enabling-proguard

但我的问题是,如何才能了解我在第 1 步中使用的所有其他库?是否有任何命令可以了解它们,或者只是我添加到 pubspec.yaml 的所有依赖项?

如何在这个文件/android/app/proguard-rules.pro实现它们?

【问题讨论】:

我怀疑职业后卫会做很多事情。 Dart 编译已经使用摇树。因此,除非您直接用 Java 编写代码(这不太可能),否则胜利是微乎其微的。也许这个大小来自你的资产。 这是可能的,但至少我可以尝试一下,如果我知道我需要将哪些规则添加到 proguard-rules.pro 文件中。 Flutter apps are too big in size的可能重复 medium.com/@swav.kulinski/… 您找到问题的答案了吗?如果是,请分享答案。 【参考方案1】:

首先,我们将在构建文件中启用收缩和混淆。找到位于/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.**   *; 

【讨论】:

不要将此行用于发布 apk--> signingConfig signingConfigs.debug 使用 --> signingConfig signingConfigs.release【参考方案2】:

我将把这个答案留在这里,作为任何必须处理这个问题并遇到这个线程的可怜人的补充。

截至 2021 年 12 月,使用最新的 Android Sdk、Studio 和 Flutter 版本,如果您尝试 douseProguard 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 设置为使用现在在 Android 上处理缩小的 R8。

这里有一个关于这个的帖子供参考:Gradle : DSL element 'useProguard' is obsolete and will be removed soon

【讨论】:

已经为此苦苦挣扎了一个小时。【参考方案3】:

如果您使用的是 firebase,请参阅 Flutter build crashes using ProGuard with Firebase Auth

接下来,您需要考虑 pubspec.yaml 中的依赖关系,您可以立即忽略任何纯 Dart 包 - 您只是在寻找插件。在这些插件中,您只对那些利用现有库的插件感兴趣。您可能已将这些添加到 gradle。这些是您需要防止名称缩短的那些。

最简单的方法可能就是尝试一下,看看NoClassDefFoundError 中弹出了哪些包名,然后不断迭代添加它们。

正如雷米所说,你的收益将是微乎其微的,所以真的值得这么麻烦吗?在即将发布的版本中,您应该会看到 APK 大小有所改进。

【讨论】:

以上是关于如何使用 Proguard 缩小 Flutter 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 1.12 后如何禁用 proguard?

尝试在 ProGuard 中启用缩小时出现 DexGuard 错误

启用 proguard 时出现杰克逊错误(缩小)

如何修复因 ProGuard/R8 导致的崩溃?

当 debuggable 设置为 true 时,Proguard 不会缩小

如何配置 ProGuard 以尊重 Jackson 模型?