包含flutter的ios瘦身

包含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 文件大小”。


image.png

瘦身后


image.png

app主要由资源文件和可执行文件组成,优化也是从这两个方面进行优化

1.资源优化

无损压缩
去除无用的资源

1.1 删除无用的资源

  • 工具:https://github.com/tinymind/LSUnusedResources
  • 要选中 ignore similar name 防止误删
    • 实际中会出现误报情况
    • [UIImage imageNamed:[NSString stringWithFormat:@"01_0000%d.png",i]这种情况下01_00004.png没有排除掉
image.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是一款优秀的无损图片压缩工具,它通过优化压缩参数,移除无用的文件元数据和不必要的颜色配置来实现图片的无损压缩。

image.png

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文件。


image.png

路径为

~/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

image.png

2.3 编译器优化

2.3.1 打包策略调整

编译器优化级别。Xcode中,Build Settings->Optimization Level,release版应该选择Fastest, Smalllest,这个选项会开启那些不增加代码大小的全部优化,并让可执行文件尽可能小。

image.png

2.3.2 去除符号信息

在Xcode中,Strip Debug Symbols During Copy ,Make Strings Read-Only和 Symbols Hidden by Default 在release版本应该设为yes,可以去除不必要的调试符号

image.png
image.png
image.png

2.3.3 去掉异常支持

Enable C++ Exceptions、Enable Objective-C Exceptions设置为NO, Other C Flags添加-fno-exceptions

image.png
image.png
image.png

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分析


image.png

可具体分析哪个模块的代码占比比较大进行优化

翻译项目中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
image.png

打开生成文件夹中的index.html即可分析具体业务所占用的大小,右上角的Large Symbols和Large Files按钮可以直接定位体积占比从大到小的方法/文件。


image.png
image.png
image.png

发现也没优化的地方

如果还有什么可以优化分析的点,欢迎评论留言

你可能感兴趣的:(包含flutter的ios瘦身)