Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

gen

October 01, 2020
Tweet

More Decks by gen

Other Decks in Programming

Transcript

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

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

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

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

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

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

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

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

    System Interface Initialization System Interface Initialization Static Runtime Initialization UIKit Initialization didFinishLaunching WithOptions First Rendering
  8. © 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
  9. © 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する
  10. © 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優先にする
  11. © 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 サンプルコードは 後日公開予定です
  12. © 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
  13. © ZOZO Technologies, Inc. 改善方法 Static メソッドの数を減らす(少し非現実的) Static Runtime Initialization

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

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

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

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

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

    Static Runtime Initialization UIKit Initialization didFinishLaunching WithOptions First Rendering First Rendering
  21. © 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