如何从 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_auth
和wilddog_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
也不会从cocoapod
或gradle
中删除软件包。
比如flutter clean
和flutter 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
它将显示有关已安装软件包的所有详细信息。
示例:=>
dependency_validator: null -- 这是一个直接引脚。 permission_handler: null -- 这是一个直接的 pin。 swipe_to: null -- 这是一个直接的 pin。这些包固定在 pubspec.yaml 中:
连通性 元 路径这些包在 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:如何避免缩小(和混淆)整个包以避免删除(和混淆)“未使用的方法”?