Slide 1

Slide 1 text

株式会社ZOZOテクノロジーズ
 ZOZOTOWN部
 元 政燮 Copyright © ZOZO Technologies, Inc. アプリの起動時間短縮にむけて 


Slide 2

Slide 2 text

© ZOZO Technologies, Inc. iOS開発は2011年から
 2019/7 ZOZOテクノロジーズに入社 
 EC業界歴4年半
 関わったサービス:SNS/動画アプリ、ECアプリ 
 韓国ソウル出身
 株式会社ZOZOテクノロジーズ
 EC開発本部
 ZOZOTOWN部 元 政燮(げんと呼ばれてます)


Slide 3

Slide 3 text

© ZOZO Technologies, Inc. ● アプリが最初の画面を表示するまで起きていること ● アプリの起動時間を改善する方法 (2020年9月時点) このLTで話す内容

Slide 4

Slide 4 text

© ZOZO Technologies, Inc. Before After Sampleアプリで改善してみた結果 Device: iPhone XS MAX / OS: iOS 13.3 / Linked Dynamic Framework Count: 21

Slide 5

Slide 5 text

© ZOZO Technologies, Inc. Metrics Organizer App Storeにリリースしたアプリの起動時間 (iOS 12.3以上の端末が対象) 同意したユーザーのみ 理想は400ミリ秒 - Apple様より

Slide 6

Slide 6 text

© ZOZO Technologies, Inc. App Launch (Instruments)

Slide 7

Slide 7 text

© ZOZO Technologies, Inc. コンソール確認 スキームに環境変数を追加する

Slide 8

Slide 8 text

© ZOZO Technologies, Inc. コンソール確認 環境変数を設定した後の計測値の例

Slide 9

Slide 9 text

© ZOZO Technologies, Inc. 起動タイプによる特徴 Cold Launch Warm Launch Resume タイミング ● OS起動後、アプリを起動したこ とがない時 ● アプリを使ってない状態で時間 がたった時 アプリを終了してからあまり時間が経って ない時 他のアプリから切り替えたとき キャッシュ アプリのデータはロードされていない 一部のデータが残っている アプリの全てのデータが残っている 起動までの時間 遅い 早い 非常に早い 再現方法 ● 端末を再起動してから 2~3分放 置する ● iCloudはログアウトしておく ● ネットワークを切るか機内モード にする 起動中のアプリを終了してから起動する アプリをsuspend状態にしてから戻る

Slide 10

Slide 10 text

© ZOZO Technologies, Inc. Cold Launch タイミング ● OS起動後、アプリを起動したことがない時 ● アプリを使ってない状態で時間がたった時 キャッシュ アプリのデータはロードされていない 起動までの時間 遅い 再現方法 ● 端末を再起動してから2~3分放置する ● iCloudはログアウトしておく ● ネットワークを切るか機内モードにする

Slide 11

Slide 11 text

© ZOZO Technologies, Inc. Warm Launch タイミング アプリを終了してからあまり時間が経ってない時 キャッシュ 一部のデータが残っている 起動までの時間 早い 再現方法 起動中のアプリを終了してから起動する

Slide 12

Slide 12 text

© ZOZO Technologies, Inc. Resume タイミング 他のアプリから切り替えたとき キャッシュ アプリの全てのデータが残っている 起動までの時間 非常に早い 再現方法 アプリをsuspend状態にしてから戻る

Slide 13

Slide 13 text

© ZOZO Technologies, Inc. 起動処理の詳細と改善方法

Slide 14

Slide 14 text

© ZOZO Technologies, Inc. System Interface Initialization System Interface Initialization Static Runtime Initialization UIKit Initialization didFinishLaunching WithOptions First Rendering Extended ? ここでは 省略します

Slide 15

Slide 15 text

© ZOZO Technologies, Inc. やっていること アプリのプロセスを開始する OSがアプリ起動に必要なデータをメモリーにロード dyldによるDynamic Library / Framework ロード System Interface Initialization System Interface Initialization Static Runtime Initialization UIKit Initialization didFinishLaunching WithOptions First Rendering

Slide 16

Slide 16 text

© ZOZO Technologies, Inc. やっていること アプリのプロセスを開始する OSがアプリ起動に必要なデータをメモリーにロード dyldによるDynamic Library / Framework ロード System Interface Initialization 動的リンクされたライブラリーや フレームワークは起動時に依存関係 検索 & ロードが行われる System Interface Initialization Static Runtime Initialization UIKit Initialization didFinishLaunching WithOptions First Rendering

Slide 17

Slide 17 text

© ZOZO Technologies, Inc. 改善方法 Dynamic Linkを減らす ● 不要なLibrary, Frameworkはリンクしない System Interface Initialization System Interface Initialization Static Runtime Initialization UIKit Initialization didFinishLaunching WithOptions First Rendering

Slide 18

Slide 18 text

© ZOZO Technologies, Inc. 改善方法 Dynamic Linkを減らす ● 不要なLibrary, Frameworkはリンクしない ● 可能ならDynamic Frameworkを Static Frameworkにする System Interface Initialization System Interface Initialization Static Runtime Initialization UIKit Initialization didFinishLaunching WithOptions First Rendering

Slide 19

Slide 19 text

© ZOZO Technologies, Inc. Carthage Build static frameworks to speed up your app’s launch times(Carthage) https://github.com/Carthage/Carthage/blob/master/Documentation/StaticFrameworks.md XCConfigを使う! Dynamic FrameworkをStatic FrameworkにCompileする

Slide 20

Slide 20 text

© ZOZO Technologies, Inc. CocoaPods CocoaPods1.9 beta https://blog.cocoapods.org/CocoaPods-1.9.0-beta/ RFC https://github.com/CocoaPods/CocoaPods/issues/9099 CocoaPods 1.9から使える! Dynamic FrameworkをStatic FrameworkにCompileする リンクタイプを Static優先にする

Slide 21

Slide 21 text

© ZOZO Technologies, Inc. Swift Package Manager Dynamic FrameworkをStatic FrameworkにCompileする Swift PMのデフォルトリンクタイプは Static

Slide 22

Slide 22 text

© ZOZO Technologies, Inc. 改善方法 Dynamic Linkを減らす ● 不要なLibrary, Frameworkはリンクしない ● 可能ならDynamic Frameworkを Static Frameworkにする ● 複数のFrameworkをマージする System Interface Initialization System Interface Initialization Static Runtime Initialization UIKit Initialization didFinishLaunching WithOptions First Rendering サンプルコードは 後日公開予定です

Slide 23

Slide 23 text

© ZOZO Technologies, Inc. やっていること Swift / Objective-Cのランタイム初期化 Rebase & Binding Objective-Cのmeta dataを読み込む & 初期化 Static メソッド初期化 Static Runtime Initialization System Interface Initialization Static Runtime Initialization UIKit Initialization didFinishLaunching WithOptions First Rendering

Slide 24

Slide 24 text

© ZOZO Technologies, Inc. 改善方法 Static メソッドの数を減らす(少し非現実的) Static Runtime Initialization System Interface Initialization Static Runtime Initialization UIKit Initialization didFinishLaunching WithOptions First Rendering

Slide 25

Slide 25 text

© ZOZO Technologies, Inc. Static Runtime Initialization System Interface Initialization Static Runtime Initialization UIKit Initialization didFinishLaunching WithOptions First Rendering 改善方法 Static メソッドの数を減らす(少し非現実的) Objective-Cのクラスを減らす

Slide 26

Slide 26 text

© ZOZO Technologies, Inc. Static Runtime Initialization System Interface Initialization Static Runtime Initialization UIKit Initialization didFinishLaunching WithOptions First Rendering 改善方法 Static メソッドの数を減らす(少し非現実的) Objective-Cのクラスを減らす Objective-Cの「+load」の代わりに「+iniaialize」を使う

Slide 27

Slide 27 text

© ZOZO Technologies, Inc. Static Runtime Initialization System Interface Initialization Static Runtime Initialization UIKit Initialization didFinishLaunching WithOptions 改善方法 Static メソッドの数を減らす(少し非現実的) Objective-Cのクラスを減らす Objective-Cの「+load」の代わりに「+iniaialize」を使う なるべくObjective-Cの代わりにSwiftを使う First Rendering

Slide 28

Slide 28 text

© ZOZO Technologies, Inc. UIKit Initialization System Interface Initialization Static Runtime Initialization UIKit Initialization didFinishLaunching WithOptions First Rendering やっていること UIApplication, UIApplicationDelegateを初期化 UserDefaultsの初期化 残りはシステム側の処理

Slide 29

Slide 29 text

© ZOZO Technologies, Inc. 改善方法 UserDefaultsに格納する内容を減らす ほとんどシステム側の処理のためやれることはあまりない UIKit Initialization System Interface Initialization Static Runtime Initialization UIKit Initialization didFinishLaunching WithOptions First Rendering

Slide 30

Slide 30 text

© ZOZO Technologies, Inc. System Interface Initialization Static Runtime Initialization UIKit Initialization didFinishLaunching WithOptions First Rendering didFinishLaunchingWithOptions やっていること アプリの仕様に従う処理 外部SDKの初期化処理(必要なら) (Firebaseなど。。)

Slide 31

Slide 31 text

© ZOZO Technologies, Inc. didFinishLaunchingWithOptions 改善方法 後回しできる処理が実行タイミングを変更する System Interface Initialization Static Runtime Initialization UIKit Initialization didFinishLaunching WithOptions First Rendering

Slide 32

Slide 32 text

© ZOZO Technologies, Inc. やっていること 最初のフレームを描画 System Interface Initialization Static Runtime Initialization UIKit Initialization didFinishLaunching WithOptions First Rendering First Rendering

Slide 33

Slide 33 text

© ZOZO Technologies, Inc. 改善方法 Viewの構成を単純化 Autolayoutの制約を減らす System Interface Initialization Static Runtime Initialization UIKit Initialization didFinishLaunching WithOptions First Rendering First Rendering

Slide 34

Slide 34 text

© ZOZO Technologies, Inc. まとめ 現状の起動時間を把握する (Metrics Organizer) App Launchでボトルネックを探す 方法選定 & 対応 対応の流れ

Slide 35

Slide 35 text

© ZOZO Technologies, Inc. Sample App https://github.com/trywjs/DietSample WWDC 2012 iOS App Performance: Responsiveness https://developer.apple.com/videos/play/wwdc2012/235/ WWDC 2016 Optimizing App Startup Time https://developer.apple.com/videos/play/wwdc2016/406 WWDC 2019 Optimizing App Launch https://developer.apple.com/videos/play/wwdc2019/423/ Reducing Your App's Launch Time https://developer.apple.com/documentation/xcode/improving_your_app_s_performance/reducing_your_app_s_launch_time Improving Your App's Performance https://developer.apple.com/documentation/metrickit/improving_your_app_s_performance Reference list

Slide 36

Slide 36 text

No content