美文网首页Flutterflutter
包含flutter的ios瘦身

包含flutter的ios瘦身

作者: 锦鲤跃龙 | 来源:发表于2020-11-14 10:40 被阅读0次

    包含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/redhook@2x.png
    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/redhook@2x.png
    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
        AppIcon20x20@2x.png                                                     1 KB
        AppIcon20x20@3x.png                                                     2 KB
        AppIcon29x29.png                                                      1010 B
        AppIcon60x60@2x.png                                                     3 KB
        Runner                                                                  3 MB
        AppIcon29x29@2x.png                                                     2 KB
        AppIcon40x40@3x.png                                                     3 KB
        AppIcon29x29~ipad.png                                                 1010 B
        AppIcon40x40@2x.png                                                     2 KB
        AppIcon29x29@3x.png                                                     2 KB
        AppIcon60x60@3x.png                                                     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瘦身

        本文链接:https://www.haomeiwen.com/subject/giobbktx.html