<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          App 啟動(dòng)時(shí)間優(yōu)化詳解

          共 5715字,需瀏覽 12分鐘

           ·

          2020-12-17 13:20

          和你一起終身學(xué)習(xí),這里是程序員Android

          經(jīng)典好文推薦,通過閱讀本文,您將收獲以下知識(shí)點(diǎn):

          一、App 啟動(dòng)模式分類
          二、App 啟動(dòng)時(shí)間測量與分析
          三、應(yīng)用中冷啟動(dòng)避免白屏、黑屏方案
          四、Framework 層解決冷啟動(dòng)白屏、黑屏方案
          五、App 啟動(dòng)優(yōu)化原理
          六、App 啟動(dòng)優(yōu)化簡介
          七、App 啟動(dòng)優(yōu)化方案
          八、在 PMS中 App 啟動(dòng)優(yōu)化方案

          本文將討論如何優(yōu)化應(yīng)用的啟動(dòng)時(shí)間,首先我們需要了解APP啟動(dòng)的相關(guān)內(nèi)容。用戶希望APP能夠快速響應(yīng)并加載。一個(gè)啟動(dòng)速度慢的APP 不符合用戶期望,可能會(huì)令用戶失望,并且可能會(huì)導(dǎo)致用戶對(duì)您的應(yīng)用程序評(píng)價(jià)不佳,甚至?xí)遁d你的應(yīng)用。

          一、App 啟動(dòng)模式分類

          App 啟動(dòng)模式分以下 三 類 :

          1. 冷啟動(dòng)

          2. 熱啟動(dòng)

          3. 溫?zé)釂?dòng)

          1.冷啟動(dòng)

          APP從零開始,APP啟動(dòng)之前,系統(tǒng)沒有為此 APP創(chuàng)建獨(dú)立進(jìn)程。比如:設(shè)備啟動(dòng)后,APP第一次Launch或者APPKill掉后的重啟。這種類型的啟動(dòng)優(yōu)化存在很大挑戰(zhàn),因?yàn)?code style="box-sizing: border-box;font-size: 12px;font-family: Consolas, Monaco, " andale mono, ubuntu monospace;padding: 2px 4px;border-width: initial;border-style: none;border-color: initial;vertical-align: middle;white-space: pre-wrap;color: rgb(199, 37, 78);background-color: rgb(242, 242, 242);>Android系統(tǒng)或應(yīng)用還有其他更多的后臺(tái)進(jìn)程在運(yùn)行。

          啟動(dòng)流程大致如下:

          點(diǎn)擊Launcher 上的 icon開加載app -->立即顯示白屏或黑屏等 --> Application onCreate --> Activity Init----> Activity onCreate ---> 初始化數(shù)據(jù),填充顯示View ---> Activity onResume等,詳細(xì)請看下圖:

          App啟動(dòng)進(jìn)程優(yōu)化

          2. 熱啟動(dòng)

          APP的熱啟動(dòng)要比 冷啟動(dòng)簡單得多,內(nèi)存開銷也更低。APP熱啟動(dòng)時(shí)候,所有的系統(tǒng)都是把你的Activity帶到前臺(tái)。如果APP的所有Activity仍駐留在內(nèi)存中,則APP可以避免重復(fù)對(duì)象初始化、布局繪制和顯示等工作。
          如果APP 在內(nèi)存中被清理掉,比如調(diào)用ontrimmemory(),當(dāng)響應(yīng)熱啟動(dòng)時(shí),這些對(duì)象將重新被創(chuàng)建。

          熱啟動(dòng)與冷啟動(dòng)相同的屏幕行為:
          系統(tǒng)進(jìn)程會(huì)顯示一個(gè)空白屏幕,直到應(yīng)用程序完成渲染后將此空白屏幕移除掉,此屏幕創(chuàng)建會(huì)在加載APP時(shí)候立即創(chuàng)建,如需查看創(chuàng)建流程,需要查看PhoneWindosMangerAddWindows方法。

          3. 溫?zé)釂?dòng)

          處于冷啟動(dòng)與熱啟動(dòng)之間,既包含一些冷啟動(dòng)的操作,又含有部分熱啟動(dòng)的功能。例如以下兩種狀態(tài):

          1. 用戶退出APP后重新Launch。

          此時(shí)此APP的進(jìn)程可能會(huì)存在,然鵝,Activity 必須重新創(chuàng)建并調(diào)用onCreate方法

          2. APP 被緩存中清理掉時(shí)。

          此時(shí)用戶重新Launch APP時(shí),此APP的進(jìn)程和Activity都需要重新創(chuàng)建,但是任務(wù)棧中會(huì)保存部分APP實(shí)例數(shù)據(jù)(bundle類型)傳遞個(gè)Activity onCreate方法

          二、App 啟動(dòng)時(shí)間測量與分析

          為了更加準(zhǔn)確的測量 APP 啟動(dòng)的耗時(shí),請務(wù)必使用User版本進(jìn)行驗(yàn)證。UserDebug 或者eng版本會(huì)開很多調(diào)試開關(guān)影響測試的正常結(jié)果。

          如何獲取APP啟動(dòng)時(shí)間,請看以下測量方法
          ps:以下測試方法請?jiān)贏ndroid 4.4(含) 以上的版本進(jìn)行

          1.通過 adb 命令測量APP 冷啟動(dòng)時(shí)間

          使用adb 命令直接啟動(dòng)APP進(jìn)而測量APP啟動(dòng)耗時(shí) 的方法如下:

          adb shell am start -W [packageName]/[packageName.MainActivity]`

          adb [-d|-e|-s <serialNumber>] shell am start -S -W [packageName]/[packageName.MainActivity] -c android.intent.category.LAUNCHER -a android.intent.action.MAIN

          如要測量的app沒有源碼,比如:QQ,請用以下命令獲取, 當(dāng)前獲取焦點(diǎn)的Activity ,方法信息如下:

          adb shell dumpsys activity |findstr "mFocused"

          APP 啟動(dòng)時(shí)間詳情 請看以下圖片中橢圓 紅框區(qū)域內(nèi)容。

          測量APP冷啟動(dòng)時(shí)間的方法

          2.通過 adb logcat 查看APP 啟動(dòng)時(shí)間

          Log中,主要是 通過分析 logcatAPP在 ActivityManager: Displayed的時(shí)間值 ,此時(shí)間值包含以下時(shí)間綜合信息:

          1. Launch 進(jìn)程

          2. 初始化對(duì)象

          3. 創(chuàng)建并初始化Activity

          4. 填充布局

          5. 第一次繪制app 內(nèi)容

          比如下圖:ProgramAndroid程序啟動(dòng)時(shí)間700ms

          adb logcat 查看APP 啟動(dòng)時(shí)間

          3. 在代碼中測量app啟動(dòng)性能的方法如下:

          Activity代碼用調(diào)用 reportFullyDrawn(); 方法,將繪制完成后信息反饋到Log上,此方法跟logcat中查看的時(shí)間相似。
          比如自己運(yùn)行ProgramAndrod APP的啟動(dòng)時(shí)間信息如下

          11-24 11:47:00.363   982  1191 I ActivityManager: 
          Fully drawn com.programandroid/.MainActivity: +998ms

          reportFullyDrawn()方法告知系統(tǒng)app Launch 成功時(shí)間

          4. 使用Systrace 工具分析app啟動(dòng)時(shí)間

          當(dāng)然如果感覺上述方法比較麻煩,可以使用Systrace工具進(jìn)行分析,工具分析情況,下次貼出。

          在代碼中測量app啟動(dòng)性能的方法,使用工具分析

          三、應(yīng)用中冷啟動(dòng)避免白屏、黑屏方案

          手機(jī)中 APP首次啟動(dòng)(未在最近任務(wù)列表中,或已經(jīng)運(yùn)行過,但在最近任務(wù)列表中已清除啟動(dòng)記錄)稱為冷啟動(dòng),此時(shí)打開APP時(shí)候回閃白屏或黑屏,特別是當(dāng)系統(tǒng)主題為黑色或白色時(shí)候比較明顯。

          在應(yīng)用端規(guī)避掉打開APP閃白屏、黑屏問題,主要是從android:windowIsTranslucent上讓白屏變透明,進(jìn)而不讓用戶看到白屏、黑屏現(xiàn)象。

          但是,此解決方案會(huì)導(dǎo)致在Launcher中點(diǎn)擊APP`` icon 是會(huì)有輕微的卡頓現(xiàn)象,此現(xiàn)象會(huì)讓用戶誤認(rèn)為手機(jī)卡,APP啟動(dòng)慢,從而將打開APP閃白屏的黑鍋甩給手機(jī)制造廠商。

          1. 透明樣式Theme 解決方案如下:

          1. 自定義透明樣式

          res/values/style.xml中自定義樣式

          自定義透明樣式

          2. App 啟動(dòng)入口Activity 中使用自定義樣式

          App 啟動(dòng)入口Activity 中使用自定義樣式

          注意: windowDisablePreview =false 屬性可以不讓白屏顯示,失去中間白屏過度,會(huì)給用戶帶來不是太好的體驗(yàn),比如點(diǎn)擊后需要稍微等一下才會(huì)打開APP,會(huì)讓用戶錯(cuò)誤的懷疑自己是否成功點(diǎn)擊過icon。Google 很不推薦此種做法。

          2. 使用app logo等圖片樣式使用方法如下

          1. 自定義Theme

          自定義Theme

          2. 為 要啟動(dòng)的Activity設(shè)置自定義樣式

          為 要啟動(dòng)的Activity設(shè)置自定義樣式

          3. 同樣也可以在Java類中的 設(shè)置樣式

          Java類中的 設(shè)置樣式

          此方法也是Google推薦的方法,建議大家可以用自定義Theme替換掉系統(tǒng)中的白屏,當(dāng)然也可以搞成什么廣告頁面等等。

          四、 Framework 層解決冷啟動(dòng)白屏、黑屏方案

          打開APP閃黑屏、白屏的根本原因在于PhonewindowManger中的addStartingWindow 方法。

          addStartingWindow方法

          自定義填充Window 背景

          Framwork上 這樣修改后,會(huì)將白色屏幕替換成我們客制化的顏色,此修改會(huì)影響到所有APP的啟動(dòng)。

          五、App 啟動(dòng)優(yōu)化原理

          L版本之后,手機(jī)上所有APP都要經(jīng)過dex2oat處理之后,才能運(yùn)行.
          dex2oat 是將原來的dex文件預(yù)先的翻譯處理,從而加快APP運(yùn)行的時(shí)間,但由于某些APP比較復(fù)雜,優(yōu)化的時(shí)間可能會(huì)比較長,進(jìn)而給用戶感覺運(yùn)行卡頓。

          dex2oat 優(yōu)化是以dex文件中的method為單位,dex2oat 會(huì)根據(jù)需要優(yōu)化一定量的method,也就是說并不是優(yōu)化的method都會(huì)被翻譯成oat模式。

          根據(jù)優(yōu)化的method的量的多少,可以分為如下的幾種模式:

          Android 虛擬機(jī)優(yōu)化模式

          六、 App 啟動(dòng)優(yōu)化簡介

          Android L之后的版本,如無特殊處理,APP啟動(dòng)模式為Speed模式,此模式性能較好,但優(yōu)化之后的文件占用空間比較大。不同模式可以看上面MTK 提供的參考標(biāo)準(zhǔn)。

          對(duì)APP的優(yōu)化是通過dex2oat 去執(zhí)行的,優(yōu)化模式的參數(shù)是有外界調(diào)用dex2oat方法傳遞的參數(shù)控制,如無傳遞參數(shù),默認(rèn)參數(shù)Speed。

          那么調(diào)用dex2oat的路徑有哪些呢?

          1.安裝APP時(shí)優(yōu)化

          通過 Framework 下的PackageManagerService 將參數(shù)傳遞給 mAppInstallDir,然后mAppInstallDir調(diào)用dex2oat,因此此種方式的優(yōu)化模式通過PMS控制。

          此種模式是將APP的路徑,優(yōu)化之后的oat存放路徑,傳遞給dex2oat。
          但是由于內(nèi)容可能發(fā)生改變,我們有可能無法在dex2oat對(duì)APP加以識(shí)別,所以,這時(shí)候,可以在installd或者PMS中加以判斷,是否是我們認(rèn)為安裝比較慢的APP,如果是的話,則改變其優(yōu)化模式。

          2. APP自身優(yōu)化插件時(shí)

          此種模式往往會(huì)指定模式為speed模式或者不指定,在優(yōu)化之后的保存路徑中,攜帶APP的包名。

          intall.jpg

          目前有些 apk 像Facebook、微信WeChat等 APP,應(yīng)用本身較大且代碼復(fù)雜度高,可能會(huì)出現(xiàn)安裝失敗,安裝慢等問題。

          安裝失敗是由于dex2oat進(jìn)程編譯時(shí)間過久打到了timeout。
          安裝慢當(dāng)然就是dex2oat做的compiler久的原因。

          另外,像 微信 WeChat 這種apk在啟動(dòng)應(yīng)用的時(shí)候是會(huì)優(yōu)化插件的(而不是在安裝的時(shí)候優(yōu)化),這樣就會(huì)導(dǎo)致應(yīng)用lunch時(shí)間過久,給用戶的感覺就是很晚才入,手機(jī)卡頓等鍋,讓手機(jī)廠商背負(fù)。在需更改優(yōu)化的模式,加快安裝的時(shí)間時(shí),請注意此修改會(huì)降低 APP 運(yùn)行的性能。

          注意:APP安裝 / lunch時(shí)間的長短取決于CPU核心數(shù),8 核CPU 肯定比 4 核 CPU優(yōu)化要快,除此之外,還取決于EMMC的性能 ,memory等系統(tǒng)因素。

          七、App 啟動(dòng)優(yōu)化方案

          對(duì)于APP優(yōu)化目前有3個(gè)地方可以進(jìn)行處理。

          1. PackageManagerService中

          這個(gè)地方是安裝APP必經(jīng)之路,代碼存放地址如下:

          PackageManagerService 代碼路徑


          2. installd的commands.cpp中

          這也是安裝APP的必經(jīng)之路 ,代碼存放地址如下:

          commands.cpp代碼存放路徑


          3. dex2oat 中

          ex2oat是所有APP或者jar包的必經(jīng)之路,但是由于傳遞給dex2oat的參數(shù)有限,所以可能無法識(shí)別。

          因此,對(duì)于安裝APP可以在PMS中修改,而對(duì)于jar包可以在dex2oat當(dāng)中修改。
          因?yàn)?code style="box-sizing: border-box;font-size: 12px;font-family: Consolas, Monaco, " andale mono, ubuntu monospace;padding: 2px 4px;border-width: initial;border-style: none;border-color: initial;vertical-align: middle;white-space: pre-wrap;color: rgb(199, 37, 78);background-color: rgb(242, 242, 242);>PMS中我們可以知道APPpkg信息,這個(gè)是每一個(gè)APP唯一的。
          而對(duì)jar包來說,由于每一個(gè)APP在優(yōu)化的時(shí)候,喜歡把優(yōu)化之后的jar包放在自己安裝的APP路徑下面。所以,可以利用這個(gè)特性進(jìn)行判斷 。

          八、 在 PMS中 App 啟動(dòng)優(yōu)化方案

          ps:此解決方案適用于Android N版本

          主要修改PackageDexOptimizer.java文件的 performDexOptLI方法中進(jìn)行優(yōu)化。

          在這函數(shù)中,可以判斷傳遞下來的pkg是否是我們需要的APP,如果是的話,將targetCompilerFilter設(shè)置為speed-profile。
          speed-profile 會(huì)在安裝的時(shí)候采用 interperter-only,然后,運(yùn)行一段時(shí)間之后,會(huì)將那些常用的方法優(yōu)化成為speed模式。也就是說是有選擇性的優(yōu)化。

          優(yōu)化 app 啟動(dòng)模式

          查看 APP 啟動(dòng)模式

          至此,本篇已結(jié)束。轉(zhuǎn)載網(wǎng)絡(luò)的文章,小編覺得很優(yōu)秀,歡迎點(diǎn)擊閱讀原文,支持原創(chuàng)作者,如有侵權(quán),懇請聯(lián)系小編刪除。同時(shí)感謝您的閱讀,期待您的關(guān)注。

          點(diǎn)個(gè)在看,方便您使用時(shí)快速查找!

          瀏覽 69
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲无码电影一 | 成人做爰黄 片免费 | 99热国产 | 亚洲AV无码久久久久网站飞鱼 | 国产黄色大片 |