美文网首页iOS开发
应用启动优化的一些小妙招

应用启动优化的一些小妙招

作者: iOS祈峰 | 来源:发表于2021-10-26 15:10 被阅读0次

    序言

    生命不止,学习不停。保持终身学习的习惯,共勉!!!最近一直在跟着一位老师在学习iOS方面的知识,整理了一些笔记,毕竟好记性不如烂笔头,,希望能对你们有所帮助。主要是关于应用启动优化,一些编译命令和二进制重排方面的。

    编译命令

    1.生成目标文件

    目标文件包含了机器指令代码、数据,链接时需要的信息,符号表、调试信息,字符串表。

    1.不指定target,默认Mach-0 64-bit object x86_64:

    image.png

    clang-o是将.c源文件编译成为一个可执行的二进制代码(-o选项其实是制定输出文件文件名,如果不加-c选项,clang默认会编译链接生成可执行文件,文件的名称由-o选项指定)。

    clang-c是使用LLVM汇编器将源文件转化为目标代码。这时,只

    1. 指定生成Mach-0 64-bit x86_64目标文件格式:

    [图片上传失败...(image-213fff-1635232213848)]

    3.如果指定target不带apple系统版本(包括macOS,ipadOS,iOS,真机和模拟器)。例如x86_64,那么生成的目标文件是Linux的ELF 64bit:

    [图片上传失败...(image-64847b-1635232213848)]

    4.编译.m:

    [图片上传失败...(image-b49615-1635232213848)]

    5.编译.mm:

    [图片上传失败...(image-9341f8-1635232213848)]

    2.查看调试信息

    dwarfdump取出并验证DWARF格式调试信息:

    [图片上传失败...(image-34dd26-1635232213848)]

    3.查看文件内容

    objdump用来查看文件内部结构,包括ELF和Maach-o:

    [图片上传失败...(image-29cfd7-1635232213848)]

    4.静态库的压缩和解压缩

    ar压缩目标文件,并对其进行编号和索引,形成静态库。同时也可以解压缩静态库,查看有哪些目标文件:

    [图片上传失败...(image-feb329-1635232213848)]

    [图片上传失败...(image-a6aa2a-1635232213848)]

    5.创建静态库

    创建库命令:libtool。可以创建静态库和动态库:

    [图片上传失败...(image-af1843-1635232213848)]

    6.创建动态库

    [图片上传失败...(image-882b49-1635232213848)]

    7.查看符号表

    nm命令:

    [图片上传失败...(image-c3586d-1635232213848)]

    symbol types:

    [图片上传失败...(image-51e28c-1635232213848)]

    [图片上传失败...(image-645ded-1635232213848)]

    [图片上传失败...(image-bbefc9-1635232213848)]

    8.生成dsYM文件

    dsymutil操作DWARF格式的debug symbol。可以将可执行文件debug symbol的生成DWARF格式的文件:

    [图片上传失败...(image-b6eb84-1635232213848)]

    9.移除符号

    strip用来移除和修改符号表:

    [图片上传失败...(image-2a2ede-1635232213848)]

    10.链接动态库与静态库

    [图片上传失败...(image-e351a8-1635232213848)]

    11.Xcode打印加载的库

    Pre-main Time指main函数执行之间的加载时间,包括dylib动态库加载,Mach-0文件加载,Rebase/Binding,OBjective-C Runtime加载等。

    Xcode自身提供了一个控制台打印这些时间的方法:在Xcode中Edit Scheme->Run->Auguments添加环境变量DYLD_PRINT_STATISTICS并把其值设为1.

    DYLD_PRINT_LIBRARIES:打印出所有被加载的库。

    DYLD_PRINT_LIBRARIES_POST_LAUNCH:打印的是通过dlopen调用返回的库,包括动态库的依赖库,主要发生在main函数运行之后。

    二进制重排

    1.链接order。file

    [图片上传失败...(image-bb203-1635232213848)]

    2.生成Link Map

    [图片上传失败...(image-be5330-1635232213848)]

    到这里了,我就把最近学得分享完了,把这些内容写到这里,对这方面的知识感觉掌握的更加牢固和顺畅了,就像拼图一样,好多碎片化的知识点都在脑海中形成了一个面,如果你也需要一些iOS方面的资料的话,请关注主页!!!

    相关文章

      网友评论

        本文标题:应用启动优化的一些小妙招

        本文链接:https://www.haomeiwen.com/subject/sjfyaltx.html