iOS 编译过程的原理和应用

2018-12-20  本文已影响64人  阿灿V587

前言

__attribute__

Clang警告处理

预处理

插入编译期脚本

提高项目编译速度

iOS编译

编译器前端

编译器后端

LVVM优化器会进行BitCode的生成,链接期优化等等。

LLVM机器码生成器会针对不同的架构,比如arm64等生成不同的机器码。

执行一次XCode build的流程

编译信息写入辅助文件,创建编译后的文件架构(name.app)

处理文件打包信息,例如在debug环境下

执行CocoaPod编译前脚本

例如对于使用CocoaPod的工程会执行CheckPods Manifest.lock

编译各个.m文件,使用CompileC和clang命令。

链接需要的Framework,例如Foundation.framework,AFNetworking.framework,ALiPay.fframework

编译xib文件

拷贝xib,图片等资源文件到结果目录

编译ImageAssets

处理info.plist

执行CocoaPod脚本

拷贝Swift标准库

创建.app文件和对其签名

IPA包的内容

右键ipa,重命名为.zip

右键图中的WeChat,选择显示包内容,然后就能够看到实际的ipa包内容了。

二进制文件的内容

Object files

Sections

__TEXT 代码段

__DATA 数据段 

Symbols

dSYM 文件

右键 -> 在finder中显示。

右键 -> 查看包内容。

iOS 如何调试第三方统计到的崩溃报告

那些你想到和想不到的应用场景

__attribute__

Clang警告处理

对当前编译环境进行压栈

忽略-Wundeclared-selector(未声明的)Selector警告

编译代码

对编译环境进行出栈

iOS 合理利用Clang警告来提高代码质量

预处理

插入脚本

Check Pods Manifest.lock,用来检查cocoapod管理的三方库是否需要更新

Embed Pods Framework,运行脚本来链接三方库的静态/动态库

Copy Pods Resources,运行脚本来拷贝三方库的资源文件 

Xcode - 选中Target - 选中build phase 

选择添加Run Script Phase

然后把这段脚本拷贝进去,并且勾选Run Script Only When installing,保证只有我们在安装到设备上的时候,才会执行这段脚本。重命名脚本的名字为Auto Increase build number

然后,拖动这个脚本的到Link Binary With Libraries下面

脚本编译打包

提高项目编译速度

查看编译时间

forward declaration

对常用的工具类进行打包(Framework/.a)

常用头文件放到预编译文件里

Debug模式下,不生成dsym文件

Debug开启Build Active Architecture Only

Debug模式下,关闭编译器优化

后续

写入额外的编译信息

函数的调用过程和运行时找到函数在二进制文件中的的地址

……

附录

上一篇 下一篇

猜你喜欢

热点阅读