Xcode工程文件的格式说明

来源:互联网 发布:五线谱翻译简谱软件 编辑:程序博客网 时间:2024/06/05 05:19

简介

Xcode工程文件采用的是老式风格的plist文件(Next公司采用的格式,现在新的plist文件采用xml格式),它使用花括弧来组织结构化的数据。文件的开头是一个显式的编码信息,通常是采用utf8编码。这意味着它不支持带bom(Byte Ordering Mark)头的utf8格式文件,因为在开头的bom部分解析时就会失败。

注意: 文档以下的部分只是基于 *.pbxproj 文件和元素推断的结果。本文并不是对真实的代码做逆向的分析,因此可能有不准确的地方。

唯一标识码

文件中的每个元素均由一个96bit的唯一标识码表示,唯一标识码采用十六进制书写(对应24个字符,每个字符对应十六进制的4bit)。即使是不同的文档之间,唯一标识码依然是唯一的(和UUID的原理类似)。

Xcode生成唯一标识码的算法可能引入了日期、序列和其它一些预定义的值,但是并没有确切的文档说明具体的生成过程。一个合理的推测,跨文档的唯一标识码也基本是唯一的(应该不会出现两个不同元素对应相同唯一标识码的情绪)。

下面的链接是关于CMake对Xcode的支持的讨论(还有其它一些文章),或许可以提供一些信息:

  • CMake Apple XCode support
  • A brief look at the Xcode project format
  • More on the Xcode project format
  • Xcode project object UUIDs

元素

以下这些是工程文件中包含的元素类型:

  • 根节点
  • PBXBuildFile
  • PBXBuildPhase
    • PBXAppleScriptBuildPhase
    • PBXCopyFilesBuildPhase
    • PBXFrameworksBuildPhase
    • PBXHeadersBuildPhase
    • PBXResourcesBuildPhase
    • PBXShellScriptBuildPhase
    • PBXSourcesBuildPhase
  • PBXContainerItemProxy
  • PBXFileElement
    • PBXFileReference
    • PBXGroup
    • PBXVariantGroup
  • PBXTarget
    • PBXAggregateTarget
    • PBXLegacyTarget
    • PBXNativeTarget
  • PBXProject
  • PBXTargetDependency
  • XCBuildConfiguration
  • XCConfigurationList

根节点

根节点包含通用的信息。

属性类型值注释archiveVersion数字1默认值classes列表空 objectVersion数字参考 XcodeCompatibilityVersion 枚举值 objects字典字典字典的key是前面讲到的唯一标识码rootObject引用一个元素的引用每个 object 对应一个 PBXProject 元素的引用

例子:

// !$*UTF8*$!{    archiveVersion = 1;    classes = {    };    objectVersion = 45;    objects = {    ...    };    rootObject = 0867D690FE84028FC02AAC07 /* Project object */;}

PBXAggregateTarget

不同构建目标的集合(含依赖关系)。

属性类型值注释referenceUUID96bit的表示码 isaPBXAggregateTarget空 buildConfigurationList引用元素的引用对应 XCConfigurationList 类型buildPhases列表元素引用的列表列表元素对应 PBXBuildPhase 类型dependencies列表元素引用的列表列表元素对应 PBXTargetDependency 类型name字符串目标的名字 productName字符串产品的名字?

例子:

4DA521A6115A00AF007C19C3 /* documentation */ = {    isa = PBXAggregateTarget;    buildConfigurationList = 4DA521AE115A00ED007C19C3 /* Build configuration list for PBXAggregateTarget "documentation" */;    buildPhases = (        4DA521A5115A00AF007C19C3 /* ShellScript */,    );    dependencies = (        4DA521AA115A00BC007C19C3 /* PBXTargetDependency */,    );    name = documentation;    productName = documentation;};

PBXBuildFile

文件元素,被PBXBuildPhase等作为文件包含或被引用的资源。

属性类型值注释referenceUUID96bit的表示码 isaPBXBuildFile空 fileRef引用元素引用对应PBXFileReferenc元素settings字典扩展的配置信息,对应 key/value 字典?

例子:

4D05CA6B1193055000125045 /* xxx.c in Sources */ = {    isa = PBXBuildFile;    fileRef = 4D05CA411193055000125045 /* xxx.c */;};

PBXBuildPhase

一个抽象的构建阶段,最终需有对应到具体化的构建对象。

PBXContainerItemProxy

目标对象的容器。

属性类型值注释referenceUUID96bit的表示码 isaPBXContainerItemProxy空 containerPortal引用元素的引用引用 PBXProject 元素proxyType数字1 remoteGlobalIDString引用元素的引用使用全局唯一的ID引用remoteInfo字符串 ?

例子:

4D22DC0C1167C992007AF714 /* PBXContainerItemProxy */ = {    isa = PBXContainerItemProxy;    containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;    proxyType = 1;    remoteGlobalIDString = 87293EBF1153C114007AFD45;    remoteInfo = xxx;};

PBXCopyFilesBuildPhase

构建阶段复制文件信息。

属性类型值注释referenceUUID96bit的表示码 isaPBXCopyFilesBuildPhase空 buildActionMask数字2^32-1 dstPath字符串目标文件的路径 dstSubfolderSpec数字  files列表元素引用的列表对应 PBXBuildFile 元素runOnlyForDeploymentPostprocessing数字0?

例子:

MISSING

PBXFileElement

抽象类型,对应具体化的文件和group组元素。

PBXFileReference

用于跟踪项目引用的每一个外部文件,比如源代码文件、资源文件、库文件、生成目标文件等。

属性类型值注释referenceUUID96bit的表示码 isaPBXFileReference空 fileEncoding数字参考 PBXFileEncoding explicitFileType字符串参考 the PBXFileType lastKnownFileType字符串参考 PBXFileType name字符串文件名 path字符串文件名路径 sourceTree字符串参考 PBXSourceTree?

例子:

87293F901153D870007AFD45 /* monobjc.mm */ = {    isa = PBXFileReference;     fileEncoding = 4;     lastKnownFileType = sourcecode.cpp.objcpp;     name = monobjc.mm;     path = sources/monobjc.mm;     sourceTree = "";};

PBXFrameworksBuildPhase

用于framewrok构建的链接阶段。

属性类型值注释referenceUUID96bit的表示码 isaPBXFrameworksBuildPhase空 buildActionMask数字2^32-1 files列表元素引用的列表对应 PBXBuildFile 类型runOnlyForDeploymentPostprocessing数字0?

例子:

4D05CA2C119304BD00125045 /* Frameworks */ = {    isa = PBXFrameworksBuildPhase;    buildActionMask = 2147483647;    files = (    );    runOnlyForDeploymentPostprocessing = 0;};

PBXGroup

用于打组文件,或者嵌套组。

属性类型值注释referenceUUID96bit的表示码 isaPBXGroup空 children列表元素引用的列表对应 PBXFileElement 元素类型name字符串The filename. sourceTree字符串参考 PBXSourceTree?

例子:

4DA521A2115A003E007C19C3 /* scripts */ = {    isa = PBXGroup;    children = (    4D22DBAF116742DE007AF714 /* fix_references.sh */,    4DA521A1115A0032007C19C3 /* generate_descriptors.sh */,    );    name = scripts;    sourceTree = "";};

PBXHeadersBuildPhase

用于framewrok构建的链接阶段。

属性类型值注释referenceUUID96bit的表示码 isaPBXHeadersBuildPhase空 buildActionMask数字2^32-1 files列表元素引用的列表对应 PBXBuildFile 元素类型runOnlyForDeploymentPostprocessing数字0?

例子:

87293EBC1153C114007AFD45 /* Headers */ = {    isa = PBXHeadersBuildPhase;    buildActionMask = 2147483647;    files = (    );    runOnlyForDeploymentPostprocessing = 0;};

PBXLegacyTarget

MISSING

PBXNativeTarget

对应生成可执行的二进制程序或库文件的本地构建目标对象。

属性类型值注释referenceUUID96bit的表示码isaPBXNativeTarget空 buildConfigurationList引用元素引用对应 XCConfigurationList 类型buildPhases列表元素引用的列表对应 PBXBuildPhase 元素类型dependencies列表元素引用的列表对应 PBXTargetDependency 元素类型name字符串目标的名字 productInstallPath字符串产品的安装路径 productName字符串产品的名字 productReference引用元素的引用对应 PBXFileReference 元素类型productType字符串参考 PBXProductType?

例子:

8D1107260486CEB800E47090 /* XXX */ = {    isa = PBXNativeTarget;    buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "XXX" */;    buildPhases = (        8D1107290486CEB800E47090 /* Resources */,        8D11072C0486CEB800E47090 /* Sources */,        8D11072E0486CEB800E47090 /* Frameworks */,    );    buildRules = (    );    dependencies = (    );    name = XXX;    productInstallPath = "$(HOME)/Applications";    productName = TrackIt;    productReference = 8D1107320486CEB800E47090 /* XXX.app */;    productType = "com.apple.product-type.application";};

PBXProject

工程,对应构建可执行的二进制目标程序或库。

属性类型值注释referenceUUID96bit的表示码 isaPBXProject空 buildConfigurationList引用元素的引用对应 XCConfigurationList 类型compatibilityVersion字符串XcodeCompatibilityVersion 对应的字符串表示 developmentRegion字符串开发者所在区域 hasScannedForEncodings数字0 or 1是否已经扫描了文件编码信息knownRegions列表字符串列表不同区域的本地资源文件列表mainGroup引用元素的引用对应 PBXGroup 类型productRefGroup引用元素的引用对应 PBXGroup 类型 projectDirPath字符串相对工程的相对路径 projectReferences字典列表列表中的每个字典元素包含 ProductGroup和ProjectRef两个成员 projectRoot字符串根目录路径(相对路径) targets列表元素引用的列表对应 PBXTarget 元素类型

例子:

29B97313FDCFA39411CA2CEA /* Project object */ = {        isa = PBXProject;        buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "XXX" */;        compatibilityVersion = "Xcode 2.4";        developmentRegion = English;        hasScannedForEncodings = 1;        knownRegions = (                English,                Japanese,                French,                German,                en,        );        mainGroup = 29B97314FDCFA39411CA2CEA /* XXX*/;        projectDirPath = "";        projectRoot = "";        targets = (             8D1107260486CEB800E47090 /* XXX*/,        );};

PBXResourcesBuildPhase

构建阶段需要复制的资源文件。

属性类型值注释referenceUUID96bit的表示码 isaPBXResourcesBuildPhase空 buildActionMask数字2^32-1 files列表元素引用的列表对应 PBXBuildFile 元素类型runOnlyForDeploymentPostprocessing数字0?

例子:

8D1107290486CEB800E47090 /* Resources */ = {        isa = PBXResourcesBuildPhase;        buildActionMask = 2147483647;        files = (                535C1E1B10AB6B6300F50231 /* ReadMe.txt in Resources */,                533B968312721D05005E617D /* Credits.rtf in Resources */,                533B968412721D05005E617D /* InfoPlist.strings in Resources */,                533B968512721D05005E617D /* MainMenu.nib in Resources */,                533B968612721D05005E617D /* TableEdit.nib in Resources */,                533B968712721D05005E617D /* TestWindow.nib in Resources */,        );        runOnlyForDeploymentPostprocessing = 0;};

PBXShellScriptBuildPhase

用于构建阶段复制资源文件的shell脚本。

属性类型值注释referenceUUID96bit的表示码 isaPBXShellScriptBuildPhase空 buildActionMask数字2^32-1 files列表元素引用的列表对应 PBXBuildFile 类型inputPaths列表字符串列表输入的路径列表outputPaths列表字符串列表输出的路径列表runOnlyForDeploymentPostprocessing数字0 shellPath字符串shell解释器程序的路径 shellScript字符串shell脚本程序的内容?

例子:

4D22DBAE11674009007AF714 /* ShellScript */ = {        isa = PBXShellScriptBuildPhase;        buildActionMask = 2147483647;        files = (        );        inputPaths = (        );        outputPaths = (        );        runOnlyForDeploymentPostprocessing = 0;        shellPath = /bin/sh;        shellScript = "./fix_references.sh";};

PBXSourcesBuildPhase

构建阶段中编译源文件。

属性类型值注释referenceUUID96bit的表示码 isaPBXSourcesBuildPhase空 buildActionMask数字2^32-1 files列表元素引用的列表对应 PBXBuildFile 类型runOnlyForDeploymentPostprocessing数字0?

例子:

4DF8B22D1171CFBF0081C1DD /* Sources */ = {        isa = PBXSourcesBuildPhase;        buildActionMask = 2147483647;        files = (                4DF8B23E1171D0310081C1DD /* test.mm in Sources */,        );        runOnlyForDeploymentPostprocessing = 0;};

PBXTarget

抽象对象,对应具体化的构建目标。

PBXTargetDependency

目标的外部依赖管理。

属性类型值注释referenceUUID96bit的表示码 isaPBXTargetDependency空 target引用元素引用对应 PBXNativeTarget 类型targetProxy引用元素引用对应 PBXContainerItemProxy 类型

例子:

4D22DC0D1167C992007AF714 /* PBXTargetDependency */ = {        isa = PBXTargetDependency;        target = 87293EBF1153C114007AFD45 /* libXXX */;        targetProxy = 4D22DC0C1167C992007AF714 /* PBXContainerItemProxy */;};

PBXVariantGroup

对不同地区资源文件的引用管理。

属性类型值注释referenceUUID96bit的表示码 isaPBXVariantGroup空 children列表元素引用的列表对应 PBXFileElement 类型name字符串文件名 sourceTree字符串参考 PBXSourceTree?

例子:

870C88031338A77600A69309 /* MainMenu.xib */ = {        isa = PBXVariantGroup;        children = (                870C88041338A77600A69309 /* en */,        );        name = MainMenu.xib;        sourceTree = "";};

XCBuildConfiguration

构建配置元素。

属性类型值注释referenceUUID96bit的表示码 isaXCBuildConfiguration空 baseConfigurationReference字符串xcconfig文件的路径 buildSettings字典构建配置信息的字典 name字符串配置名?

例子:

870C88151338ABB600A69309 /* Debug */ = {        isa = XCBuildConfiguration;        buildSettings = {                PRODUCT_NAME = "$(TARGET_NAME)";        };        name = Debug;};870C88161338ABB600A69309 /* Release */ = {        isa = XCBuildConfiguration;        buildSettings = {                PRODUCT_NAME = "$(TARGET_NAME)";        };        name = Release;};

XCConfigurationList

构建配置相关元素的列表。

属性类型值注释referenceUUID96bit的表示码 isaXCConfigurationList空 buildConfigurations列表引用对象的列表每个引用对象对应一个 XCBuildConfiguration 元素defaultConfigurationIsVisible数字0 defaultConfigurationName字符串配置文件的默认名称?

例子:

870C87E41338A77600A69309 /* Build configuration list for PBXProject "CocoaApp" */ = {        isa = XCConfigurationList;        buildConfigurations = (                870C88061338A77600A69309 /* Debug */,                870C88071338A77600A69309 /* Release */,        );        defaultConfigurationIsVisible = 0;        defaultConfigurationName = Release;};