アプリの起動時間短縮にむけて / after_iosdc_app_launch

22387942388a45f3f81ebc394700e296?s=47 gen
October 01, 2020

アプリの起動時間短縮にむけて / after_iosdc_app_launch

After iOSDC Japan 2020
https://zozotech-inc.connpass.com/event/185754/

Title

アプリの起動時間短縮にむけて

Speaker

元 政燮 Jeongsub Won(ZOZOTOWN部)

#zozotech #af_iosdc

22387942388a45f3f81ebc394700e296?s=128

gen

October 01, 2020
Tweet

Transcript

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

  2. © ZOZO Technologies, Inc. iOS開発は2011年から
 2019/7 ZOZOテクノロジーズに入社 
 EC業界歴4年半
 関わったサービス:SNS/動画アプリ、ECアプリ

    
 韓国ソウル出身
 株式会社ZOZOテクノロジーズ
 EC開発本部
 ZOZOTOWN部 元 政燮(げんと呼ばれてます)

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

  4. © ZOZO Technologies, Inc. Before After Sampleアプリで改善してみた結果 Device: iPhone XS

    MAX / OS: iOS 13.3 / Linked Dynamic Framework Count: 21
  5. © ZOZO Technologies, Inc. Metrics Organizer App Storeにリリースしたアプリの起動時間 (iOS 12.3以上の端末が対象)

    同意したユーザーのみ 理想は400ミリ秒 - Apple様より
  6. © ZOZO Technologies, Inc. App Launch (Instruments)

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

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

  9. © ZOZO Technologies, Inc. 起動タイプによる特徴 Cold Launch Warm Launch Resume

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

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

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

    非常に早い 再現方法 アプリをsuspend状態にしてから戻る
  13. © ZOZO Technologies, Inc. 起動処理の詳細と改善方法

  14. © ZOZO Technologies, Inc. System Interface Initialization System Interface Initialization

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

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

    Framework ロード System Interface Initialization 動的リンクされたライブラリーや フレームワークは起動時に依存関係 検索 & ロードが行われる System Interface Initialization Static Runtime Initialization UIKit Initialization didFinishLaunching WithOptions First Rendering
  17. © ZOZO Technologies, Inc. 改善方法 Dynamic Linkを減らす • 不要なLibrary, Frameworkはリンクしない

    System Interface Initialization System Interface Initialization Static Runtime Initialization UIKit Initialization didFinishLaunching WithOptions First Rendering
  18. © 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
  19. © 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する
  20. © 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優先にする
  21. © ZOZO Technologies, Inc. Swift Package Manager Dynamic FrameworkをStatic FrameworkにCompileする

    Swift PMのデフォルトリンクタイプは Static
  22. © 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 サンプルコードは 後日公開予定です
  23. © 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
  24. © ZOZO Technologies, Inc. 改善方法 Static メソッドの数を減らす(少し非現実的) Static Runtime Initialization

    System Interface Initialization Static Runtime Initialization UIKit Initialization didFinishLaunching WithOptions First Rendering
  25. © ZOZO Technologies, Inc. Static Runtime Initialization System Interface Initialization

    Static Runtime Initialization UIKit Initialization didFinishLaunching WithOptions First Rendering 改善方法 Static メソッドの数を減らす(少し非現実的) Objective-Cのクラスを減らす
  26. © 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」を使う
  27. © 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
  28. © ZOZO Technologies, Inc. UIKit Initialization System Interface Initialization Static

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

    Interface Initialization Static Runtime Initialization UIKit Initialization didFinishLaunching WithOptions First Rendering
  30. © ZOZO Technologies, Inc. System Interface Initialization Static Runtime Initialization

    UIKit Initialization didFinishLaunching WithOptions First Rendering didFinishLaunchingWithOptions やっていること アプリの仕様に従う処理 外部SDKの初期化処理(必要なら) (Firebaseなど。。)
  31. © ZOZO Technologies, Inc. didFinishLaunchingWithOptions 改善方法 後回しできる処理が実行タイミングを変更する System Interface Initialization

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

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

    Static Runtime Initialization UIKit Initialization didFinishLaunching WithOptions First Rendering First Rendering
  34. © ZOZO Technologies, Inc. まとめ 現状の起動時間を把握する (Metrics Organizer) App Launchでボトルネックを探す

    方法選定 & 対応 対応の流れ
  35. © 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
  36. None