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

v1l68za4  于 2023-09-28  发布在  Flutter
关注(0)|答案(4)|浏览(143)

我已经做了一个Flutter应用程序。APK的大小约为14MB。我搜索了一些方法来缩小这个,发现了这个:https://flutter.io/android-release/#enabling-proguard
但我的问题是,我如何才能知道我在步骤1中使用的所有附加库?是否有任何命令可以知道它们,或者只是我添加到pubspec.yaml的所有依赖项?

/android/app/proguard-rules.pro这个文件中需要如何实现

332nm8kg

332nm8kg1#

首先,我们将在构建文件中启用收缩和模糊处理。找到build.gradle文件夹中的/android/app/文件并以粗体添加行

android {

    ...

    buildTypes {
        release {
            signingConfig signingConfigs.debug     

            minifyEnabled true
            useProguard true

            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 

        }
    }
}

接下来,我们将创建一个配置,它将保留整个Flutter Package 器代码。创建/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.**  { *; }

注意:使用signingConfigs.release而不是signingConfigs.debug来构建apk或appbundle

ddrv8njm

ddrv8njm2#

我将把这个答案留在这里,作为任何必须处理这个问题并遇到这个线程的可怜灵魂的补充。
截至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上的缩小。
这里有一个关于这个的帖子供参考:Gradle : DSL element 'useProguard' is obsolete and will be removed soon

1yjd4xko

1yjd4xko3#

如果您使用的是firebase,请参阅Flutter build crashes using ProGuard with Firebase Auth
接下来,您需要考虑pubspec.yaml中的依赖项您可以立即忽略任何纯Dart包-您只是在寻找插件。在这些插件中,您只对那些使用现有库的插件感兴趣。你可能已经把这些添加到gradle中了。这些都是你需要保护的名称缩短。
最简单的方法可能只是尝试一下,看看NoClassDefFoundError中会弹出哪些包名,然后不断迭代地添加它们。
正如雷米所说,你的收益将是最小的,所以它真的值得麻烦。您应该会看到在即将发布的版本中APK大小有所改进。

gorkyyrv

gorkyyrv4#

最新解决方案

首先,您应该在android/app/build.gradle中使用shrinkResources true而不是useProguard true
在第二种情况下,不使用proguard-android.txt,而应该使用proguard-android-optimize.txt
在Android官方文档中阅读更多内容。
阅读更多关于Android代码收缩的信息。

buildTypes {
              
    release {
         signingConfig signingConfigs.release

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

以下是新版本的proguard配置规则,以防止日志记录和其他改装保护:

# Flutter
-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.** { *; }

# Retrofit
-keepattributes Signature
-keepattributes Exceptions

# OkHTTP
-dontwarn okhttp3.**
-keep class okhttp3.**{ *; }
-keep interface okhttp3.**{ *; }

# Other
-keepattributes *Annotation*
-keepattributes SourceFile, LineNumberTable

# Logging 
-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
    public static *** i(...);
    public static *** w(...);
    public static *** e(...);
    public static *** wtf(...);
}

-assumenosideeffects class io.flutter.Log {
    public static *** d(...);
    public static *** v(...);
    public static *** w(...);
    public static *** e(...);
}

-assumenosideeffects class java.util.logging.Level {
    public static *** w(...);
    public static *** d(...);
    public static *** v(...);
}

-assumenosideeffects class java.util.logging.Logger {
    public static *** w(...);
    public static *** d(...);
    public static *** v(...);
}

# Removes third parties logging
-assumenosideeffects class org.slf4j.Logger {
    public *** trace(...);
    public *** debug(...);
    public *** info(...);
    public *** warn(...);
    public *** error(...);
}

要检查它,请安装jadx并打开your_app.apk,然后在其中搜索关于log的内容。你应该有非proguard之间的比较.apk和proguard配置.apk日志搜索结果.

无Proguard规则

使用Proguard规则

相关问题