Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[今日头条]iOS 包大小二进制优化,一行代码减少 60 MB 下载大小

[今日头条]iOS 包大小二进制优化,一行代码减少 60 MB 下载大小

作者头像
用户6094182
发布于 2021-02-05 06:20:22
发布于 2021-02-05 06:20:22
1.3K00
代码可运行
举报
文章被收录于专栏:joealzhoujoealzhou
运行总次数:0
代码可运行

原文链接

一、代码配置

如果使用 xcconfig 来管理构建参数的,如果你也使用该方式,那么使用下面这一行代码就能完成配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
APP_THIN_LINK_FLAGS = -Wl,-rename_section,__TEXT,__cstring,__RODATA,__cstring,-rename_section,__TEXT,__objc_methname,__RODATA,__objc_methname,-rename_section,__TEXT,__objc_classname,__RODATA,__objc_classname,-rename_section,__TEXT,__objc_methtype,__RODATA,__objc_methtype,-rename_section,__TEXT,__gcc_except_tab,__RODATA,__gcc_except_tab,-rename_section,__TEXT,__const,__RODATA,__const,-rename_section,__TEXT,__text,__BD_TEXT,__text,-rename_section,__TEXT,__textcoal_nt,__BD_TEXT,__text,-rename_section,__TEXT,__StaticInit,__BD_TEXT,__text,-rename_section,__TEXT,__stubs,__BD_TEXT,__stubs,-rename_section,__TEXT,__picsymbolstub4,__BD_TEXT,__picsymbolstub4,-segprot,__BD_TEXT,rx,rx

如果你是没有使用这种方式,在Other Linker Flags中逐行添加以下配置即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-Wl,-rename_section,__TEXT,__cstring,__RODATA,__cstring
-Wl,-rename_section,__TEXT,__objc_methname,__RODATA,__objc_methname
-Wl,-rename_section,__TEXT,__objc_classname,__RODATA,__objc_classname
-Wl,-rename_section,__TEXT,__objc_methtype,__RODATA,__objc_methtype
-Wl,-rename_section,__TEXT,__gcc_except_tab,__RODATA,__gcc_except_tab
-Wl,-rename_section,__TEXT,__const,__RODATA,__const
-Wl,-rename_section,__TEXT,__text,__BD_TEXT,__text
-Wl,-rename_section,__TEXT,__textcoal_nt,__BD_TEXT,__text
-Wl,-rename_section,__TEXT,__StaticInit,__BD_TEXT,__text
-Wl,-rename_section,__TEXT,__stubs,__BD_TEXT,__stubs
-Wl,-rename_section,__TEXT,__picsymbolstub4,__BD_TEXT,__picsymbolstub4,
-Wl,-segprot,__BD_TEXT,rx,rx

如果你的二进制文件中存在自定义 Section 的话,比如使用了类似attribute((section("__TEXT,__custom_section")))的方式创建了自定义 Section,则可能需要做如下的配置以移走自定义 Section,具体见 「2.3.3 场景三」 的详细分析。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
APP_THIN_LINK_FLAGS = -Wl,-rename_section,__TEXT,__cstring,__RODATA,__cstring,-rename_section,__TEXT,__objc_methname,__RODATA,__objc_methname,-rename_section,__TEXT,__objc_classname,__RODATA,__objc_classname,-rename_section,__TEXT,__objc_methtype,__RODATA,__objc_methtype,-rename_section,__TEXT,__gcc_except_tab,__RODATA,__gcc_except_tab,-rename_section,__TEXT,__const,__RODATA,__const,-rename_section,__TEXT,__text,__BD_TEXT,__text,-rename_section,__TEXT,__textcoal_nt,__BD_TEXT,__text,-rename_section,__TEXT,__StaticInit,__BD_TEXT,__text,-rename_section,__TEXT,__stubs,__BD_TEXT,__stubs,-segprot,__BD_TEXT,rx,rx,-rename_section,__TEXT,__picsymbolstub4,__BD_TEXT,__picsymbolstub4,-rename_section,__TEXT, __custom_section,__CUSTOM_TEXT,__text,-segprot, __CUSTOM_TEXT,rx,rx

二、验证

1、如何找到Mach-O文件

xcode项目编译后,在项目目录下找到Product文件夹,下面有个xxxx.app的文件,右键show in finder,下面有个和项目同名的可执行文件这个就是Mach-O文件

2、查看Mach-O

在终端进入此文件夹,运行下面命令:比如你的文件名叫MachDemo

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$xcrun size -lm MachDemo

没移动__TEXT之前

mach-o before.png

移动后

mach-o after.png

三、成果

将最新的IPA上传App Store后查看下载大小及安装大小。发现新上传的1.9.3版本明细下载大小减少了十几兆。安装大小也有不同程度的减少。第一列是下载大小,第二列是安装大小。

1.9.2.png

1.9.3.png

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
今日头条 iOS 安装包大小优化 - 新阶段、新实践
链接:https://juejin.cn/post/6924107853141655565
会写bug的程序员
2021/02/21
2.1K0
今日头条 iOS 安装包大小优化 - 新阶段、新实践
mach-o文件分析多余的类和方法
最近做包大小优化,在做项目代码优化时,其中有一个过程是分析Mach-O文件,看网上很多文章都说通过otool分析Mach-O,获取objc_classrefs、objc_classlist等,然后找出无用类和无用方法。
莫空9081
2021/06/15
3.8K0
减包-删除无用的代码
使用开源工具 LSUnusedResources 检查重复图片,但是可能会有误报,比如 [@”image%d”, index] 这种引用方式无法检查到,需要人工在核对一边。
Helloted
2022/06/08
1.5K0
减包-删除无用的代码
iOS 优化App启动时间-启动详解(上篇)
主要简单的介绍了Mach -O和虚拟内存的知识,下文在app启动的时会有很多相关的术语,不知道会懵逼。
星宇大前端
2019/06/22
2.6K0
Apple 操作系统可执行文件 Mach-O
Mach-O 的全称是 Mach Object File Format。可以是可执行文件,目标代码或共享库,动态库。Mach 内核的操作系统比如 macOS,iPadOS 和 iOS 都是用的 Mach-O。Mach-O 包含程序的核心逻辑,以及入口点主要功能。
用户7451029
2020/06/16
3K0
Mach-O相关概念
Mach-O是Mach Object的缩写,是Mac/iOS上用于存储程序、库的标准格式
Scott_Mr
2022/05/11
1K0
Mach-O相关概念
探秘 Mach-O 文件
之前负责项目的包体积优化学习了 Mach-O 文件的格式,那么 Mach-O 究竟是怎么样的文件,知道它的组成之后我们又能做点什么?本文会从 Mach-O 文件的介绍讲起,再看看认识它后的一些实际应用。
会写bug的程序员
2020/06/19
2.4K0
探秘 Mach-O 文件
不给“爸爸”添麻烦 - iTOP iOS 动态库改造
苹果官方文档 对提交商店 APP 的二进制文件中__TEXT段大小有限制,超过大小限制的应用在提交评审的时候会被拒绝...
腾讯Bugly
2018/03/23
2.3K2
iOS 优化 - 瘦身
iOS 优化将是一个专题,其中会包括包体积优化(瘦身)、启动时间优化、UI 优化等等。那么这个专题的开篇就从瘦身开始吧。
CoderStar
2022/08/24
2.8K0
iOS 优化 - 瘦身
为何百兆静态库能打进数兆的可执行文件?
前言 第三方库是工程开发必不可少的部分,而第三方库可以是.a和.framework的静态库,也可以是.framework的动态库,其中静态库是最常用的方式。 静态库往往比较大,可在打包到可执行文件之后,对安装包大小的增加远远小于静态库本身的Size。 那么,就产生两个问题: 1、静态库里面存在什么内容? 2、静态链接到可执行文件后为什么体积变小? 本文就以.framework的静态库来分析具体情况。 正文 1、framework静态库的打包 新建工程,选择Cocoa Touch Framework
落影
2018/04/27
2.5K1
为何百兆静态库能打进数兆的可执行文件?
iOS 性能优化实践:头条抖音如何实现 OOM 崩溃率下降50%+
OOM 其实是Out Of Memory的简称,指的是在 iOS 设备上当前应用因为内存占用过高而被操作系统强制终止,在用户侧的感知就是 App 一瞬间的闪退,与普通的 Crash 没有明显差异。但是当我们在调试阶段遇到这种崩溃的时候,从设备设置->隐私->分析与改进中是找不到普通类型的崩溃日志,只能够找到Jetsam开头的日志,这种形式的日志其实就是 OOM 崩溃之后系统生成的一种专门反映内存异常问题的日志。那么下一个问题就来了,什么是Jetsam?
ios-lan
2020/10/21
4.6K0
iOS微信安装包瘦身
前提 微信经过多次版本迭代,产生不少冗余代码和无用资源。之前微信也没有很好的手段知道哪个模块增量多少。另外去年10月微信开始做ARC支持,目的是为了减少野指针带来的Crash,但代价是可执行文件增大20%左右。而苹果规定今年6月提交给Appstore的应用必须支持64位,32位和64位两个架构的存在使得可执行文件增加了一倍多。安装包大小优化迫在眉睫。 Appstore安装包是由资源和可执行文件两部分组成,安装包瘦身也是从这两部分进行。 资源瘦身 资源瘦身主要是去掉无用资源和压缩资源,资源包括图片、音视频文件
微信终端开发团队
2018/01/29
4.5K0
iOS微信安装包瘦身
iOS逆向之Mach-O文件
阅读笔者的其他文章,我们了解了编译过程中的预处理、词法分析、语法分析、编译、链接等步骤。经常和编译型语言打交道的开发者对于可执行文件的编译过程肯定不陌生。我们用 Xcode 构建一个程序的过程中,会把源文件 (.m 和 .h) 文件转换为一个可执行文件。这个可执行文件中包含的字节码将会被 CPU (iOS 设备中的 ARM 处理器或 Mac 上的 Intel 处理器) 执行。
VV木公子
2021/03/07
11.2K0
iOS逆向之Mach-O文件
“盲”逆向:iOS 应用 Blind 寻踪
原文地址:《"BLIND" Reversing - A Look At The Blind iOS App》
Seebug漏洞平台
2018/03/16
1.2K0
“盲”逆向:iOS 应用 Blind 寻踪
iOS 裁包大作战 —— JOOX Music 如何瘦身40MB
JOOX Music 是腾讯面向海外市场发布的音乐 App,目前在其发布的五个国家和地区均是排名第一的音乐服务应用。JOOX Music 从2014年发布至今,经历了大小数十个版本的迭代,功能不断的完善和丰富。而它的体积在 v3.5 版本时达到了有点惊人的 124MB!而东南亚是 JOOX Music 的主要发行地区,这里的网络环境相对较差,存在大量老旧的小容量 iOS 设备,而 App Store 的下载也不太稳定。因此,对 JOOX Music 的裁包大作战已势在必行。
腾讯TMF团队
2022/12/14
9980
iOS 启动优化--二进制重排
当进程在访问虚拟内存时,如果对应的物理内存不存在,会触发缺页异常(pagefault),由于在启动的时候需要调用的方法存在不同类中,而每个page的大小是固定的,这就导致启动时需要加载的page会更多,我们可以通过手动排列符号,将启动时刻需要的方法排列在一起,减少缺页异常
conanma
2021/10/28
1.3K0
浅谈 LinkMap 检查每个类占用大小
LinkMap 文件是 Xcode 产生可执行文件的同时生成的链接信息,用来描述可执行文件的构造成分,包括代码段 __TEXT 和数据段 __DATA 的分布情况。只要设置 Project->Build Settings->Write Link Map File 为 YES,并设置 Path to Link Map File,build 完后就可以在设置的路径看到 LinkMap 文件了:
s_在路上
2018/09/30
1.9K0
浅谈 LinkMap 检查每个类占用大小
“盲”逆向:iOS 应用 Blind 寻踪
原文:https://exceptionlevelone.blogspot.tw/2017/10/blind-reversing.html 译者:hello1900@知道创宇404实验室 01前 言 “Blind是一款用于工作场合的匿名社区应用。” 换句话说,作为一名员工,如果有“畅所欲言”或以匿名方式抨击雇主或同事的打算(当然这种情况极为常见),那么Blind可能是你的不二之选。这款有趣的小应用能够帮助我们透过事物表象了解真实情况。 02范围与环境 我重点关注应用本身,因此使用Linkedin账
Seebug漏洞平台
2018/03/30
1.6K0
深入剖析 iOS 编译 Clang / LLVM
2000年,伊利诺伊大学厄巴纳-香槟分校(University of Illinois at Urbana-Champaign 简称UIUC)这所享有世界声望的一流公立研究型大学的 Chris Lattner(他的 twitter @clattner_llvm ) 开发了一个叫作 Low Level Virtual Machine 的编译器开发工具套件,后来涉及范围越来越大,可以用于常规编译器,JIT编译器,汇编器,调试器,静态分析工具等一系列跟编程语言相关的工作,于是就把简称 LLVM 这个简称作为了正式的名字。Chris Lattner 后来又开发了 Clang,使得 LLVM 直接挑战 GCC 的地位。2012年,LLVM 获得美国计算机学会 ACM 的软件系统大奖,和 UNIX,WWW,TCP/IP,Tex,JAVA 等齐名。
用户7451029
2020/06/16
8.3K0
深入剖析 iOS 编译 Clang / LLVM
正经分析iOS包大小优化
包大小优化是项目开发中不可避免会遇到的,网上关于包大小优化的文章很多,每篇文章说的都不尽相同,笔者曾经根据网上的文章做过包大小优化,但效果不尽人意;因此笔者想根据已有的文章、知识结合自己的理解、实践,做一份总结梳理,整理自己的包大小优化逻辑,不光要知道怎么做可以让包大小变化,还要知道为什么这么做能产生效果,所以就有了这篇文章。
莫空9081
2021/05/28
6.2K0
相关推荐
今日头条 iOS 安装包大小优化 - 新阶段、新实践
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验