5 Oct 2015@orta@mrackwitz
WHAT IS COCOAPODS?
A dependency manager A community around mostly open source code 5 years old
5 Oct 2015@orta@mrackwitz
WHAT ARE STATIC LIBRARIES?
”A static library (aka static archive) is a collection of .o files with a table of contents that lists the global symbols in the .o files.ld will only pull .o files out of a static library if needed to resolve some symbol reference.
man page of ld
5 Oct 2015@orta@mrackwitz
WHAT ARE STATIC LIBRARIES?
”A static library (aka static archive) is a collection of .o files with a table of contents that lists the global symbols in the .o files.ld will only pull .o files out of a static library if needed to resolve some symbol reference.
man page of ld
5 Oct 2015@orta@mrackwitz
ar archive
BUILDING A STATIC LIBRARY
Source Code clang
lipo fat binary
ar archiveranlib
o-fileso-file
o-fileso-file
table of contents
5 Oct 2015@orta@mrackwitz
INSIDE LD123 456789
10
#BananaKit.h@import monkey;
@interface BKBananaTree@property (copy) NSArray *fruits;@end@interface BKBananaFruit@property (weak) MKMonkey *peeledByMonkey;- (void)peel:(MKMonkey *)m; @end
123 456789
#monkey.htypedef NS_ENUM(NSUInteger, MKSize) { MKSizeSmall, MKSizeBig}
@interface MKMonkey@property (nonatomic, assign) MKSize size;- (id)init(MKSize)size;@end
123 456 7 8 9
#main.m@import monkey;@import BananaKit;void main() { id m = [[MKMonkey alloc] init:MKMonkeySmall]; id t = [BKBananaTree new]; t.fruits.first.peel(m); }
5 Oct 2015@orta@mrackwitz
COCOA TOUCH FRAMEWORKSBinaryDynamic linkable binary Modules DeclarationClang Module Map, Swift Module declarations HeadersStripped in app ResourcesPrepared like in the app Info.plistMeta-data like version, copyright etc. DependenciesCan contain further frameworks and dylibs
}Necessary forimport & linking
5 Oct 2015@orta@mrackwitz
WHAT ARE DYNAMIC LIBRARIES?
”A dynamic library (aka dylib or framework) is a final linked image. Putting a dynamic library on the command line causes two things: 1) The generated final linked image will have encoded that it depends on that dynamic library.2) Exported symbols from the dynamic library are used to resolve references.
the man page of ld
5 Oct 2015@orta@mrackwitz
WHAT ARE DYNAMIC LIBRARIES?
”A dynamic library (aka dylib or framework) is a final linked image. Putting a dynamic library on the command line causes two things: 1) The generated final linked image will have encoded that it depends on that dynamic library.2) Exported symbols from the dynamic library are used to resolve references.
the man page of ld
5 Oct 2015@orta@mrackwitz
libtool
-dynamic
MachO
BUILDING A DYNAMIC LIBRARY
Source Code clang
lipo fat binary
MachOldld
o-fileso-file
5 Oct 2015@orta@mrackwitz
INSIDE LD
123 456
#main.swiftimport monkeyimport BananaKit
let m = MKMonkey(.Small)let t = BKBananaTree()t.fruits.first.peel(m)
123 456789
101112
#BananaKit.swiftimport monkey
public class BKBananaTree { var fruits: [BKBananaFruit]
public struct BKBananaFruit { var peeledByMonkey: MKMonkey? public func peel(m: MKMonkey) { peeledByMonkey = m } }}
123 456789
10
#monkey.swiftpublic enum MKSize { case Small case Big}public class MKMonkey { public let size: MKSize public init(_ size: MKSize) { self.size = size }}
5 Oct 2015@orta@mrackwitz
INSIDE LD
123 456
#main.swiftimport monkeyimport BananaKit
let m = MKMonkey(.Small)let t = BKBananaTree()t.fruits.first.peel(m)
MKMonkey
MKSize.Small
BKBananaTree
123 456789
101112
#BananaKit.swiftimport monkey
public class BKBananaTree { var fruits: [BKBananaFruit]
public struct BKBananaFruit { var peeledByMonkey: MKMonkey? public func peel(m: MKMonkey) { peeledByMonkey = m } }}
BKBananaTree
123 456789
10
#monkey.swiftpublic enum MKSize { case Small case Big}public class MKMonkey { public let size: MKSize public init(_ size: MKSize) { self.size = size }}
BKBananaTree.peel
MKMonkey
MKSize
MKMonkey.init
MKSize.Big
MKMonkey
MKMonkey.size
MKSize.Small
BKBananaTree.peel
Array
Array.first
5 Oct 2015@orta@mrackwitz
DYNAMIC FRAMEWORKS NEED TO BE EMBEDDED
CocoaPods allows different sets of dependencies per build configuration.pod 'Lookback', :configurations => ['Debug']
5 Oct 2015@orta@mrackwitz
WHAT HAPPENS ON COPY
Header StrippingHeaders are only needed to integrate the library for the compiler and shouldn’t be shipped
Code SigningFrameworks are all signed individually and excluded from the whole app bundle signature
5 Oct 2015@orta@mrackwitz
FRAMEWORKS IN COMPARISON TO STATIC LIBS
Advantages Easier to distribute & integrate if compiled Reduces file size if used for app & extensions Separate resources in distinct bundles
Disadvantages Optimization is limited to LTO Limits dead-code stripping Increases load times
5 Oct 2015@orta@mrackwitz
WHAT MEANS THAT FOR COCOAPODS
We need to support Clang Modules, too.
DSL-extensions for Podfile and Podspec
Bundle Resources into Frameworks 🔥
Workaround issues with swift-stdlib-tool
Code Signing
5 Oct 2015@orta@mrackwitz
TRANSITIONING FROM STATIC LIBRARIES TO FRAMEWORKS
gem install cocoapods-deintegratepod deintegrate
5 Oct 2015@orta@mrackwitz
TRANSITIONING FROM STATIC LIBRARIES TO FRAMEWORKS
Deletes Pods/. Removes the CocoaPods Xcode group. Removes these three build phases:
Copy Pods Resources Check Pods Manifest.lock Embed Pods Frameworks
5 Oct 2015@orta@mrackwitz
TRANSITIONING FROM STATIC LIBRARIES TO FRAMEWORKS
Add use_frameworks! to Podfile. Run pod install. Run tests.
5 Oct 2015@orta@mrackwitz
COMMON ISSUES
Pods depending on static libraries Libraries expecting resources in the main bundle UIFont pods Pods that change behaviour using #defines
1st App With CocoaPods Frameworks
github.com/artsy/eidolon/pull/317
App Launch Time Increased
github.com/artsy/eigen/issues/586
3rd Party Frameworks have O(N^2) lookup time
Could be in library launching
Could be in library code sign verification
Looking like solution is on app deployment to bundle all framework symbols into one
App Launch Time Increased
github.com/artsy/eigen/issues/586
5 Oct 2015@orta@mrackwitz
Come help out@mrackwitz / @orta / @CocoaPods
cocoapods.org/get-started