当前位置: 首页 > 科技观察

Xcode工程分析

时间:2023-03-12 13:08:19 科技观察

1。背景Xcode作为iOS程序日常开发的IDE,支持C、C++、Objective-C、Swift、Ruby等语言编写。日常的开发入口是Xcodeworkspace或者Xcodeproject。工作区是一个Xcode文档,用于对项目和其他文件、项目进行分组。一个工作区可以包含任意数量的Xcode项目,以及资源文件(JSON、脚本、图像、视频等)。除了在每个项目中组织文件外,工作区还提供包含的项目及其目标之间的隐式和显式关系。Project是一个Xcode项目,是实际管理项目下的targets、源代码、资源文件、框架等。一个项目只是一个容器,不能自己编译,所以每个项目至少应该有一个可编译的目标,目标需要包含可编译的源代码。在日常开发中,难免要在非Xcode环境下操作工作区或项目中的依赖,所以了解工作区、项目、源代码、资源文件之间的关系就显得尤为重要,因为你知道如何获取那里。怎么做。2.了解工作区的整体情况。从上图可以很容易看出工作空间和项目的关系:一个工作空间可以包含多个项目,一个项目可以包含多个目标配置,即Xcode中的Debug/Release等项目配置方案。为每个配置target编译参数target是每次编译生成的对应产品:app或framework3。探索工作空间,创建一个空的工作空间,直接看它的层级树:可以看到工作空间主要包括三个层次:xcworkspacedata,工作空间的配置文件,其实就是一个XML文件。xcshareddata:可共享的配置,包括scheme、script等信息。xcuserdata:当前配置,包括本地scheme、脚本、断点信息等。以引用项目为例,详细查看contents.xcworkspacedata的内容:FileRef,顾名思义,标记了工作空间中各个文件的路径关系,这种关系决定了项目在Xcode中的显示层次。location关键字包括:self:当前文件夹下的同名projectgroup:指定目录下的xcodeproj文件container:workspace当前目录下的不同名的xcodeproj文件absolute:绝对路径下的文件经过探索,我们可以看到工作空间确实只是一个组织项目等文件的工作空间。不具备编译整合源代码和资源的能力。只有进一步探索项目文件,我们才能看到源代码和资源文件。它是如何集成的。从上图可以看出,xcodeproj包含三个主要层次,xcuserdata中包含的常用方案和配置文件,以及一个xcodeworkspace,这是为了保证Xcode的兼容性,保持Xcode管理文件逻辑的统一性。xcodeproj包含了开发所需的所有文件,管理了当前项目的所有源代码、资源文件、配置文件等。重点是pbxproj文件,这个文件与我们正常编译代码密切相关。在这里管理目标,文件之间的引用依赖关系,以及合并代码时的文件冲突。4.1深入pbxprojpbxproj全拼即ProjectBuilderXcodeProject,其实就是我们比较熟悉的一种plist文件,但是可读性不如我们常用的plist文件,由于历史原因被Xcode保留了下来.在pbxproj中定义了target、script、file、configuration等的引用关系。我们看到的Xcode工程布局其实就是将pbxproj可视化了。看看pbxproj的内部布局:可以看到最外层包含这些属性:archiveVersion当前文件版本classesplaceholderobjectVersion当前文件需要的Xcode对象的最低版本以每个对象的uuid为键的字典,存储的Object属性rootObject当前文件的根对象(isa=PBXProject),实际存储的是各个文件之间的依赖关系。我们称每个文件为Xcode对象。这个Xcode对象不仅可以是源代码文件,还可以是group、framework、app、target、scheme等。从上图中的rootObject=D9658FA7290BA51D00A72187,我们简单看一下它作为一个Xcode对象的内部结构:我们可以看到比较重要的信息是isa,mainGroup,configration,target,其他信息也包括我们在Xcode中看到的,可以是所有的配置信息。这只是PBXProject中的信息,所有信息都可以在官网查询。下面列出所有类型的配置:PBXProject:项目配置,编译项目所需的信息PBXNativeTarget:目标配置PBXTargetDependency:目标依赖配置PBXContainerItemProxy:部署元素XCConfigurationList:Xcode中的配置配置XCBuildConfiguration:XcodeBuildSettings配置PBXVariantGroup:Storyboard文件配置PBXBuildFile:各种文件配置PBXFileReference:各种文件引用配置PBXGroup:Xcode中的组PBXSourcesBuildPhase:待编译的已编译源文件PBXFrameworksBuildPhase:待编译的框架PBXResourcesBuildPhase:源代码以外的资源文件它们之间的关系大致如下:知道各个文件的关系可以为我们以后通过脚本动态增删改查文件,修改构建设置,scheme等操作打下基础。5、探索方案不是编制目标的必要条件。没有scheme,不会影响Xcode的编译运行。但是没有scheme,我们就不能传入参数条件,插入编译脚本,配置个性化的编译配置,所以scheme就是Xcode。编译时必需的选项。打开一个scheme源文件,我们可以看到如下布局:可以看到,最外层包含build、test、launch、profile、analyze、archive。正好对应Xcode中的相应命令,再次验证Xcode就是pbxproj的可视化呈现。进入BuildAction,可以看到我们在Xcode中添加的预编译脚本和各种环境变量配置。这些配置有的是编译过程中必不可少的参数,有的是我们管理编译产品的必要配置。灵活运用这些配置,就可以让Xcode更好的为我们服务。6.搜索targettarget用于指定要构建的产品,即framework或app。target只包含当前项目中指定的部分代码和资源文件。每个目标只能构建一个特定的构建产品。为了丰富构建产品,一个项目可以有多个目标。目标使用构建设置和构建阶段进行个性化配置。默认情况下,这些配置可以被项目继承,也可以手动或通过配置文件覆盖其他配置。目标可以相互依赖。如果它们在同一个工作区,Xcode会默认触发隐式依赖。当然,如果你手动配置依赖,它们就会变成显式依赖。显式依赖优先于隐式依赖。七、总结与展望根据以上的介绍,想必大家对Xcode项目配置有了一定的了解。了解了这些之后,我们能做什么呢?其实玩法有很多种:根据不同的编译方案和编译指令,将编译好的产品提取出来分发给不同的人员。根据不同的目标,在不改变源代码的情况下,为每次编译设置不同的环境测试包。查看编译过程中的警告信息,及时反馈给开发者。在编译时查找无效代码和文件。使用cocoapods的动态配置,在安装时直接引入二进制组件,提高编译速度。将指定框架的编译日志输出到文件中,以供对比参考。了解了这些基本配置后,我们在以后的项目工程中解决重复性高或难度大的问题时就会有更多的手段,工作过程中也能发现更多新的玩法。作者简介:王一飞,经销商事业部、经销商技术部,2014年加入汽车之家,目前在经销商事业部-经销商技术部工作,负责汽车行情App和M站业务的研发。