轉自:盧克進的博客
tbd 是text-based stub libraries的意思, 是蘋果在Xcode7中使用的一個技術,便於減少Xcode7中SDK的體積。
下面講解下Xcode7如何通過tbd這個技術減少SDK的大小的。 Xcode7中和各個平台相關的sdk都在/Applications/Xcode.app/Contents/Developer/Platforms 這個目錄下,你可以看到如下的一些平台:
這裡列出了平台的名字 以及對應的動態鏈接庫所需要的架構
MacOSX (i386,x86_64)
iPhoneOS (armv7, armv7s, arm64)
iPhoneSimulator (i386,x86_64)
AppleTVOS (arm64)
AppleTVSimulator (x86_64)
WatchOS (armv7k)
WatchSimulator (i386)
每個平台的SDK都在對應的Developer/SDKs/的子目錄下,比如iPhoneOS的sdk在/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk下, 每一個SDK目錄下都會包含相應的動態Framework以及dylib庫,分別在SDK目錄下的System/Library/Frameworks和/usr/lib目錄下。
在使用tbd之前不管是哪個平台,Framework以及各個單獨的dylib庫的二進制都得放進來,數量多,體積大。但是真正有必要的其實只是各個模擬器要用的動態庫,因為MacOSX的庫系統自帶,那些諸如iPhoneOS,AppleTVOS,WatchOS這些設備要用的動態庫,也只是在設備上真正運行的時候才需要,編譯的時候只需要一些簡單的信息,符號表啥的,編譯通過就好了,真正到設備上去跑的時候才真正需要整個動態庫的二進制文件。
所以為了節省Xcode的體積,蘋果創造了一種tbd文件,用作替代那些設備SDK下的動態庫,這裡我們以/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CFNetwork.framework這個動態Framework庫為例,進入到CFNetwork.framework目錄下你會看到一個CFNetwork.tbd文件,cat下
--- archs: [ armv7, armv7s, arm64 ] platform: ios install-name: /System/Library/Frameworks/CFNetwork.framework/CFNetwork current-version: 758.3.15 exports: - archs: [ armv7, armv7s, arm64 ] symbols: [ '$ld$hide$os4.3$_NSHTTPCookieComment', '$ld$hide$os4.3$_NSHTTPCookieCommentURL', '$ld$hide$os4.3$_NSHTTPCookieDiscard', '$ld$hide$os4.3$_NSHTTPCookieDomain', '$ld$hide$os4.3$_NSHTTPCookieExpires', '$ld$hide$os4.3$_NSHTTPCookieLocationHeader', '$ld$hide$os4.3$_NSHTTPCookieManagerAcceptPolicyChangedNotification', '$ld$hide$os4.3$_NSHTTPCookieManagerCookiesChangedNotification', '$ld$hide$os4.3$_NSHTTPCookieMaximumAge', '$ld$hide$os4.3$_NSHTTPCookieName', '$ld$hide$os4.3$_NSHTTPCookieOriginURL', '$ld$hide$os4.3$_NSHTTPCookiePath', '$ld$hide$os4.3$_NSHTTPCookiePort', '$ld$hide$os4.3$_NSHTTPCookieSecure', '$ld$hide$os4.3$_NSHTTPCookieValue', '$ld$hide$os4.3$_NSHTTPCookieVersion', '$ld$hide$os4.3$_NSNetServicesErrorCode', '$ld$hide$os4.3$_NSNetServicesErrorDomain', .......
你會發現其實tbd文件就是一個文本文件,其中包含架構信息,以及在真實運行時候二進制所在的位置,以及包含了動態庫的符號表還有類的一些信息,這些信息在編譯階段足夠了。通過這種技術,可以大大減少所有的設備SDK的二進制動態庫的體積,其中包含MacOSX,iPhoneOS,AppleTVOS,WatchOS。
模擬器SDK的動態庫依然是原始的動態庫二進制文件,這點你可以進到/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/Frameworks/CFNetwork.framework目錄下進行驗證。