簡(jiǎn)介
Xcode工程文件采用的是老式風(fēng)格的plist文件(Next公司采用的格式,現(xiàn)在新的plist文件采用xml格式),它使用花括弧來(lái)組織結(jié)構(gòu)化的數(shù)據(jù)。文件的開(kāi)頭是一個(gè)顯式的編碼信息,通常是采用utf8編碼。這意味著它不支持帶bom(Byte Ordering Mark)頭的utf8格式文件,因?yàn)樵陂_(kāi)頭的bom部分解析時(shí)就會(huì)失敗。
注意: 文檔以下的部分只是基于 *.pbxproj 文件和元素推斷的結(jié)果。本文并不是對(duì)真實(shí)的代碼做逆向的分析,因此可能有不準(zhǔn)確的地方。
唯一標(biāo)識(shí)碼
文件中的每個(gè)元素均由一個(gè)96bit的唯一標(biāo)識(shí)碼表示,唯一標(biāo)識(shí)碼采用十六進(jìn)制書寫(對(duì)應(yīng)24個(gè)字符,每個(gè)字符對(duì)應(yīng)十六進(jìn)制的4bit)。即使是不同的文檔之間,唯一標(biāo)識(shí)碼依然是唯一的(和UUID的原理類似)。
Xcode生成唯一標(biāo)識(shí)碼的算法可能引入了日期、序列和其它一些預(yù)定義的值,但是并沒(méi)有確切的文檔說(shuō)明具體的生成過(guò)程。一個(gè)合理的推測(cè),跨文檔的唯一標(biāo)識(shí)碼也基本是唯一的(應(yīng)該不會(huì)出現(xiàn)兩個(gè)不同元素對(duì)應(yīng)相同唯一標(biāo)識(shí)碼的情緒)。
下面的鏈接是關(guān)于CMake對(duì)Xcode的支持的討論(還有其它一些文章),或許可以提供一些信息:
- CMake Apple XCode support
- A brief look at the Xcode project format
- More on the Xcode project format
- Xcode project object UUIDs
元素
以下這些是工程文件中包含的元素類型:
- 根節(jié)點(diǎn)
- PBXBuildFile
- PBXBuildPhase
- PBXAppleScriptBuildPhase
- PBXCopyFilesBuildPhase
- PBXFrameworksBuildPhase
- PBXHeadersBuildPhase
- PBXResourcesBuildPhase
- PBXShellScriptBuildPhase
- PBXSourcesBuildPhase
- PBXContainerItemProxy
- PBXFileElement
- PBXFileReference
- PBXGroup
- PBXVariantGroup
- PBXTarget
- PBXAggregateTarget
- PBXLegacyTarget
- PBXNativeTarget
- PBXProject
- PBXTargetDependency
- XCBuildConfiguration
- XCConfigurationList
根節(jié)點(diǎn)
根節(jié)點(diǎn)包含通用的信息。
| 屬性 | 類型 | 值 | 注釋 |
|---|---|---|---|
| archiveVersion | 數(shù)字 | 1 | 默認(rèn)值 |
| classes | 列表 | 空 | |
| objectVersion | 數(shù)字 | 參考 XcodeCompatibilityVersion 枚舉值 | |
| objects | 字典 | 字典 | 字典的key是前面講到的唯一標(biāo)識(shí)碼 |
| rootObject | 引用 | 一個(gè)元素的引用 | 每個(gè) object 對(duì)應(yīng)一個(gè) PBXProject 元素的引用 |
例子:
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 45;
objects = {
...
};
rootObject = 0867D690FE84028FC02AAC07 /* Project object */;
}
PBXAggregateTarget
不同構(gòu)建目標(biāo)的集合(含依賴關(guān)系)。
| 屬性 | 類型 | 值 | 注釋 |
|---|---|---|---|
| reference | UUID | 96bit的表示碼 | |
| isa | PBXAggregateTarget | 空 | |
| buildConfigurationList | 引用 | 元素的引用 | 對(duì)應(yīng) XCConfigurationList 類型 |
| buildPhases | 列表 | 元素引用的列表 | 列表元素對(duì)應(yīng) PBXBuildPhase 類型 |
| dependencies | 列表 | 元素引用的列表 | 列表元素對(duì)應(yīng) PBXTargetDependency 類型 |
| name | 字符串 | 目標(biāo)的名字 | |
| productName | 字符串 | 產(chǎn)品的名字 | ? |
例子:
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 | 引用 | 元素引用 | 對(duì)應(yīng)PBXFileReferenc元素 |
| settings | 字典 | 擴(kuò)展的配置信息,對(duì)應(yīng) key/value 字典 | ? |
例子:
4D05CA6B1193055000125045 /* xxx.c in Sources */ = {
isa = PBXBuildFile;
fileRef = 4D05CA411193055000125045 /* xxx.c */;
};
PBXBuildPhase
一個(gè)抽象的構(gòu)建階段,最終需有對(duì)應(yīng)到具體化的構(gòu)建對(duì)象。
PBXContainerItemProxy
目標(biāo)對(duì)象的容器。
| 屬性 | 類型 | 值 | 注釋 |
|---|---|---|---|
| reference | UUID | 96bit的表示碼 | |
| isa | PBXContainerItemProxy | 空 | |
| containerPortal | 引用 | 元素的引用 | 引用 PBXProject 元素 |
| proxyType | 數(shù)字 | 1 | |
| remoteGlobalIDString | 引用 | 元素的引用 | 使用全局唯一的ID引用 |
| remoteInfo | 字符串 | ? |
例子:
4D22DC0C1167C992007AF714 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 87293EBF1153C114007AFD45;
remoteInfo = xxx;
};
PBXCopyFilesBuildPhase
構(gòu)建階段復(fù)制文件信息。
| 屬性 | 類型 | 值 | 注釋 |
|---|---|---|---|
| reference | UUID | 96bit的表示碼 | |
| isa | PBXCopyFilesBuildPhase | 空 | |
| buildActionMask | 數(shù)字 | 2^32-1 | |
| dstPath | 字符串 | 目標(biāo)文件的路徑 | |
| dstSubfolderSpec | 數(shù)字 | ||
| files | 列表 | 元素引用的列表 | 對(duì)應(yīng) PBXBuildFile 元素 |
| runOnlyForDeploymentPostprocessing | 數(shù)字 | 0 | ? |
例子:
MISSING
PBXFileElement
抽象類型,對(duì)應(yīng)具體化的文件和group組元素。
PBXFileReference
用于跟蹤項(xiàng)目引用的每一個(gè)外部文件,比如源代碼文件、資源文件、庫(kù)文件、生成目標(biāo)文件等。
| 屬性 | 類型 | 值 | 注釋 |
|---|---|---|---|
| reference | UUID | 96bit的表示碼 | |
| isa | PBXFileReference | 空 | |
| fileEncoding | 數(shù)字 | 參考 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構(gòu)建的鏈接階段。
| 屬性 | 類型 | 值 | 注釋 |
|---|---|---|---|
| reference | UUID | 96bit的表示碼 | |
| isa | PBXFrameworksBuildPhase | 空 | |
| buildActionMask | 數(shù)字 | 2^32-1 | |
| files | 列表 | 元素引用的列表 | 對(duì)應(yīng) PBXBuildFile 類型 |
| runOnlyForDeploymentPostprocessing | 數(shù)字 | 0 | ? |
例子:
4D05CA2C119304BD00125045 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
PBXGroup
用于打組文件,或者嵌套組。
| 屬性 | 類型 | 值 | 注釋 |
|---|---|---|---|
| reference | UUID | 96bit的表示碼 | |
| isa | PBXGroup | 空 | |
| children | 列表 | 元素引用的列表 | 對(duì)應(yīng) PBXFileElement 元素類型 |
| name | 字符串 | The filename. | |
| sourceTree | 字符串 | 參考 PBXSourceTree | ? |
例子:
4DA521A2115A003E007C19C3 /* scripts */ = {
isa = PBXGroup;
children = (
4D22DBAF116742DE007AF714 /* fix_references.sh */,
4DA521A1115A0032007C19C3 /* generate_descriptors.sh */,
);
name = scripts;
sourceTree = "";
};
PBXHeadersBuildPhase
用于framewrok構(gòu)建的鏈接階段。
| 屬性 | 類型 | 值 | 注釋 |
|---|---|---|---|
| reference | UUID | 96bit的表示碼 | |
| isa | PBXHeadersBuildPhase | 空 | |
| buildActionMask | 數(shù)字 | 2^32-1 | |
| files | 列表 | 元素引用的列表 | 對(duì)應(yīng) PBXBuildFile 元素類型 |
| runOnlyForDeploymentPostprocessing | 數(shù)字 | 0 | ? |
例子:
87293EBC1153C114007AFD45 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
PBXLegacyTarget
MISSING
PBXNativeTarget
對(duì)應(yīng)生成可執(zhí)行的二進(jìn)制程序或庫(kù)文件的本地構(gòu)建目標(biāo)對(duì)象。
| 屬性 | 類型 | 值 | 注釋 |
|---|---|---|---|
| reference | UUID | 96bit的表示碼 | |
| isa | PBXNativeTarget | 空 | |
| buildConfigurationList | 引用 | 元素引用 | 對(duì)應(yīng) XCConfigurationList 類型 |
| buildPhases | 列表 | 元素引用的列表 | 對(duì)應(yīng) PBXBuildPhase 元素類型 |
| dependencies | 列表 | 元素引用的列表 | 對(duì)應(yīng) PBXTargetDependency 元素類型 |
| name | 字符串 | 目標(biāo)的名字 | |
| productInstallPath | 字符串 | 產(chǎn)品的安裝路徑 | |
| productName | 字符串 | 產(chǎn)品的名字 | |
| productReference | 引用 | 元素的引用 | 對(duì)應(yīng) 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
工程,對(duì)應(yīng)構(gòu)建可執(zhí)行的二進(jìn)制目標(biāo)程序或庫(kù)。
| 屬性 | 類型 | 值 | 注釋 | |
|---|---|---|---|---|
| reference | UUID | 96bit的表示碼 | ||
| isa | PBXProject | 空 | ||
| buildConfigurationList | 引用 | 元素的引用 | 對(duì)應(yīng) XCConfigurationList 類型 | |
| compatibilityVersion | 字符串 | XcodeCompatibilityVersion 對(duì)應(yīng)的字符串表示 | ||
| developmentRegion | 字符串 | 開(kāi)發(fā)者所在區(qū)域 | ||
| hasScannedForEncodings | 數(shù)字 | 0 or 1 | 是否已經(jīng)掃描了文件編碼信息 | |
| knownRegions | 列表 | 字符串列表 | 不同區(qū)域的本地資源文件列表 | |
| mainGroup | 引用 | 元素的引用 | 對(duì)應(yīng) PBXGroup 類型 | |
| productRefGroup | 引用 | 元素的引用 | 對(duì)應(yīng) PBXGroup 類型 | |
| projectDirPath | 字符串 | 相對(duì)工程的相對(duì)路徑 | ||
| projectReferences | 字典列表 | 列表中的每個(gè)字典元素包含 ProductGroup和ProjectRef兩個(gè)成員 | ||
| projectRoot | 字符串 | 根目錄路徑(相對(duì)路徑) | ||
| targets | 列表 | 元素引用的列表 | 對(duì)應(yīng) 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
構(gòu)建階段需要復(fù)制的資源文件。
| 屬性 | 類型 | 值 | 注釋 |
|---|---|---|---|
| reference | UUID | 96bit的表示碼 | |
| isa | PBXResourcesBuildPhase | 空 | |
| buildActionMask | 數(shù)字 | 2^32-1 | |
| files | 列表 | 元素引用的列表 | 對(duì)應(yīng) PBXBuildFile 元素類型 |
| runOnlyForDeploymentPostprocessing | 數(shù)字 | 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
用于構(gòu)建階段復(fù)制資源文件的shell腳本。
| 屬性 | 類型 | 值 | 注釋 |
|---|---|---|---|
| reference | UUID | 96bit的表示碼 | |
| isa | PBXShellScriptBuildPhase | 空 | |
| buildActionMask | 數(shù)字 | 2^32-1 | |
| files | 列表 | 元素引用的列表 | 對(duì)應(yīng) PBXBuildFile 類型 |
| inputPaths | 列表 | 字符串列表 | 輸入的路徑列表 |
| outputPaths | 列表 | 字符串列表 | 輸出的路徑列表 |
| runOnlyForDeploymentPostprocessing | 數(shù)字 | 0 | |
| shellPath | 字符串 | shell解釋器程序的路徑 | |
| shellScript | 字符串 | shell腳本程序的內(nèi)容 | ? |
例子:
4D22DBAE11674009007AF714 /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "./fix_references.sh";
};
PBXSourcesBuildPhase
構(gòu)建階段中編譯源文件。
| 屬性 | 類型 | 值 | 注釋 |
|---|---|---|---|
| reference | UUID | 96bit的表示碼 | |
| isa | PBXSourcesBuildPhase | 空 | |
| buildActionMask | 數(shù)字 | 2^32-1 | |
| files | 列表 | 元素引用的列表 | 對(duì)應(yīng) PBXBuildFile 類型 |
| runOnlyForDeploymentPostprocessing | 數(shù)字 | 0 | ? |
例子:
4DF8B22D1171CFBF0081C1DD /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
4DF8B23E1171D0310081C1DD /* test.mm in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
PBXTarget
抽象對(duì)象,對(duì)應(yīng)具體化的構(gòu)建目標(biāo)。
PBXTargetDependency
目標(biāo)的外部依賴管理。
| 屬性 | 類型 | 值 | 注釋 |
|---|---|---|---|
| reference | UUID | 96bit的表示碼 | |
| isa | PBXTargetDependency | 空 | |
| target | 引用 | 元素引用 | 對(duì)應(yīng) PBXNativeTarget 類型 |
| targetProxy | 引用 | 元素引用 | 對(duì)應(yīng) PBXContainerItemProxy 類型 |
例子:
4D22DC0D1167C992007AF714 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 87293EBF1153C114007AFD45 /* libXXX */;
targetProxy = 4D22DC0C1167C992007AF714 /* PBXContainerItemProxy */;
};
PBXVariantGroup
對(duì)不同地區(qū)資源文件的引用管理。
| 屬性 | 類型 | 值 | 注釋 |
|---|---|---|---|
| reference | UUID | 96bit的表示碼 | |
| isa | PBXVariantGroup | 空 | |
| children | 列表 | 元素引用的列表 | 對(duì)應(yīng) PBXFileElement 類型 |
| name | 字符串 | 文件名 | |
| sourceTree | 字符串 | 參考 PBXSourceTree | ? |
例子:
870C88031338A77600A69309 /* MainMenu.xib */ = {
isa = PBXVariantGroup;
children = (
870C88041338A77600A69309 /* en */,
);
name = MainMenu.xib;
sourceTree = "";
};
XCBuildConfiguration
構(gòu)建配置元素。
| 屬性 | 類型 | 值 | 注釋 |
|---|---|---|---|
| reference | UUID | 96bit的表示碼 | |
| isa | XCBuildConfiguration | 空 | |
| baseConfigurationReference | 字符串 | xcconfig文件的路徑 | |
| buildSettings | 字典 | 構(gòu)建配置信息的字典 | |
| name | 字符串 | 配置名 | ? |
例子:
870C88151338ABB600A69309 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
};
870C88161338ABB600A69309 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
};
XCConfigurationList
構(gòu)建配置相關(guān)元素的列表。
| 屬性 | 類型 | 值 | 注釋 |
|---|---|---|---|
| reference | UUID | 96bit的表示碼 | |
| isa | XCConfigurationList | 空 | |
| buildConfigurations | 列表 | 引用對(duì)象的列表 | 每個(gè)引用對(duì)象對(duì)應(yīng)一個(gè) XCBuildConfiguration 元素 |
| defaultConfigurationIsVisible | 數(shù)字 | 0 | |
| defaultConfigurationName | 字符串 | 配置文件的默認(rèn)名稱 | ? |
例子:
870C87E41338A77600A69309 /* Build configuration list for PBXProject "CocoaApp" */ = {
isa = XCConfigurationList;
buildConfigurations = (
870C88061338A77600A69309 /* Debug */,
870C88071338A77600A69309 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};