网易首页 > 网易号 > 正文 申请入驻

一个Xcode设置让App瘦身22%,代码一行没改

0
分享至

模块化之后,App 变大了,启动还变慢了。最后把它救回来的,是一个构建设置,代码一行没改。


事情发生在一个团队里,花了整整一周才找到原因。为了把每个数字都做成可复现的,作者重建了一个演示 App。所有数字都是真实的。

第一幕:3 KB 的代码,装进 73 KB 的盒子

三个模块都是普通的动态框架,也就是 Xcode 默认给你的那种。其中 SupportFeature 大约只有 3 KB 代码,却被打包成了 73 KB 的二进制文件。

相当于用微波炉的箱子寄一根 USB 线。每个动态框架会被切成四段,在 arm64 上每段都按 16 KB 页对齐,哪怕几乎是空的。所以每个框架在装进任何代码之前,先付大约 64 KB 的包装费。除此之外,dyld 每次启动都要单独查找、映射、绑定每一个框架。

用 CocoaPods 的 use_frameworks!,或者动态 SPM 产品?那每一个依赖都相当于每次冷启动多过一道机场安检。这也是“我加了几个 pod,启动就变慢了”在 Stack Overflow 上如此常见的原因。

填充能解释那些小框架,但解释不了 CoreKit:它只装了 88 KB 代码,体积却有 316 KB。

第二幕:指纹

把代码移出 App 目标时,编译器会甩给你大约四百次这个错误:'EventName' is inaccessible due to 'internal' protection level。

于是大家都会这么干:public struct EventName { public static let appOpen = "App Open" }。

作者和链接器有一段“审讯记录”。作者问:根本没人调用 appOpen,为什么不把它剥掉?链接器答:它是 public,框架外面可能有人调用。作者问:谁?链接器答:……某个人。我还保留了它的类型元数据,把它加进了导出表。不客气。

每一个 public 符号都要在三处付出代价:

  • 链接器无法死剥的代码(__TEXT)
  • 类型元数据(__const)
  • 导出表里的一条记录(__LINKEDIT),也就是框架的电话簿

为了证明这一点,作者把同一个 CoreKit(360 个常量、40 个模型)构建了两次,唯一的变化是访问级别。同样的代码,体积小了 30%。电话簿比小镇还大。

第三幕:假线索

团队花了一周时间靠重构往外爬:把 struct 换成 enum,换成带 String 的 enum,把常量嵌套起来,再拍平。每一次之后都看体积报告。

结论是:类型的形状不重要。代码仍然是 public,框架仍然在交包装税。真正的解法是减少 public 声明,但那是四分之一的工作量。团队想要更快的收益,于是换了个问题:如果在我们发布的构建里,框架不必保持独立呢?

突破口:为什么不能两者都要

动态框架构建快、启动慢;静态库启动快、构建慢。Xcode 15 的可合并库(mergeable libraries)看着这个取舍说:都要。

Debug 下什么都不变,App 重新导出每个框架,增量构建保持快速。Release 下链接器把每个框架合并进 App 二进制,顺带去重字符串、选择器和桩。框架文件夹还留在包里放资源,但它们的二进制变成了空壳。

修复:一个设置

选中 App 目标,进入 Build Settings,搜索 Create Merged Binary,设为 Automatic。也就是 MERGED_BINARY_TYPE = automatic。就这样,不改代码,不添新工具。automatic 会合并项目里构建的每一个直接框架依赖。

有一个坑:只有直接依赖会被合并。如果 CoreKit 只是通过 SupportFeature 才到达 App,需要把它显式链接到 App 目标。想要精确控制,就在 App 上设 MERGED_BINARY_TYPE = manual,在每一个想合并的框架上设 MERGEABLE_LIBRARY = YES。

判决

App 可执行文件变大了,因为所有代码都搬了进去。留下的框架二进制是空壳。这只需要一个构建设置、零代码改动。演示里只有三个小框架,真实 App 有几十个。

细则

  • Debug 不等于 Release。合并只发生在 Release 构建里,所以要测你真正发布的那个构建。
  • 归档会变慢。合并是额外的链接器工作,在大 App 上要测量影响。
  • 手动模式容易被遗忘。把 MERGEABLE_LIBRARY = YES 放进共享的 .xcconfig。
  • 边界情况:合并框架上的 Bundle(for:) 需要 iOS 12 或更高;dlopen 路径要指向合并后的二进制;崩溃报告会把 App 列为镜像。
  • 如果你有不止几个自家框架,并且有人在盯 App 体积或启动时间,值得做。如果只有一两个框架,或者要发布二进制 SDK,跳过。

结案

留三道作业:跑一下 nm -gU YourFramework | wc -l,做好心理准备;把一个不需要 public 的东西改回 internal;在一个分支上设 MERGED_BINARY_TYPE = automatic,对比归档结果。

作者说,在找到那个多年来一直自动敲出来的六字母关键字之前,他怪过 Xcode、怪过 CI 缓存、怪过水星逆行。现在他在怪任何东西之前,先跑 nm。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
庄宇珊砍全场最高22分+36轮一传零失误,率队力克强敌取连胜

庄宇珊砍全场最高22分+36轮一传零失误,率队力克强敌取连胜

金毛爱女排
2026-10-25 20:47:00
首节8中7砍15分7板,去年的5号秀把湖人打停了

首节8中7砍15分7板,去年的5号秀把湖人打停了

绿茵狂热者
2026-10-26 05:51:50
苍井空公开承认南京大屠杀:我在上学时学到过,一切的根源都在于战争

苍井空公开承认南京大屠杀:我在上学时学到过,一切的根源都在于战争

不掉线电波
2026-10-21 12:22:08
东海舰队,刚开始是在大上海,为啥搬去了宁波?上海有个“软肋”

东海舰队,刚开始是在大上海,为啥搬去了宁波?上海有个“软肋”

兴趣知识
2026-10-26 03:07:37
CBA出现进步神速队员,从场均5分到17分,三分14中10,秒变神射手

CBA出现进步神速队员,从场均5分到17分,三分14中10,秒变神射手

南海浪花
2026-10-24 11:15:47
泽连斯基:拒绝放弃25%的领土,俄军目前实际控制了乌方约19.3%的领土;过去三个月,乌克兰仅从美国接收24枚“爱国者”防空系统拦截弹

泽连斯基:拒绝放弃25%的领土,俄军目前实际控制了乌方约19.3%的领土;过去三个月,乌克兰仅从美国接收24枚“爱国者”防空系统拦截弹

极目新闻
2026-10-25 09:42:32
为什么普通人不建议去上老年大学?我去上了一学期课,发现里面是个小江湖

为什么普通人不建议去上老年大学?我去上了一学期课,发现里面是个小江湖

小马达情感故事
2026-10-18 17:45:42
最强反腐来了!中纪委:2026坚决清除害群之马,不放过一人!

最强反腐来了!中纪委:2026坚决清除害群之马,不放过一人!

细说职场
2026-10-25 18:39:04
美国政治献金最高纪录!马怕遭调查

美国政治献金最高纪录!马怕遭调查

巴雷文化
2026-10-26 05:04:09
美媒曾公开全球最差的7艘航母:辽宁舰上榜,福建舰与山东舰呢?

美媒曾公开全球最差的7艘航母:辽宁舰上榜,福建舰与山东舰呢?

云上乌托邦
2026-10-15 23:40:04
性能双王!小米新机官宣:10月27日,正式发布!

性能双王!小米新机官宣:10月27日,正式发布!

科技堡垒
2026-10-25 11:03:17
学历贬值,日本的剧本已经演完了,我们几乎在逐页重演

学历贬值,日本的剧本已经演完了,我们几乎在逐页重演

起点人文
2026-10-15 13:07:03
半场开香槟!胡荷韬绝平后蓉城主帅脱衣狂庆,很快笑容瞬间转移

半场开香槟!胡荷韬绝平后蓉城主帅脱衣狂庆,很快笑容瞬间转移

足球大腕
2026-10-25 12:36:59
45岁仍拍三级片还债,36E巨乳,被称香港妖女,60岁直播翻身破亿

45岁仍拍三级片还债,36E巨乳,被称香港妖女,60岁直播翻身破亿

轩逸阿II
2026-10-17 07:39:17
巴萨1-2皇马:穆里尼奥的皇马有点东西,姆巴佩率队送巴萨两连败

巴萨1-2皇马:穆里尼奥的皇马有点东西,姆巴佩率队送巴萨两连败

呀古铜
2026-10-26 06:21:09
越来越多人得癌症,医生提醒:洗碗时几个坏习惯,你占了几个?

越来越多人得癌症,医生提醒:洗碗时几个坏习惯,你占了几个?

健康科普365
2026-10-13 11:35:07
张雪回应刷新吉尼斯世界纪录:没成功很丢脸 所以骑得很谨慎 给自己打99分

张雪回应刷新吉尼斯世界纪录:没成功很丢脸 所以骑得很谨慎 给自己打99分

快科技
2026-10-25 13:37:10
0-3!曼联主场惨败+8场不胜,3人失误丢球,卡里克离队倒计时

0-3!曼联主场惨败+8场不胜,3人失误丢球,卡里克离队倒计时

体育知多少
2026-10-26 00:06:13
巴恩斯:范乔丹回归让火箭完全不同,有望冲击西部前4

巴恩斯:范乔丹回归让火箭完全不同,有望冲击西部前4

甜份超标的我
2026-10-25 05:23:08
为什么同样重量瓶装液化气北京只要40元?而其它省份要130-180元

为什么同样重量瓶装液化气北京只要40元?而其它省份要130-180元

娱乐圈的笔娱君
2026-10-26 00:23:56
2026-10-26 07:03:00
固件更新中
固件更新中
有态度网友ytd
164文章数 83关注度
往期回顾 全部

科技要闻

苹果首款折叠屏没能养肥黄牛

头条要闻

顾客一个避雷帖致小店营业额直接暴跌75% 女店主崩溃

头条要闻

顾客一个避雷帖致小店营业额直接暴跌75% 女店主崩溃

体育要闻

文班、约基奇和扬尼斯各自的处境

娱乐要闻

王佳佳近况:44岁导演老公露面

财经要闻

宁王AB面:好业绩,坏天气

汽车要闻

专业越野+华为乾崑智能 猛士X700限时焕新价20.98万起

态度原创

健康
本地
时尚
游戏
公开课

痘痘能根治吗?皮肤科医生说实话

本地新闻

这么近,那么美,周末赴贺州丨大湾区后花园

伊姐周六热推:电视剧《尚公主》;电视剧《小城良方》......

FoveatedDLSS5让《巫师3》帧率提升约63%

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版