文是從Apple備忘錄移來(lái)的,所以比較尷尬的是簡(jiǎn)書不支持表格
啟動(dòng)類型
冷啟動(dòng)
After phone reboot
App not in memory
No process exists
熱啟動(dòng)
Recently terminated
App is partially in memory
No process exists
中斷后重啟
App is suspended
App is fully in memory
Process exists
App啟動(dòng)階段
System interface -> Runtime init -> UIKit init -> Application init -> Initial Frame Render -> Extended?
System interface 優(yōu)化
DYLD3 : 庫(kù)加載
避免鏈接未使用的Frameworks
避免動(dòng)態(tài)庫(kù)加載,例如dlopen() 或 NSBundle中的 load()
硬鏈接所有的依賴項(xiàng)
libSystem Init : 初始化底層系統(tǒng)組件
Runtime Init優(yōu)化
Static Runtime Initialization : 初始化語(yǔ)言環(huán)境,Objective-C 和 Swift
不建議靜態(tài)初始化
如使用靜態(tài)庫(kù)初始化時(shí)應(yīng)暴露Init API盡早初始化棧
必須使用靜態(tài)初始化時(shí)將代碼移出靜態(tài) +[Class load] 方法,因?yàn)樵摲椒ㄔ贏pp啟動(dòng)中總會(huì)被調(diào)用,好的方法是在類中第一次使用該方法的時(shí)候使用 +[Class initialize] 進(jìn)行l(wèi)azy初始化
UIKit Initialization優(yōu)化
系統(tǒng)實(shí)例化UIApplication 和 UIApplicationDelegate
減少在UIApplication或UIApplicationDelegate中的代碼和工作
Application Initialization優(yōu)化
Lifecycle Callbacks
未使用UIScene
iOS 12?或更早
UIApplicationDelegate
application:willFinishLaunchingWithOptions:
application:didFinishLaunchingWithOptions:
UIApplicationDelegate
applicaitonWillEnterforegroud:
applicaitonDidBecomeActive:
使用UIScene
iOS 12?以后
UIApplicationDelegate
application:willFinishLaunchingWithOptions:
application:didFinishLaunchingWithOptions:
UISceneDelegate
scene:willConnectToSession:options:
sceneWillEnterforegroud:
sceneDidBecomeActive:
無(wú)論是否使用UIScene API,都應(yīng)在didFinishLaunch和didBecomeActive中推遲非相關(guān)的功能代碼加載
使用UIScene API,應(yīng)在Scenes之間共享資源
First Frame Render優(yōu)化
減少視圖中的層次,使用lazy加載views
減少自動(dòng)布局中的約束數(shù)量
Extended優(yōu)化
使用異步數(shù)據(jù)加載并顯示數(shù)據(jù)
界面在數(shù)據(jù)加載的同時(shí)應(yīng)具有互動(dòng)性和響應(yīng)性
利用os_signpost API衡量和標(biāo)記耗時(shí)
如何進(jìn)行啟動(dòng)優(yōu)化的評(píng)估
消除其他干擾,確保一致性評(píng)估,例如網(wǎng)絡(luò)干擾、后臺(tái)進(jìn)程干擾等
重啟設(shè)備,并將設(shè)備靜置2-3分鐘,這將清除任何不必要的狀態(tài)干擾
打開飛行模式或在代碼中標(biāo)記網(wǎng)絡(luò)依賴性來(lái)減少對(duì)網(wǎng)絡(luò)的依賴
使用iCloud將使后臺(tái)出現(xiàn)干擾,在測(cè)試評(píng)估過(guò)程中可以完全注銷iCloud
使用Release Build版本的App進(jìn)行測(cè)試評(píng)估,減少Debug對(duì)評(píng)估的影響并可以利用到編譯時(shí)優(yōu)化等技術(shù)
使用熱啟動(dòng)進(jìn)行評(píng)估和測(cè)試,這將更符合用戶在平常使用時(shí)的情況
使用舊的設(shè)備和新的設(shè)備同時(shí)測(cè)試保證應(yīng)用在新舊設(shè)備上都具有優(yōu)異的性能
使用XCTest進(jìn)行測(cè)試,xcode將自動(dòng)執(zhí)行重復(fù)的啟動(dòng)過(guò)程并收集信息
如何優(yōu)化啟動(dòng)
最小化工作
推遲與第一幀無(wú)關(guān)的工作,例如預(yù)加載項(xiàng)等
避免主線程沖突,將耗時(shí)的網(wǎng)絡(luò)操作或文件操作移出主線程
減少內(nèi)存的分配和使用
優(yōu)先工作
確保合適的服務(wù)質(zhì)量QoS安排Task工作
正確的調(diào)度優(yōu)先執(zhí)行的程序
優(yōu)化工作
限制啟動(dòng)時(shí)需要獲取的數(shù)據(jù)量或Lazy加載所需的變量和結(jié)果
緩存資源或復(fù)雜功能
如何使用XCode Instruments幫助優(yōu)化啟動(dòng)結(jié)果
使用Profile代替Run執(zhí)行代碼,Profile位置在Run的下拉菜單中,Profile將在發(fā)布模式下重新編譯App
使用App launch來(lái)監(jiān)控應(yīng)用啟動(dòng)時(shí)的情況,在iOS 13和xCode 11中Instruments自帶App launch應(yīng)用
使用XCTest測(cè)試,XCTest相比Instruments不占用性能,測(cè)試的結(jié)果更加準(zhǔn)確
技巧
os.log適用于apple全系列開發(fā)中的日志記錄
XCTest是Apple自帶的自動(dòng)化測(cè)試框架
MetricKit可以用于收集和上傳App的運(yùn)行性能,它可以指定功耗和性能指標(biāo)進(jìn)行上傳