Xcode工程文件的格式说明

简介

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

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

唯一标识码

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

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

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

元素

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

  • 根节点
  • 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

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

属性 类型 注释
reference UUID 96bit的表示码
isa PBXAggregateTarget
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等作为文件包含或被引用的资源。

属性 类型 注释
reference UUID 96bit的表示码
isa PBXBuildFile
fileRef 引用 元素引用 对应PBXFileReferenc元素
settings 字典 扩展的配置信息,对应 key/value 字典 ?

例子:

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

PBXBuildPhase

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

PBXContainerItemProxy

目标对象的容器。

属性 类型 注释
reference UUID 96bit的表示码
isa PBXContainerItemProxy
containerPortal 引用 元素的引用 引用 PBXProject 元素
proxyType 数字 1
remoteGlobalIDString 引用 元素的引用 使用全局唯一的ID引用
remoteInfo 字符串 ?

例子:

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

PBXCopyFilesBuildPhase

构建阶段复制文件信息。

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

例子:

MISSING

PBXFileElement

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

PBXFileReference

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

属性 类型 注释
reference UUID 96bit的表示码
isa PBXFileReference
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构建的链接阶段。

属性 类型 注释
reference UUID 96bit的表示码
isa PBXFrameworksBuildPhase
buildActionMask 数字 2^32-1
files 列表 元素引用的列表 对应 PBXBuildFile 类型
runOnlyForDeploymentPostprocessing 数字 0 ?

例子:

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

PBXGroup

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

属性 类型 注释
reference UUID 96bit的表示码
isa PBXGroup
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构建的链接阶段。

属性 类型 注释
reference UUID 96bit的表示码
isa PBXHeadersBuildPhase
buildActionMask 数字 2^32-1
files 列表 元素引用的列表 对应 PBXBuildFile 元素类型
runOnlyForDeploymentPostprocessing 数字 0 ?

例子:

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

PBXLegacyTarget

MISSING

PBXNativeTarget

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

属性 类型 注释
reference UUID 96bit的表示码
isa PBXNativeTarget
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

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

属性 类型 注释
reference UUID 96bit的表示码
isa PBXProject
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

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

属性 类型 注释
reference UUID 96bit的表示码
isa PBXResourcesBuildPhase
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脚本。

属性 类型 注释
reference UUID 96bit的表示码
isa PBXShellScriptBuildPhase
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

构建阶段中编译源文件。

属性 类型 注释
reference UUID 96bit的表示码
isa PBXSourcesBuildPhase
buildActionMask 数字 2^32-1
files 列表 元素引用的列表 对应 PBXBuildFile 类型
runOnlyForDeploymentPostprocessing 数字 0 ?

例子:

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

PBXTarget

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

PBXTargetDependency

目标的外部依赖管理。

属性 类型 注释
reference UUID 96bit的表示码
isa PBXTargetDependency
target 引用 元素引用 对应 PBXNativeTarget 类型
targetProxy 引用 元素引用 对应 PBXContainerItemProxy 类型

例子:

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

PBXVariantGroup

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

属性 类型 注释
reference UUID 96bit的表示码
isa PBXVariantGroup
children 列表 元素引用的列表 对应 PBXFileElement 类型
name 字符串 文件名
sourceTree 字符串 参考 PBXSourceTree ?

例子:

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

XCBuildConfiguration

构建配置元素。

属性 类型 注释
reference UUID 96bit的表示码
isa XCBuildConfiguration
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

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

属性 类型 注释
reference UUID 96bit的表示码
isa XCConfigurationList
buildConfigurations 列表 引用对象的列表 每个引用对象对应一个 XCBuildConfiguration 元素
defaultConfigurationIsVisible 数字 0
defaultConfigurationName 字符串 配置文件的默认名称 ?

例子:

870C87E41338A77600A69309 /* Build configuration list for PBXProject "CocoaApp" */ = {
        isa = XCConfigurationList;
        buildConfigurations = (
                870C88061338A77600A69309 /* Debug */,
                870C88071338A77600A69309 /* Release */,
        );
        defaultConfigurationIsVisible = 0;
        defaultConfigurationName = Release;
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,646评论 4 366
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,979评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,391评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,356评论 0 215
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,740评论 3 293
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,836评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,022评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,764评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,487评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,728评论 2 252
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,200评论 1 263
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,548评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,217评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,134评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,921评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,919评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,766评论 2 274

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,105评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,585评论 25 707
  • 我有幸看到了作家李森祥《台阶》这篇文章。文中父亲为了实现建一座有高台阶的新屋的梦,他捡砖、捡瓦、捡石头、存角票种...
    雏鹰阅读 354评论 0 0
  • 昨天睡的太晚,刚起来就收到同学的微信,还想看我再写点,让我的冷汗瞬间就湿遍啦全身,亲爱的你!难道真的不知道我...
    周木木_9dfd阅读 364评论 0 0