如何从 Flutter 中删除或识别未使用的包以减小项目的大小?

Posted

技术标签:

【中文标题】如何从 Flutter 中删除或识别未使用的包以减小项目的大小?【英文标题】:How to remove or identify unused packages from flutter to reduce size of the project? 【发布时间】:2019-01-26 08:23:42 【问题描述】:

我在我的颤振项目中使用了一些我不再需要的包,即wilddog_authwilddog_sync,我可以从pubspec.yaml 文件和我的dart 文件中删除导入(也就是删除import 'package:wilddog_sync/wilddog_sync.dart' 等。 ) 并删除 MainActivity.java 以及 Xcode 项目中的导入,但我无法清除 Flutter、cocoapod 和 gradle 安装的未使用文件。现在flutter中是否有一个统一的命令可以一次删除所有未使用的包?

我很确定使用flutter clean 只会删除构建文件夹,而在从pubspec.yaml 删除软件包后使用flutter packages get 也不会从cocoapodgradle 中删除软件包。

比如flutter cleanflutter packages get之后我重建了项目:

Launching lib/main.dart on android SDK built for x86 64 in debug mode...
Initializing gradle...
Resolving dependencies...
Running 'gradlew assembleDebug'...
Built build/app/outputs/apk/debug/app-debug.apk.
Installing build/app/outputs/apk/app.apk...
I/FlutterActivityDelegate(11331): onResume setting current activity to this
I/Choreographer(11331): Skipped 107 frames!  The application may be doing too much work on its main thread.
D/EGL_emulation(11331): eglMakeCurrent: 0x79f21b4dbec0: ver 2 0 (tinfo 0x79f219b4f160)
I/OpenGLRenderer(11331): Davey! duration=1903ms; Flags=1, IntendedVsync=7544454683637, Vsync=7546238016899, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=7546253803603, AnimationStart=7546253996603, PerformTraversalsStart=7546254171603, DrawStart=7546279222603, SyncQueued=7546288526603, SyncStart=7546295569603, IssueDrawCommandsStart=7546296644603, SwapBuffers=7546334455603, FrameCompleted=7546365204603, DequeueBufferDuration=2892000, QueueBufferDuration=199000, 
Syncing files to device Android SDK built for x86 64...
D/        (11331): HostConnection::get() New Host Connection established 0x79f219ab81e0, tid 11383
D/EGL_emulation(11331): eglMakeCurrent: 0x79f21b5e26e0: ver 2 0 (tinfo 0x79f219aa66c0)
W/IInputConnectionWrapper(11331): getCursorCapsMode on inactive InputConnection

然而所有的包文件仍然存在。

当然我可以进入 ./ios/ 运行 pods install 来删除 pod:

pod install
Analyzing dependencies
Fetching podspec for `Flutter` from `.symlinks/flutter/ios`
Removing Wilddog
Removing WilddogCore
Removing WilddogSync
Downloading dependencies
Using Flutter (1.0.0)
Generating Pods project
Integrating client project
Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.

[!] Automatically assigning platform `ios` with version `8.0` on target `Runner` because no platform was specified. Please specify a platform for this target in your Podfile. See `https://guides.cocoapods.org/syntax/podfile.html#platform`.

【问题讨论】:

我不知道 Java/Swift/ObjectC 依赖项,但对于 Dart 依赖项,将它们从 pubspec.yaml 中删除并运行 flutter packages get 就足够了。 Flutter 有摇树编译器。所以未使用的包不应该包含在捆绑文件中。尝试在构建之前运行flutter clean @Yamin 它似乎没有删除 gradle 或 cocoapod 包。 如果它不起作用,问题应该出在插件上。该插件的文档是中文的(我认为),所以我无法在那里关注问题。 从 pubspec.yaml 中删除插件就是你需要做的。然后运行flutter packages get。 Flutter 会在你重建项目时自动移除原生插件代码。 【参考方案1】:

删除flutter SDK目录下.pub-cache的托管文件夹

cd path/to/flutter_sdk_directory

rm -rf .pub-cache/hosted

删除项目根目录下的.packages文件

 cd path/to/project_root_directory

 rm -rf .packages

获取项目的包

cd path/to/project_root_directory

flutter pub get

在 Android Studio 中打开项目

完成。

【讨论】:

【参考方案2】:

您可以使用这三个步骤来清除此问题

    '扑干净' 删除 pubspec.yaml 中不需要的依赖项 删除 pubspec.lock

重新加载项目并再次执行 'pub get' 并运行 iOS/Android 项目

【讨论】:

【参考方案3】:

最好的方法是

flutter clean

如果这不起作用,只需创建一个新项目,将旧代码复制到新项目中,在这里你可以在运行 pub get 之前只添加你想要的依赖项。

【讨论】:

【参考方案4】:

有时可能有一些包没有在项目中使用,但您在开发阶段的某个时候安装了。要找出这些,首先转到每个 dart 文件并删除未使用的导入,然后转到 pubspec.yaml 并逐个注释包并保存项目。然后刷新应用程序(不是热重载)。如果我们在项目中使用的包那么它会抛出一个错误。对所有包重复这些步骤后,您将能够从 pubspec 中删除所有不需要的包。

现在,删除 pubspec.lock 文件,然后再次运行 pub get。您的项目现在将只有所需的包,这可能是可实现的最小大小。

【讨论】:

【参考方案5】:

这种行为似乎是一个错误。你可以在这里追踪它https://github.com/flutter/flutter/issues/65718

【讨论】:

【参考方案6】:

有一种直观的方法。 安装this包

dev_dependencies:
  dependency_validator: ^x.x.x

然后运行flutter pub run dependency_validator 它将显示有关已安装软件包的所有详细信息。 示例:=>

这些包固定在 pubspec.yaml 中:

dependency_validator: null -- 这是一个直接引脚。 permission_handler: null -- 这是一个直接的 pin。 swipe_to: null -- 这是一个直接的 pin。

这些包在 lib/ 中使用,但不是依赖项:

连通性 元 路径

以下包包含可执行文件,假定它们被使用:

flutter_native_splash

这些包可能未使用,或者您可能正在使用这些包中的资产:

cupertino_icons firebase_analytics http 加载中 sign_in_with_apple

【讨论】:

【参考方案7】:

你可以在终端输入dart pub remove <packagename>删除

示例:删除 flutter_svg:^0.22.0 , 输入dart pub remove flutter_svg

欲了解更多信息,请查看https://dart.dev/tools/pub/cmd/pub-remove

【讨论】:

以上是关于如何从 Flutter 中删除或识别未使用的包以减小项目的大小?的主要内容,如果未能解决你的问题,请参考以下文章

Proguard:如何避免缩小(和混淆)整个包以避免删除(和混淆)“未使用的方法”?

Flutter 命令删除 .pub-cache 文件夹中的包

制作自定义SSIS包以供重用

从需求文件中删除未使用的包

npm命令用于卸载或修剪Node.js中未使用的包

从 apk 中删除特定的包类