25: 難道公司發大財了!?App Launch Time 加速面面觀
weak self - En podcast af 一三、波肥
Kategorier:
這集由波肥與喬喬聊聊:
- 為什麼要加速 App Launch Time?
- 什麼時候做?
- 以及怎麼做?
- 庫存已久的題目一次補完
{ 完整節目筆記請按我 }
什麼時候做 App Launch Time 加速?
公司有在賺錢的時候
App Launch 三階段
- Pre-main: loading (MachO + dylib) / rebase & binding / Objc Setup / Initializer
load dependency list from executable header
rebase / binding : dylib 無法被改指令 (signed) ,load 完都是互相獨立存在某個 memory 區段(random),dylib 裡指向的 data 和實際位置不同,就要 rebase (+ offset); binding 則是處理 指向外部 symbol
ObjC setup : register Objc class / Category / gurante uniquness of selector
Initializer: C++ constructor / +(load)
- main: create UIApplication, init AppDelegate
- post-main: didFinishLaunching, first frame rendered, 自定義終點 (request location + fetch feed)
- main.m 在 Swift 中去了哪裡? (
@UIApplicationMain
)
策略
- pre-main
dylib loading: app size 小;減少 dylib 數目 (merge pods); 全變 static
rebase/binding: you can do nothing about it; less dylib
Objc setup: less OC class, less cateogry
Initializer: use +(initalize) rather than +(load)
use iOS 13: dyld2 & dyld3
dyld2: in-process load
dyld3: out-process load (app download or install) => analyze header to get dylib depencies and prebinding/rebase
- main: nothing
- post-main: 少做事,盡量別擋 main thread;能 lazy 就 lazy; location : cache + 準確度低一點; feed: Cache; less IO
SDK init: try to lazy
Infra init: background thread
DB: background
File IO: avoid or lazy
量測、工具和用法
- start type: cold, warm, hot
- pre-main:
Xcode scheme env variable:DYLD_PRINT_STATISTICS = 1
orDYLD_PRINT_STATISTICS_DETAILS = 1
Instrument: Time profile / Thread state trace
Script to scan unused OC methods/ Scan swift unused files/methods (13 joe 支援)
merge pods
static pods: pre_install , override pod.build_type :Pod::Target:BuildType.static_framework
- main & post-main:
signpost: interval, event
CACurrentMediaTime() (ns), Date() (miu-s)
Firebase Performanc: Bug bug bug bug
MetricKit:XCTOSSingpostMetric.applicationLaunch
,MXMetricPayload
自己打點: Use process information to get when process created
高級技巧
- binary 重排
- Mach-O 結構組合
Reference code:
- scan oc unused selectors
- main.swift
- get process create time
補充資料
更多 weak self
- 聽眾信箱 [email protected]
- 官網 https://weakself.dev
- 主持人 一三、波肥、喬喬
- Twitter @weak_self
- 提問箱
- 贊助 weak self