主頁 > 移動端開發 > Xcode 工程分析

Xcode 工程分析

2023-02-25 08:13:28 移動端開發

1. 背景

Xcode作為日常開發iOS程式的IDE,支持C、C++、Objective-C、Swift、Ruby等語言進行撰寫,日常開發入口就是Xcode workspace或者Xcode project,

workspace是一個Xcode檔案,它將專案和其他檔案、project分組,一個workspace可以包含任意數量的Xcode project,以及資源檔案(JSON、腳本、圖片、視頻等),workspace除了組織每個project中的檔案外,還提供了所包含專案及其目標之間的隱式和顯式關系,

project就是一個 Xcode 工程,它是實際管理工程下 targets 、原始碼、資源檔案、framework 等,project 只是一個容器,本身是無法被編譯的,所以每個 project 至少應該有一個可編譯的 target, target下需要包含可編譯的原始碼,

在日常開發中難免會去在非Xcode的環境下去操作workspace或者project中的依賴關系,所以搞懂workspace、project、原始碼和資源檔案之間的關系就顯得特別重要,因為知道怎么來的才知道去如何做,

 

2. 了解workspace全貌

圖片

由上圖可以簡單看出workspace和project的關系:

  • 一個workspace里可以包含多個project

  • 一個project里包含多個target

  • configuration 即Xcode中的Debug/Release 等工程配置

  • scheme 配置target編譯引數

  • 每個target即每次編譯生成對應產物:app或者framework

     

3. 探尋workspace

新創建一個空的workspace,直接看他的層級樹:

圖片

可以看到workspace主要包含三個層級:

  • xcworkspacedata,workspace的組態檔,實際上就是一個XML檔案,

  • xcshareddata:可共享的配置,包含scheme、script等資訊,

  • xcuserdata:當前用的配置,包含本地scheme、script、斷點資訊等,

 

以報價專案為例詳細查看 contents.xcworkspacedata的內容:

圖片

FileRef 顧名思義它是標記了每個檔案在workspace中的路徑關系,這個關系決定的在Xcode中的project的展示層級,

location的關鍵字包含如下:

  • self:當前檔案夾下的同名project

  • group:指定目錄下的xcodeproj檔案

  • container:workspace當前目錄下的不同名的xcodeproj檔案

  • absolute:絕對路徑下的檔案

 

4. 探尋project

由對workspace的探尋我們可以看到,workspace確實只是把project等檔案組織起來的一個作業空間,本身并不具備對原始碼、資源的編譯、整合能力,進一步探尋到project檔案,我們才能看到原始碼、資源檔案等是怎么被整合起來的,

圖片

由上圖可看到,xcodeproj里包含了三個大的層級,xcuserdata里包含的常用的scheme和組態檔,還包含了一個xcodeworkspace,這是為了保證Xcode的兼容性,維持Xcode管理檔案邏輯的統一,

xcodeproj中包含了開發中所需要的全部檔案,管理了當前工程所有的原始碼、資源檔案、組態檔等,重點是pbxproj檔案,它與我們正常編譯代碼密切相關,管理target、檔案之間的參考依賴關系、合并代碼時候產生的檔案沖突就在這里,

 

4.1

深入pbxproj

pbxproj全拼是Project Builder Xcode Project,它其實是我們熟悉的plist檔案的一種,但是它不像我們常用的plist檔案有著優越的可讀性,由于歷史原因它才被Xcode一直保存下來,

pbxproj中定義了target、script、檔案、configuration等之間的參考關系,我們看到的Xcode專案布局實際上是可視化了pbxproj,

直接看看pbxproj的內部布局吧:

圖片

可以看到,最外層包含了這些屬性:

  • archiveVersion 當前檔案版本

  • classes 占位符

  • objectVersion 當前檔案需要的 Xcode最低版本

  • objects 以每個object的uuid為key的字典,存放了object屬性

  • rootObject 當前檔案的根object (isa = PBXProject)

 

objects里實際上存放的就是每個檔案之間的依賴關系,我們稱每個檔案是一個Xcode object,這個Xcode object不僅僅可以是原始碼檔案,也可以是group、framework、app、target、scheme等,

由上圖的rootObject = D9658FA7290BA51D00A72187,我們簡單看一下它作為Xcode object的內部結構:

圖片

可以看到比較重要的資訊是isa、mainGroup、configration、target,其他資訊也都包含了Xcode中我們見到的、可以配置的全部資訊,

這只是PBXProject中的資訊,全部資訊可在官網進行查詢,下面列出了所有的型別配置:

  • PBXProject:Project 配置,編譯工程所需資訊

  • PBXNativeTarget:Target 的配置

  • PBXTargetDependency:Target 依賴關系配置

  • PBXContainerItemProxy:部署的元素

  • XCConfigurationList:Xcode中configuration配置

  • XCBuildConfiguration:Xcode 的 Build Settings 配置

  • PBXVariantGroup:storyboard 檔案配置

  • PBXBuildFile:各類檔案配置

  • PBXFileReference:各類檔案參考配置

  • PBXGroup:Xcode中的group

  • PBXSourcesBuildPhase:需要編譯的編譯源檔案

  • PBXFrameworksBuildPhase:需要編譯的framework

  • PBXResourcesBuildPhase:除原始碼外的資源檔案

 

他們之間的關系大致如下

圖片

了解了各個檔案之間的關系,可以為我們以后通過腳本去動態添加、洗掉、移動檔案、修改build settings、scheme等操作打下基礎,

 

5. 探尋scheme

scheme不是編譯target的必要條件,沒有scheme不影響Xcode的編譯操作,但是,沒有scheme我們就沒辦法在編譯時傳入引數條件,插入編譯腳本,配置個性化編譯配置,所以scheme是Xcode編譯時的必須選項,

打開一個scheme源檔案,我們可以看到如下布局:

圖片

可以看到,最外層包含著build、test、launch、profile、analyze、archive,恰好對應了Xcode中的與之對應的命令,再次驗證了Xcode就是pbxproj的可視化呈現,

進入BuildAction可以看到我們在Xcode中添加的預編譯腳本和各種環境變數配置,這些配置有的是在編譯程序中必不可少的引數,有的是方便我們管理編譯產物的必須配置,靈活運用這些配置,可以讓Xcode更好的為我們服務,

 

6. 探尋target

target用于指定要構建的產物,即framework或者app,target只包含了當前project中的部分指定的代碼和資源檔案,每一個target只能構建出一個特定的構建產物,為了豐富構建產物,一個project可以擁有多個target,

target使用Build Settings和Build Phases的形式來進行個性化配置,默認這些配置可以通過project繼承,也可以通過手動或者組態檔的方式覆寫其他配置,

target之間可以互相依賴,如果是在同個workspace下,Xcode默認會觸發隱式依賴,當然,如果用手動配置依賴關系,則會變為顯式依賴,顯式依賴的優先級高于隱式依賴,

 

7. 總結與展望

根據上面的介紹,大家一定對Xcode的工程配置有了一定的了解,在了解了這些之后,我們能做些什么呢?其實是有很多玩法的:

  • 根據不同的編譯scheme編譯指令,提取出編譯產物,分發給不同的人員,

  • 根據target的不同,在不改變原始碼的前提下,每次編譯設定不同的環境測驗包,

  • 編譯程序中檢查出警告資訊及時上報開發人員,

  • 編譯時找出無效代碼及檔案,

  • 利用cocoapods的動態配置在安裝的時候直接引入二進制組件以增加編譯速度,

  • 輸出指定framework的編譯日志到檔案方便對比查閱,

 

了解了這些基礎配置,以后在專案的工程化方面才有更多手段解決重復度高或者棘手的問題,還有更多的新玩法可以在作業程序中發掘,

 

作者|王一飛

本文來自博客園,作者:古道輕風,轉載請注明原文鏈接:https://www.cnblogs.com/88223100/p/Xcode-Engineering-Analysis.html

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/545018.html

標籤:其他

上一篇:Xcode 工程分析

下一篇:安卓ro.serialno產生的整個流程

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more