日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

抖音字體大小設(shè)置方法安卓 抖音字體大小設(shè)置方法

啟動(dòng)性能是 APP 使用體驗(yàn)的門面,啟動(dòng)過程耗時(shí)較長(zhǎng)很可能使用戶削減使用 APP 的興趣,抖音通過對(duì)啟動(dòng)性能做劣化實(shí)驗(yàn)也驗(yàn)證了其對(duì)于業(yè)務(wù)指標(biāo)有顯著影響 。抖音有數(shù)億的日活,啟動(dòng)耗時(shí)幾百毫秒的增長(zhǎng)就可能帶來成千上萬用戶的留存縮減,因此,啟動(dòng)性能的優(yōu)化成為了抖音 Android 基礎(chǔ)技術(shù)團(tuán)隊(duì)在體驗(yàn)優(yōu)化方向上的重中之重 。
在上一篇抖音 Android 性能優(yōu)化系列:?jiǎn)?dòng)優(yōu)化之理論和工具篇中,已經(jīng)從原理、方法論、工具的角度對(duì)抖音的啟動(dòng)性能優(yōu)化進(jìn)行了介紹,本文將從實(shí)踐的角度通過具體的案例分析介紹抖音啟動(dòng)優(yōu)化的方案與思路 。
前言
啟動(dòng)是指用戶從點(diǎn)擊 icon 到看到頁面首幀的整個(gè)過程,啟動(dòng)優(yōu)化的目標(biāo)就是減少這一過程的耗時(shí) 。
啟動(dòng)過程比較復(fù)雜,在進(jìn)程與線程維度,它涉及到多次跨進(jìn)程的通信與多個(gè)線程之間的切換;在耗時(shí)成因維度,它包括 CPU、CPU 調(diào)度、IO、鎖等待等多類耗時(shí) 。雖然啟動(dòng)過程比較復(fù)雜,但是我們最終可以把它抽象成主線程的一個(gè)線性過程 。因此對(duì)于啟動(dòng)性能的優(yōu)化,就是去縮短主線程的這個(gè)線性過程 。
接下來,我們將按照主線程直接優(yōu)化、后臺(tái)線程間接優(yōu)化、全局優(yōu)化的邏輯,介紹團(tuán)隊(duì)在啟動(dòng)優(yōu)化的實(shí)踐中遇到的一些比較典型的案例,其間對(duì)于業(yè)界一些比較優(yōu)秀的方案也會(huì)進(jìn)行簡(jiǎn)要介紹 。
優(yōu)化案例解析1. 主線程直接優(yōu)化
對(duì)于主線程的優(yōu)化,我們將按照生命周期先后的順序展開介紹 。
1.1 MutilDex 優(yōu)化
首先我們來看第一個(gè)階段,也就是 Application 的 attachBaseContext 階段 。這個(gè)階段由于 Applicaiton Context 賦值等問題,一般不會(huì)有太多的業(yè)務(wù)代碼,預(yù)期中也不會(huì)有多少耗時(shí) 。但在實(shí)際測(cè)試過程中,我們發(fā)現(xiàn)在某些機(jī)型上,應(yīng)用安裝后的首次啟動(dòng)耗時(shí)非常嚴(yán)重,經(jīng)過初步定位,主要耗時(shí)在MultiDex.install 。

抖音字體大小設(shè)置方法安卓 抖音字體大小設(shè)置方法


在經(jīng)過詳細(xì)分析后,我們確定該問題集中在4.x的機(jī)型上,其影響首次安裝及后續(xù)更新后的首次啟動(dòng) 。
造成這一問題的原因?yàn)椋篸ex 的指令格式設(shè)計(jì)并不完善,單個(gè) dex 文件中引用的 Java 方法總數(shù)不能超過 65536 個(gè),在方法數(shù)超過 65536 的情況下,將拆分成多個(gè) dex 。一般情況下 Dalvik 虛擬機(jī)只能執(zhí)行經(jīng)過優(yōu)化后的 odex 文件,在 4.x 設(shè)備上為了提升應(yīng)用安裝速度,其在安裝階段僅會(huì)對(duì)應(yīng)用的首個(gè) dex 進(jìn)行優(yōu)化 。對(duì)于非首個(gè) dex 其會(huì)在首次運(yùn)行調(diào)用 MultiDex.install 時(shí)進(jìn)行優(yōu)化,而這個(gè)優(yōu)化是非常耗時(shí)的,這就造成了 4.x 設(shè)備上首次啟動(dòng)慢的問題 。
造成這個(gè)問題的必要條件有多個(gè),它們分別是:dex 被拆分成多個(gè) dex 文件、安裝過程中僅對(duì)首個(gè) dex 進(jìn)行的優(yōu)化、啟動(dòng)階段調(diào)用 MultiDex.install 以及 Dalvik 虛擬機(jī)需要加載 odex 。
很明顯前兩個(gè)條件我們是沒辦法破壞的——對(duì)于抖音來說,我們很難將其優(yōu)化成只有單 dex,系統(tǒng)的安裝過程我們也無法改變 。啟動(dòng)階段調(diào)用MultiDex.install這個(gè)條件也比較難以破壞——首先,隨著業(yè)務(wù)的膨脹我們很難做到用一個(gè) dex 去承載啟動(dòng)階段的代碼;其次,即使做到了后續(xù)也比較難以維護(hù) 。
因此我們選擇破壞“Dalvik 虛擬機(jī)需要加載 odex”這一限制,即繞過 Dalvik 的限制直接加載未經(jīng)優(yōu)化的 dex 。這個(gè)方案的核心在 Dalvik_dalvik_system_DexFile_openDexFile_bytearray 這個(gè) native 函數(shù),它支持加載未經(jīng)優(yōu)化后的 dex 文件 。具體的優(yōu)化方案如下:
首先從 APK 中解壓獲取原始的非首個(gè) dex 文件的字節(jié)碼;調(diào)用 Dalvik_dalvik_system_DexFile_openDexFile_bytearray,逐個(gè)傳入之前從 APK 獲取的 DEX 字節(jié)碼,完成 DEX 加載,得到合法的 DexFile 對(duì)象;將 DexFile 都添加到 APP 的 PathClassLoader 的 DexPathList 里;延后異步對(duì)非首個(gè) dex 進(jìn)行 odex 優(yōu)化 。

推薦閱讀