美文网首页iOSiOS开发工具及插件精选动态库
聊聊 Xcode 编译工具链(ToolChain)

聊聊 Xcode 编译工具链(ToolChain)

作者: f9dd77add98e | 来源:发表于2016-08-23 13:46 被阅读1301次

    “民之失德,乾糇以愆;他山之石,可以攻玉。”- 《诗经》

    绝大部分开发者开发iOS或者Mac APP 都会选择Xcode集成开发环境。Xcode是一款强大的GUI IDE,集开发、编译、调试和代码分析于一体,而在这背后,则是一系列工具的支撑,本文聊聊Xcode在编译过程涉及的工具及其作用。

    一、编译ToolChain初窥

    图1展示了在Xcode中选择Build时编译工程test-toolchain时的过程:

    图1:Build工程test-toolchain时的过程

    从图1中可以看见,在Xcode中点击Build后,Xcode首先调用工具mkdir创建product目录,然后调用clang编译源码文件和链接生成可执行文件,调用ibtool编译storyboard文件,调用actool编译Asset文件等。可能是考虑到GUI的简洁和局限,Xcode并没有给出所有的编译涉及到的工具,我们通过命令行的方式来探索下~~

    二、“黑乎乎”版的Xcode:xcodebuild

    2.1 xcodebuild命令行编译Xcode工程

    xcodebuild是编译Xcode工程的命令行工具,比如可用如下命令编译test-toolchain工程:

    xcodebuild -project test-toolchain.xcodeproj -configuration Debug build

    上面的命令表示:编译debug版本的test-toolchain,xcodebuild支持众多的选项配置,不指定会使用默认的设置。

    命令行的输出显示了更多的细节,如下部分片段:

    === BUILD TARGET test-toolchain OF PROJECT test-toolchain WITH CONFIGURATION Debug ===

    Check dependencies

    Write auxiliary files

    write-file /Users/netease/Desktop/ForTestApp/test-toolchain/...

    ...

    Create product structure /bin/mkdir -p /Users/netease/Desktop/ForTestApp/.../test-toolchain.app

    ...

    ** BUILD SUCCEEDED **

    在其中,我们发现暴露了新的工具,如:builtin-productPackagingUtility打包工具、codesign签名工具等。那么,还有方法暴露更多的编译细节出来吗?请向下看~~

    2.2 Patch版的xcodebuild编译Xcode工程

    利用DYLD_INSERT_LIBRARIES实现对Mac程序的动态库注入已经广为人知,在执行文件加载时,会调用注入库的构造函数,我们可以在这里将执行文件的名字打印出来,从而获取xcodebuild编译更多的细节。

    动态库代码(名字为test_injector)如图2:

    图2:动态库test_injector代码

    将injector编译,得到库:test_injector.dylib,然后注入到xcodebuild,如下:

    DYLD_INSERT_LIBRARIES=./test_injector.dylib xcodebuild -project test-toolchain.xcodeproj -configuration Debug build

    这次得到的信息如下:

    2016-07-28 19:00:53.874 xcodebuild[2038:85610] tool name:xcodebuild

    2016-07-28 19:00:53.904 xcodebuild[2038:85610] tool name:xcodebuild

    === BUILD TARGET test-toolchain OF PROJECT test-toolchain WITH CONFIGURATION Debug ===

    Check dependencies

    2016-07-28 19:00:54.396 sh[2042:85682] tool name:sh

    2016-07-28 19:00:54.426 sh[2045:85685] tool name:sh

    ...

    CompileC build/test-toolchain.build/Debug-iphoneos/...

    2016-07-28 19:00:54.470 xcexec[2047:85693] tool name:xcexec

    2016-07-28 19:00:54.481 clang[2047:85693] tool name:clang

    2016-07-28 19:00:54.492 clang[2051:85701] tool name:clang

    ...

    ** BUILD SUCCEEDED **

    可以看见,信息进一步丰富了,比如工具xcexec等。

    三、Xcode编译Toolchain汇总

    使用patch版的xcodebuild,我们获得了Xcode在编译一个工程时所涉及的工具图谱,总结的信息见下表1:

    表1:Xcode 编译 ToolChain介绍

    工具名称用途介绍

    xcodebuild编译Xcode工程的命令行工具

    shShell工具

    mkdir创建目录

    xcexec执行wrapper

    clang编译器,内部封装了编译、优化过程

    ld链接器

    ibtoolnib资源文件本地化

    ibtoold资源文件链接

    actoolasset资源文件编译

    builtin-infoPlistUtilityPlist文件编译工具

    builtin-productPackagingUtility打包工具

    touch文件创建

    codesign创建、查看和修改签名

    codesign_allocate为Mach-O文件增加签名数据

    builtin-validationUtility校验工具

    获得这些信息有什么好处呢,这个就是仁者见仁了,比如获取clang编译源码文件的时间,这儿也可当做一个切入点。

    网易云捕-网易旗下最专业的APP质量跟踪平台

    相关文章

      网友评论

      • 狗狗臭鸡蛋:xcodebuild -project test-toolchain.xcodeproj -configuration Debug build
        只是使用这个命令,换了自己的工程名字,但是报错:
        ** BUILD FAILED **


        The following build commands failed:
        Ld build/Debug-iphoneos/Test.app/Test normal armv7
        (1 failure)
        请问是什么问题呢?

      本文标题:聊聊 Xcode 编译工具链(ToolChain)

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