包含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/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

发现也没优化的地方

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,585评论 4 365
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,923评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,314评论 0 248
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,346评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,718评论 3 291
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,828评论 1 223
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,020评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,758评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,486评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,722评论 2 251
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,196评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,546评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,211评论 3 240
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,132评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,916评论 0 200
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,904评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,758评论 2 274

推荐阅读更多精彩内容

  • 原文iOS代码瘦身实践 1 分析当前ipa的组成 一般一个ipa会包含: 1) 资源文件 本地文件:数据、配置、数...
    00after阅读 700评论 0 2
  • 目录:000 - 苹果提供的 App Thinning (了解)001 - 项目结构介绍002 - 变更图片文件的...
    麦穗0615阅读 1,121评论 0 1
  • 资源优化 1. 去除无用资源 一般都是版本迭代过程中存在的图片资源。可以借助三方工具来解决: Unused-mas...
    RobinZhao阅读 2,132评论 2 24
  • 前言 随着 app 版本的迭代,app 功能可能会越来越多,此时 app 打出来的包也会越来越大,由于 Apple...
    __Mr_Xie__阅读 1,469评论 0 5
  • 经过多个版本的迭代,iOS的ipa包一度达到了153M,突破了150M的阈值,虽然经过了简单的优化,暂时低...
    八月就是八月阅读 3,911评论 1 18