包含flutter的ios瘦身
类别 | 瘦身前 | 瘦身后 |
---|---|---|
导出的ipa | 133M | 110M |
上传App Store,testflight处大小 | 下图 | 下图 |
iphonex大小 | 63M | 63M |
[toc]
瘦身结果
查看app大小
appstore上文件大小可以按照下面方式获取
1.从“我的 App”中,选择您的 App。
2.点按“活动”标签页。
3.在侧边栏中,选择您想要查看的构建版本所在平台(iOS、macOS 或 Apple tvOS)。
4.在右侧的“构建版本”列中,点按您想要查看的构建版本的 App 图标或构建版本字符串。
5.在“综合信息”下,点按“App Store 文件大小”。
瘦身后
app主要由资源文件和可执行文件组成,优化也是从这两个方面进行优化
1.资源优化
无损压缩
去除无用的资源
1.1 删除无用的资源
- 工具:https://github.com/tinymind/LSUnusedResources
- 要选中
ignore similar name
防止误删- 实际中会出现误报情况
-
[UIImage imageNamed:[NSString stringWithFormat:@"01_0000%d.png",i]
这种情况下01_00004.png没有排除掉
1.2 删除重复的资源
工具:https://github.com/adrianlopezroche/fdupes
fdupes
是Linux下的一个工具,可以在指定的目录及子目录中查找重复的文件。fdupes通过对比文件的MD5签名,以及逐字节比较文件来识别重复内容。
重复资源(主要指图片)不是指命名重复而是内容相同。
mac下安装
brew install fdupes
项目中图片分两处存放,Assets.xcassets和images文件夹,所以在这两个目录查找就可以。
fdupes -r xxx/images xxx/Images.xcassets
我们的项目分为原生和flutter项目
原生项目
只有Assets.xcassets,所以运行
fdupes -r Assets.xcassets
执行结果
Assets.xcassets/SubSystems/Motorcade/Contents.json
Assets.xcassets/SubSystems/TrilateralCapacity/TrilateralCapacitySettlement/Contents.json
Assets.xcassets/lunch/Contents.json
Assets.xcassets/DriverTask/Contents.json
Assets.xcassets/Common/Contents.json
Assets.xcassets/SubSystems/Contents.json
Assets.xcassets/SubSystems/Motorcade/TransportPlan/Contents.json
Assets.xcassets/SubSystems/TrilateralCapacity/Contents.json
Assets.xcassets/DriverLogin/Contents.json
Assets.xcassets/Contents.json
Assets.xcassets/SubSystems/Motorcade/.DS_Store
Assets.xcassets/lunch/lunchBg.imageset/.DS_Store
Assets.xcassets/AppIcon.appiconset/120-1.png
Assets.xcassets/AppIcon.appiconset/120.png
删除其中一个图片,并且修改 Contents.json
flutter项目
fdupes -r images
执行结果
images/2x/start.png
images/2x/task_point_green.png
images/2x/find_goods_list_label.png
images/2x/[email protected]
images/2x/label_red_hook.png
images/2x/scan_delete.png
images/2x/oil_deletebox.png
images/2x/attestation_delete1.png
images/2x/clear_edt.png
images/2x/back_arrow.png
images/2x/drivercertificationitemback.png
images/2x/notStart.png
images/2x/notBegin.png
images/2x/attestation_attention.png
images/2x/attention3.png
images/2x/taskpoint.png
images/2x/end.png
images/2x/zhongdian.png
images/2x/task_point_red.png
images/2x/analog_hi_close.png
images/2x/close_icon.png
images/2x/serch_icon.png
images/2x/oil_search.png
删除文件
images/2x/start.png
images/2x/[email protected]
images/2x/label_red_hook.png
images/oil_deletebox.pn
images/2x/attestation_delete1.png
images/2x/drivercertificationitemback.png
images/2x/attention3.png
images/2x/notStart.png
images/2x/taskpoint.png
images/2x/end.png
images/2x/zhongdian.png
images/2x/analog_hi_close.png
images/2x/oil_search.png
修改 pubspec.yaml
以及对应代码引用地方
1.3 无损压缩图片
源码地址:https://github.com/ImageOptim/ImageOptim
下载安装包:https://imageoptim.com/mac
ImageOptim
是一款优秀的无损图片压缩工具,它通过优化压缩参数,移除无用的文件元数据和不必要的颜色配置来实现图片的无损压缩。
2.可执行文件瘦身
2.1 删除无用的类文件
2.1.1 人工删除
删除已经不用的逻辑代码,2.5.0有部分原生代码转为flutter代码,删除该部分代码
2.1.2 工具删除
fui是一个可以扫描工程中无用的类、以及无用打的
源码地址:https://github.com/dblock/fui
安装
gem install fui
查找未使用的类
fui --path=~/source/project/Name find
##### -x 命令 可以忽略xib引用的类
2.2 linkmap文件分析
LinkMap会包含每个可执行文件的偏移量及大小,所以可以很方便的知道每个可执行文件的大小
生成limkmap文件
在Build Settings中Write Link Map File设置为Yes (记住release时候不要设置为Yes)。
编译之后会在build目录中生成两个LinkMap文件: XXX-LinkMap-normal-armv7和XXX-LinkMap-normal-arm64,分别代表在32位和64位指令集生成的LinkMap文件。
路径为
~/Library/Developer/Xcode/DerivedData/XXXX-emviqojcfrxbvhfcilxkukvrjona/Build/Intermediates.noindex/ArchiveIntermediates/XXXX/IntermediateBuildFilesPath/XXXX.build/Release-iphoneos/XXXX.build
2.2.1工具分析
LinkMap分析工具:https://github.com/huanxsd/LinkMap
2.3 编译器优化
2.3.1 打包策略调整
编译器优化级别。Xcode中,Build Settings->Optimization Level,release版应该选择Fastest, Smalllest,这个选项会开启那些不增加代码大小的全部优化,并让可执行文件尽可能小。
2.3.2 去除符号信息
在Xcode中,Strip Debug Symbols During Copy ,Make Strings Read-Only和 Symbols Hidden by Default 在release版本应该设为yes,可以去除不必要的调试符号
2.3.3 去掉异常支持
Enable C++ Exceptions、Enable Objective-C Exceptions设置为NO, Other C Flags添加-fno-exceptions
3.flutter瘦身
2.3.1Flutter产物大小分析
在flutter插件工程的example下
执行如下命令编译出一个release模式下的产物,并使用 --analyze-size
参数打印出产物具体大小
--analyze-size
是1.22以上才支持的参数 具体 查看 https://flutter.dev/docs/development/tools/devtools/app-size
flutter build ios --release --analyze-size
执行结果
flutter build ios --release --analyze-size
Building XXXXXX for device (ios-release)...
Automatically signing iOS for device deployment using specified development team in Xcode project:
79LE4P38G2
Running pod install... 4.1s
Running Xcode build...
└─Compiling, linking and signing... 34.0s
Xcode build done. 181.6s
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Runner.app 527 MB
Runner.app/
_CodeSignature/
CodeResources 203 KB
[email protected] 1 KB
[email protected] 2 KB
AppIcon29x29.png 1010 B
[email protected] 3 KB
Runner 3 MB
[email protected] 2 KB
[email protected] 3 KB
AppIcon29x29~ipad.png 1010 B
[email protected] 2 KB
[email protected] 2 KB
[email protected] 5 KB
Base.lproj/
Main.storyboardc 3 KB
LaunchScreen.storyboardc 3 KB
Assets.car 93 KB
AppIcon40x40@2x~ipad.png 2 KB
AppIcon76x76@2x~ipad.png 4 KB
AppIcon83.5x83.5@2x~ipad.png 4 KB
AppIcon29x29@2x~ipad.png 2 KB
AppIcon40x40~ipad.png 1 KB
Frameworks/
libswiftCoreImage.dylib 327 KB
libswiftObjectiveC.dylib 391 KB
libswiftCore.dylib 22 MB
libswiftCoreGraphics.dylib 838 KB
libswiftUIKit.dylib 640 KB
mrd_flutter_framworks.framework 204 KB
libswiftMetal.dylib 386 KB
libswiftDispatch.dylib 1 MB
libswiftos.dylib 388 KB
libswiftCoreFoundation.dylib 327 KB
Flutter.framework 382 MB
Luban_iOS.framework 220 KB
sqflite.framework 267 KB
webview_flutter.framework 344 KB
App.framework 95 MB
Dart AOT symbols accounted decompressed size 15 MB
package:XXXXXXXXX 4 MB
package:flutter 4 MB
package:pointycastle 519 KB
dart:core 507 KB
package:html 322 KB
dart:typed_data 292 KB
dart:io 234 KB
dart:ui 230 KB
dart:async 205 KB
dart:collection 174 KB
package:XXXXXXXX/
XXXXX.dart 163 KB
package:XXXXXX 140 KB
package:XXXXXXXXX 137 KB
package:XXXXX 108 KB
package:XXXX 89 KB
dart:convert 88 KB
package:intl 81 KB
package:XXXXX 77 KB
package:XXXXXXXX 73 KB
package:XXXXXXXXXX 70 KB
libswiftDarwin.dylib 488 KB
TZImagePickerController.framework 1 MB
individual_driver.framework 270 KB
libswiftQuartzCore.dylib 330 KB
city_pickers.framework 203 KB
FMDB.framework 424 KB
libswiftCoreAudio.dylib 399 KB
XXXXXXXX.framework 1 MB
shared_preferences.framework 204 KB
libswiftAVFoundation.dylib 650 KB
image_save.framework 223 KB
image_picker.framework 414 KB
url_launcher.framework 261 KB
vibration.framework 329 KB
libswiftFoundation.dylib 11 MB
libswiftCoreMedia.dylib 391 KB
package_info.framework 204 KB
path_provider.framework 205 KB
libswiftsimd.dylib 1 MB
embedded.mobileprovision 7 KB
AppIcon20x20@2x~ipad.png 1 KB
Info.plist 2 KB
AppIcon76x76~ipad.png 2 KB
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
A summary of your iOS bundle analysis can be found at: build/ios-code-size-analysis_01.json
Built
会生成一个json文件,启动DevTools,拖入生成的json分析
可具体分析哪个模块的代码占比比较大进行优化
翻译项目中swift代码为oc,可以节省很多空间 ,后期优化部分
具体哪些方法占比比较大
具体到业务层,想要分析各个业务模块所占用的大小该怎么办呢?
1.执行如下命令编译出一个arm64架构的App.framework,并将它的包组成结构放到指定目录build/aot.json文件中
flutter --suppress-analytics build aot --output-dir=build/aot --target-platform=ios --target=lib/main.dart --release --ios-arch=arm64 --extra-gen-snapshot-options="--dwarf_stack_traces,--print-snapshot-sizes,--print_instructions_sizes_to=build/aot.json"
2.使用dart命令将上一步生成的aot.json文件转化成结构可视化的网页
flutter1.22分析工具大改 咸鱼写的这盘文章路径已经不可用 https://www.jianshu.com/p/9d5e12efcb05
./bin/analyse.dart treemap XXX/XXX/build/aot.json
#### XXX/XXX/build/html
##### XXX/XXX是项目路径
analyse.dart是dart提供的一个分析工具,
如果找不到analyse.dart就到https://github.com/dart-lang/sdk.git 自己clone一份
进入到如下目录
第一次执行以下
flutter pub get
打开生成文件夹中的index.html即可分析具体业务所占用的大小,右上角的Large Symbols和Large Files按钮可以直接定位体积占比从大到小的方法/文件。
发现也没优化的地方
如果还有什么可以优化分析的点,欢迎评论留言