presentation slide cocoapods frameworks divider...

43
Presentation slide divider title @mrackwitz & @orta CocoaPods Frameworks

Upload: lamnhan

Post on 11-May-2018

217 views

Category:

Documents


1 download

TRANSCRIPT

Presentation slide divider title@mrackwitz & @orta

CocoaPods Frameworks

5 Oct 2015@orta@mrackwitz

Marius Rackwitz & Orta Therox

CocoaPods Frameworks

What is CocoaPods?

5 Oct 2015@orta@mrackwitz

WHAT IS COCOAPODS?

A dependency manager A community around mostly open source code 5 years old

TERMINOLOGY

WORKSPACE

TARGETS

BUILD PHASE

Integration History

Static LibrariesCOMMON DENOMINATOR UNTIL IOS 7.0

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); }

COCOAPODS HAS TO BUNDLE RESOURCES

Dynamic FrameworksREQUIRED FOR SWIFT

5 Oct 2015@orta@mrackwitz

INSIDE A FRAMEWORK

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

5 Oct 2015@orta@mrackwitz

DYNAMIC FRAMEWORKS NEED TO BE EMBEDDED

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

Transitioning

5 Oct 2015@orta@mrackwitz

TRANSITIONING FROM STATIC LIBRARIES TO FRAMEWORKS

gem install cocoapods-deintegratepod deintegrate

TRANSITIONING FROM STATIC LIBRARIES TO FRAMEWORKS

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

Simple Transition, old app

github.com/artsy/energy/pull/50

Large codebase, ~60 pods

github.com/artsy/eigen/pull/520

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

Presentation slide divider title

5 Oct 2015@orta@mrackwitz

Come help out@mrackwitz / @orta / @CocoaPods

cocoapods.org/get-started