iOS编译过程

2021-07-22  本文已影响0人  野码道人

背景

随着需求爆发,代码和图片资源越来越多,包体积越来越大,用户下载成本越来越高,瘦包迫在眉睫,要想瘦包,就需要知道包由何组成,每个组成部分又是怎么来的,这就必须了解编译过程,当然有人会说,不就瘦包嘛,网上有教程呀,巴拉巴拉照着做就行了!
嗯~那证明app的包还不够复杂,当你需要引用上百个自研或是开源库的时候自会明白,我们来看下文件组成

iOS应用的文件目录结构

一个app通常有如下几个模块组成:源码编译后的二进制(静态库包含在其中)、动态库、bundle等资源文件、plist等配置文件、代码签名文件CodeResources

可执行文件的物理结构

可执行文件包含了机器指令代码、数据、符号表、调试信息等,目标文件以的形式存储以上信息,目标文件通常包括:文件头、text段、data段、bss段

符号表
符号通常指函数和变量(还有其他符号比如段名、行号信息等),编译的最后一个阶段静态链接,就是符号的处理过程,每个目标文件都有一个符号表,记录了目标文件里面所有的符号以及对应的符号值,对于函数和变量来讲符号值就是他们的地址,符号表在程序编译之初就创建,在整个编译过程中都起着至关重要的作用,在静态链接完成之后会生成最终的符号表,动态库由于不参与主可执行文件的静态链接过程,所以符号表是抽离的

调试信息
编译器支持源代码级别的调试,debug环境下可以在程序中打断点调试,release环境下编译器会过滤掉调试信息,即编译后的二进制里面没有调试代码,因此断点是无效的

可执行程序二进制(包含了静态库)、动态库都是编译器的产物,那么为什么需要编译呢,源码不可以直接执行吗

Object-C为什么需要编译

Object-C是一门编译型语言,底层通过c、c++、汇编实现,上层架设了一层语法糖,配合强大的运行时库使用

编译原理

一句话概括:从源码生成二进制机器码的过程就是编译过程,整个过程分为四个阶段:预编译、编译、汇编、静态链接

减小包体积

我们以目标为导向,瘦包需要瘦哪些模块:可执行二进制文件、动态库、Bundle资源

上一篇 下一篇

猜你喜欢

热点阅读