Slide 1

Slide 1 text

©2019 Wantedly, Inc. App startup time with Dynamic/Static frameworks try! Swift Pre Talk 2019 Mar 19, 2019 - @ShotaKashihara

Slide 2

Slide 2 text

©2019 Wantedly, Inc. Shota Kashihara ɾWantedly People ɾiOS
 ɾSwift/Double base ɾTwitter: @oakland76 ɾGitHub: @ShotaKashihara

Slide 3

Slide 3 text

©2019 Wantedly, Inc. ɾXcode ͱ Frameworks ͷྺ࢙ ɾΞϓϦͷىಈͱ Frameworks ͷؔ܎ ɾFrameworks ͷߏ੒Λߟ͑Δ ࠓ೔࿩͢͜ͱ

Slide 4

Slide 4 text

©2019 Wantedly, Inc. Xcode ͱ Frameworks ͷྺ࢙

Slide 5

Slide 5 text

©2019 Wantedly, Inc. Xcode ͱ Frameworks ͷྺ࢙ Dynamic/Static Framework Λ ͓͞Β͍

Slide 6

Slide 6 text

©2019 Wantedly, Inc. Xcode ͱ Frameworks ͷྺ࢙ Xcode 5 #2013೥ ɹɾOnly Static Library (Obj-C) Dynamic/Static Framework Λ ͓͞Β͍

Slide 7

Slide 7 text

©2019 Wantedly, Inc. Xcode ͱ Frameworks ͷྺ࢙ Xcode 5 #2013೥ ɹɾOnly Static Library (Obj-C) Xcode 6 #2014೥ ɹɾSupport embedded frameworks (Dynamic Library) Dynamic/Static Framework Λ ͓͞Β͍

Slide 8

Slide 8 text

©2019 Wantedly, Inc. Xcode ͱ Frameworks ͷྺ࢙ Xcode 5 #2013೥ ɹɾOnly Static Library (Obj-C) Xcode 6 #2014೥ ɹɾSupport embedded frameworks (Dynamic Library) Xcode 9 #2017೥ ɹɾSupport static library with Swift ɹɹɾCocoa Pods (v1.5.0), Carthage (v0.30.1) ʹͯ ରԠࡁ Dynamic/Static Framework Λ ͓͞Β͍

Slide 9

Slide 9 text

©2019 Wantedly, Inc. Dynamic/Static Framework

Slide 10

Slide 10 text

©2019 Wantedly, Inc. Framework ֦ுࢠ .framework ɾϥΠϒϥϦ ɾ(όϯυϧ) ɹɾNib ɹɾը૾ ɹɾϔομʔϑΝΠϧ ͳͲΛ·ͱΊͨϑΥϧμ Dynamic/Static Framework

Slide 11

Slide 11 text

©2019 Wantedly, Inc. Dynamic Framework .framework ɾಈతϥΠϒϥϦ (.dylib, or ֦ுࢠͳ͠) ɹΛؚΜͩ Framework Dynamic/Static Framework

Slide 12

Slide 12 text

©2019 Wantedly, Inc. Dynamic Framework .framework ɾಈతϥΠϒϥϦ (.dylib, or ֦ுࢠͳ͠) ɹΛؚΜͩ Framework ɾArchive ɹɾ/Frameworks/ ഑Լʹ ɹɹ.framework ͷ··ίϐʔ Dynamic/Static Framework

Slide 13

Slide 13 text

©2019 Wantedly, Inc. Static Framework .framework ɾ੩తϥΠϒϥϦ (.a, or ֦ுࢠͳ͠) ɹΛؚΜͩ Framework Dynamic/Static Framework

Slide 14

Slide 14 text

©2019 Wantedly, Inc. Static Framework .framework ɹ ɾArchive ɹɾ੩తϥΠϒϥϦ͸ίϯύΠϧ࣌ʹ੩తϦϯΧʹΑͬͯɺ ɹɹ࣮ߦՄೳϑΝΠϧʹؚ·ΕΔ(୯ҰͷϑΝΠϧʹͳΔ) ɹɾϦιʔεϑΝΠϧ͸ΞϓϦέʔγϣϯ഑Լʹίϐʔͯ͠ɺ ɹɹ࣮ߦՄೳϑΝΠϧ͔Βݟ͑Δঢ়ଶʹ͢Δඞཁ͋Γ Dynamic/Static Framework ← Static Library ͸ίϯύΠϧͰ ࣮ߦՄೳϑΝΠϧͷҰ෦ʹͳΔ ɾ੩తϥΠϒϥϦ (.a, or ֦ுࢠͳ͠) ɹΛؚΜͩ Framework

Slide 15

Slide 15 text

©2019 Wantedly, Inc. Dynamic Library ͷ 2ͭͷಛ௃ ɾDynamic Linking ɾDynamic Loading Dynamic/Static Framework

Slide 16

Slide 16 text

©2019 Wantedly, Inc. Dynamic Linking ɾΞϓϦ࣮ߦ࣌ʹϦϯΫ͕ߦΘΕΔ͜ͱ ɾ࣮ߦՄೳϑΝΠϧΛখ͘͞อͭ͜ͱ͕Ͱ͖Δ Dynamic/Static Framework

Slide 17

Slide 17 text

©2019 Wantedly, Inc. Dynamic Loading ɾ`dlopen()` ɾΞϓϦىಈ࣌Ͱ͸ͳ͘ɺඞཁͳͱ͖ʹϩʔυΛ࢝ΊΔ͜ͱ͕Ͱ͖Δ ɾiOS Ͱ͸࢖͍ͬͯΔ৔໘Λ͋·Γݟͨ͜ͱ͕ͳ͍ Dynamic/Static Framework

Slide 18

Slide 18 text

©2019 Wantedly, Inc. ΞϓϦͷىಈʹ͸Ͳ͏͍͏ϑϩʔ͕͋Δ͔

Slide 19

Slide 19 text

©2019 Wantedly, Inc. exec() to main()

Slide 20

Slide 20 text

©2019 Wantedly, Inc. exec() to main() ΞϓϦ্ཱ͕͕ͪΔ·ͰʹཪଆͰى͖͍ͯΔ͜ͱ ※ WWDC 2016 (Optimizing App Startup Time) ʹͯݴٴ͞ΕͨςʔϚ exec() to main()

Slide 21

Slide 21 text

©2019 Wantedly, Inc. exec() 1. Kernel maps your application into new address space 2. Kernel loads helper program 3. Dyld runs in-process exec() to main()

Slide 22

Slide 22 text

©2019 Wantedly, Inc. exec() 1. Kernel maps your application into new address space 2. Kernel loads helper program 3. Dyld runs in-process exec() to main()

Slide 23

Slide 23 text

©2019 Wantedly, Inc. exec() 1. Kernel maps your application into new address space 2. Kernel loads helper program 3. Dyld runs in-process exec() to main()

Slide 24

Slide 24 text

©2019 Wantedly, Inc. exec() 1. Kernel maps your application into new address space 2. Kernel loads helper program 3. Dyld runs in-process exec() to main()

Slide 25

Slide 25 text

©2019 Wantedly, Inc. exec() 1. Kernel maps your application into new address space 2. Kernel loads helper program 3. Dyld runs in-process Dyld: ࣮ߦ࣌ʹ dynamic library ΛಡΈࠐΉϓϩηεͷ͜ͱ exec() to main()

Slide 26

Slide 26 text

©2019 Wantedly, Inc. Dyld Steps 1. Map all dependent dylibs, recurse 2. Rebase all images 3. Bind all images 4. ObjC prepare images 5. Run initializers exec() to main()

Slide 27

Slide 27 text

©2019 Wantedly, Inc. Dyld Steps 1. Map all dependent dylibs, recurse 2. Rebase all images 3. Bind all images 4. ObjC prepare images 5. Run initializers exec() to main()

Slide 28

Slide 28 text

©2019 Wantedly, Inc. Dyld Steps 1. Map all dependent dylibs, recurse 2. Rebase all images 3. Bind all images 4. ObjC prepare images 5. Run initializers exec() to main()

Slide 29

Slide 29 text

©2019 Wantedly, Inc. Dyld Steps 1. Map all dependent dylibs, recurse 2. Rebase all images 3. Bind all images 4. ObjC prepare images 5. Run initializers exec() to main() ͜ΕΒ͕ Dynamic Framework ͷ਺͚ͩ࠶ؼ͢Δ

Slide 30

Slide 30 text

©2019 Wantedly, Inc. Dyld Steps ͜͜ʹͲΕ͘Β͍ͷ͕͔͔͍࣌ؒͬͯΔ͔ΛݟΔ exec() to main()

Slide 31

Slide 31 text

©2019 Wantedly, Inc. DYLD_PRINT_STATISTICS exec() to main()

Slide 32

Slide 32 text

©2019 Wantedly, Inc. DYLD_PRINT_STATISTICS exec() to main() ΞϓϦΛ্ཱͪ͛Δͱ main() ·Ͱʹ Dyld ʹ͔͔͕ͬͨ࣌ؒදࣔ

Slide 33

Slide 33 text

©2019 Wantedly, Inc. exec() to main() ɾΞϓϦͷىಈ࣌ʹ Dyld ͕࠶ؼతʹ Framework ΛϝϞϦʹ഑ஔ͢Δ ɾDynamic Framework ͷ਺͚ͩΦʔόʔϔου͕૿͑Δ ɹ exec() to main()

Slide 34

Slide 34 text

©2019 Wantedly, Inc. exec() to main() ɾΞϓϦͷىಈ࣌ʹ Dyld ͕࠶ؼతʹ Framework ΛϝϞϦʹ഑ஔ͢Δ ɾDynamic Framework ͷ਺͚ͩΦʔόʔϔου͕૿͑Δ ɹ ɹˠ ෳ਺ͷ Dynamic Frameworks Λ Static Library ͱͯ͠Ϗϧυͯ͠ɺ ɹɹ ͦΕΒΛ·ͱΊͨ Dynamic Frameworks Λ࡞Δ exec() to main()

Slide 35

Slide 35 text

©2019 Wantedly, Inc. ΞϓϦ ͷߏ੒ Domain.framework Main.app Watch.app C.framework B.framework (3rd party) A.framework

Slide 36

Slide 36 text

©2019 Wantedly, Inc. ΞϓϦ ͷߏ੒ Domain.framework Main.app Watch.app Umbrella frameworks C.framework B.framework (3rd party) A.framework

Slide 37

Slide 37 text

©2019 Wantedly, Inc. ΞϓϦ ͷߏ੒ Domain.framework Main.app Watch.app Umbrella frameworks C.framework B.framework (3rd party) A.framework Static linking

Slide 38

Slide 38 text

©2019 Wantedly, Inc. ·ͱΊ

Slide 39

Slide 39 text

©2019 Wantedly, Inc. Summary ɾDynamic frameworks ͕૿͑Δͱ Dyld ͷίετ͕͔͔Δ ɾΞϓϦͷىಈ଎౓͕ؾʹͳͬͨΒ DYLD_PRINT_STATISTICS ΦϓγϣϯͰ ɹDynamic Library ͷϩʔυʹ͔͔͍ͬͯΔ࣌ؒΛݟͯΈΑ͏ ɾDynamic frameworks Λ Static Frameworks ʹஔ͖׵͑ͯ ɹDyld ͷίετΛݮΒ͢͜ͱ΋બ୒ࢶͷҰͭ App startup time with Dynamic/Static frameworks

Slide 40

Slide 40 text

©2019 Wantedly, Inc. Have a nice try! Swift day