Xcode工程文件的格式說(shuō)明

簡(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的支持的討論(還有其它一些文章),或許可以提供一些信息:

元素

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

  • 根節(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;
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,502評(píng)論 19 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,716評(píng)論 25 709
  • 我有幸看到了作家李森祥《臺(tái)階》這篇文章。文中父親為了實(shí)現(xiàn)建一座有高臺(tái)階的新屋的夢(mèng),他撿磚、撿瓦、撿石頭、存角票種...
    雛鷹閱讀 466評(píng)論 0 0
  • 昨天睡的太晚,剛起來(lái)就收到同學(xué)的微信,還想看我再寫點(diǎn),讓我的冷汗瞬間就濕遍啦全身,親愛(ài)的你!難道真的不知道我...
    周木木_9dfd閱讀 417評(píng)論 0 0

友情鏈接更多精彩內(nèi)容