1. 程式人生 > >Android面試系列冷啟動優化

Android面試系列冷啟動優化

什麼是冷啟動?

  1. 冷啟動的定義

    冷啟動就是在啟動應用前,系統中沒有該應用的任何程序資訊時候的啟動(第一次開啟應用,或者殺死了這個app程序後的啟動)

  2. 冷啟動/熱啟動的區別

    熱啟動定義:使用者使用app返回鍵退出應用,然後馬上又重新啟動應用。

    區別一:app的程序是否在手機中已經存在了,冷啟動時app的程序並不存在,需要重新建立;熱啟動是App的程序已經存在了,不需要再重新建立。

    區別二:冷啟動因為之前手機中沒有App的程序2,先建立Application類,再建立MainActivity類;熱啟動會從已有的程序來啟動,不會再走Application類,而是直接啟動MainActivity類(注,一個應用重新程序的建立,到新程序的銷燬,MyApplication類只初始化建立一次,也就是說熱啟動的時候,程式碼並不走MyApplication這個類)

  3. 冷啟動時間的計算

    冷啟動的時間值從應用啟動(建立程序)開始計算,到完成檢視的第一次繪製(即第一個Activity內容對使用者可見)為止。

冷啟動流程

  • Zygote程序中fork創建出一個新的程序
  • 建立初始化Application類,建立MainActivity類
  • setContentView佈局,判斷DecorView的存在,通過 inflate將View新增到DecorView的mContentParent中(DecorView會和ViewRoot的實現類ViewRootImpl有一個關聯依賴,後面的幾個方法是ViewRootImpl中的),這裡用到了onMeasure/onLayout/onDraw這幾個方法來完成裡面View內容)
  • 當onCreate/onStart/onResume方法走完,Activity的onResume方法,接著會呼叫Activity的makeVisible(),在該方法中DecorView真正完成了新增顯示到Window中,Activity的檢視能被使用者看到。

冷啟動流程後引起的黑白屏錯覺卡頓問題

  1. 黑白屏錯覺卡頓問題出現的原因
    在冷啟動流程第三步的時候View新增到了mCOntentParent中,但是這時候DecorView並沒有被WindowManager識別,在第四步的makeVisiable()方法中
void makeVisable(){
    if(!mWindowAdded){
        ViewManager wm=getWindowManager();
wm.addView(mDecor,getWindow.getAttributes()); mWindowAdded=true; } mDecor.setVisibility(View.VISIBLE); }

DecorView真正的完成了新增和顯示這兩個過程,但是wm會先載入APP裡的主題樣式裡的視窗背景(windowBackground)作為預覽元素,然後才去真正的載入佈局,如果這個時間過長,而預設的背景又是黑色或者白色,這樣會給使用者造成一種錯覺,這個APP很卡,很不流暢會出現黑色或者白色螢幕閃過,自然也影響了使用者體驗。

  1. 黑白屏錯覺卡頓解決辦法

(1)App啟動頁面為圖片或者是drawable檔案

//style中
<style name="ThemeSplash" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:background">@drawable/login_qdbg_new</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowFullscreen">true</item>
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>
//許可權檔案中
      <activity
            android:name=".ui.splash.SplashActivity"
            android:screenOrientation="portrait"
            android:theme="@style/ThemeSplash">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

設定設定整個App的style檔案,設定Android:background屬性為圖片或者是drawable檔案,這樣App在啟動過程中就是顯示的是啟動頁面的圖片或者是是drawable檔案;

(2)App啟動頁面為Layout檔案

這時候無法為App的style設定background,退而求其次主流的方式是設定白色背景

<item name="android:windowBackground">@color/color_ffffff</item>

而這裡的@color/color_ffffff就是我們定義的白色色值,這樣經過處理之後App啟動時就不會出現黑屏的效果了。

如何優化冷啟動的實際

  1. 在Application中的onCreate()方法中減少工作量,第三方sdk有一個懶載入操作判斷使用的時候呼叫
  2. 不要讓Application參與業務的操作
  3. 不要讓Application進行耗時的操作(io操作大忌)
  4. 不要以靜態變數的方式在Application中儲存資料,靜態變數生命週期和app是一樣,會造成記憶體洩漏,資料安全等問題
  5. 佈局/mainThread MainActivity,View層級減少,可以選擇懶載入按需載入;有一些資源的初始化放在子執行緒中初始化

相關推薦

Android面試系列啟動優化

什麼是冷啟動? 冷啟動的定義 冷啟動就是在啟動應用前,系統中沒有該應用的任何程序資訊時候的啟動(第一次開啟應用,或者殺死了這個app程序後的啟動) 冷啟動/熱啟動的區別 熱啟動定義:使用者使用app返回鍵退出應用,然後馬上又重新啟動應用。 區別一:ap

Android應用優化啟動優化

前言 事件發生在發包上線的前兩天,在某某雲進行移動測試時,提示冷啟動速度低於平均值的問題,之前自己也曾嘗試過優化,但是發現效果並不是很明顯,作為一個有追求的開發者,趁著有點空閒時間,要好好研究一下冷啟動優化問題。 App的啟動流程 我們可以瞭解一下官方文件《App startup time》對App啟動

Android 啟動白屏,跳轉黑屏以及啟動優化

一,白屏 現象:啟動app,白屏一段時間後才出現歡迎頁 解決: 1,新增style <style name="AppTheme.Launcher"> <item name="android:windowDisablePreview">true<

探究Android啟動優化

本文依據平臺如下 機型: 魅藍Note(高通615真八核/2G/1080P/4.4) 效果:1.1s -> 0.7s(實際使用者看到的假介面時間更短) 1. 啟動過程概述 在應用層,普通APP啟動過程大致如下: 載入Application 靜態程式碼段/建構函式 onCreate方法 載入主Activi

Android效能優化啟動優化

1.什麼是冷啟動[啟動時間比較長]:在應用啟動前,系統沒有該應用的任何程序資訊。2.什麼是熱啟動[啟動時間比較短] :使用者按了返回鍵,又馬上重新啟動了此應用。3.冷啟動會走application這個類,熱啟動就不會走application這個類4.冷啟動流程5.冷啟動優化 

函數計算性能福利篇(一) —— 系統啟動優化

重要 51cto 說明 rst 計算 alt 代碼 只需要 生成 摘要: 背景 函數計算是一個事件驅動的全托管 serverless 計算服務。使用函數計算構建應用,用戶只需要專註於實現應用層的邏輯實現;服務器等基礎設施的容錯、伸縮以及運維工作由平臺來完成。因此用戶能在很短

函式計算效能福利篇(二) —— 業務啟動優化

繼前一篇《函式計算效能福利篇——系統冷啟動優化》,我們來看看近期函式計算推出的 Initializer 功能帶來的效能優化效果。 背景 函式計算是一個事件驅動的全託管 serverless 計算服務,使用者可以將業務實現成符合函式計算程式設計模型的函式,交付給平臺快速實現彈性高可用的雲原生應用。 使用者

Android面試系列文章2018之記憶體管理之UI卡頓篇

Android面試系列文章2018之記憶體管理之UI卡頓篇 1.UI卡頓的原理   60ftp –> 16ms: Android系統每隔16ms都會對介面進行渲染一次,造成卡頓的原因就是Android系統在渲染的時候丟幀了, 16ms = 1000/60hz,相當於60fps

Android 元件系列 -- Activity 啟動流程(9.0)

在學習完Android應用程式啟動過程原始碼分析,針對最新Android9.0的程式碼,以相應的順序再次學習。在9.0的版本中對於Activity的啟動流程上並沒有太大的變化,但是在程式碼層面,改動的卻很多。 流程概覽 以Launcher啟動APP為例: Lau

函數計算性能福利篇(二) —— 業務啟動優化

其中 識別 處理請求 完全 行為 分析 eve contex 出了 繼前一篇《函數計算性能福利篇——系統冷啟動優化》,我們再來看看近期函數計算推出的 Initializer 功能之後,帶來的一波高能性能優化成果。 背景函數計算是一個事件驅動的全托管 serverless 計

Android面試系列之Handler機制篇

1.什麼是Handler?   Handler是可以通過傳送和處理Message和Runnable物件來關聯相應執行緒的MessageQueue。通常我們認為它是一種非同步機制。   a.可以讓對應的Message和Runnable在未來的某個時間點進行相應的處理。   

Android面試系列Android基礎知識

這兩天就要換工作了,為了拿到offer,是時候來一波面試準備了!希望自己能找到心儀的工作。也希望這篇部落格能幫助到大家。 本篇部落格是相對基礎的知識,雖然是基礎,但是很重要,你能保證你都記住了麼? Activity相關 Activity是四大元件之一,

Android知識體系總結之Android部分之啟動&熱啟動

Android知識體系總結之Android部分之冷啟動&熱啟動篇 1.冷啟動&熱啟動 1.1 什麼是冷啟動?   當啟動應用時,後臺沒有該應用的程序,這時系統會重新建立一個新的程序分配給該應用,這個啟動方式就是冷啟動。它的特點就是冷啟動因為系統

Android面試系列之動畫

文章目錄 1.面試技巧 2.面試問題 3.內容 3.1 Android動畫有幾種 3.2 原理 未完待續 1.面試技巧 請移步本系列第一篇文章:android面試系列之面試技巧 2.面試問

Android面試系列之非同步訊息處理相關

我們在平時的專案開發中,肯定會遇到處理非同步任務的場景。因為Android中的UI執行緒是不安全的,我們需要更新ui的話就必須在ui執行緒上進行操作。否則就會拋異常。 這個時候我們就需要用到非同步訊息處理了 比如,在子執行緒中請求資料,拿到資料後告訴ui執行

AOSP Android 8.0 啟動流程分析(二)

前奏: Android系統雖然基於Linux系統的,但是由於Android屬於嵌入式裝置,並沒有像PC那樣的BISO程式,取而代之的是Bootloader----系統啟動載入器。 /boot : 存放載入程式,核心和記憶體操作程式 /

【騰訊Bugly乾貨分享】Redex初探與Interdex:Andorid啟動優化

導語 早在去年10月份,facebook就釋出了介紹redex的文章,這個據說可以直接對apk做處理,既提高啟動效能,又可減少安裝包的利器讓安卓開發者們都心動不已。直到今年4月,redex終於開源了,我們也第一時間對redex做了研究(有觀眾可能要說我騙人

android 性能優化 -- 啟動過程 啟動啟動

sdc 視覺 準備 and 接下來 元素 uri word androidm 一、應用的啟動方式   通常來說,啟動方式分為兩種:冷啟動和熱啟動。   1、冷啟動:當啟動應用時,後臺沒有該應用的進程,這時系統會重新創建一個新的進程分配給該應用,這個啟動方式就是冷啟動。   

Android中APP應用啟動黑白屏原因 優化解決方案

冷啟動 前言 應用啟動 冷啟動流程 問題原因 解決方法 優化 前言 做過APP開發,尤其是複雜專案的同學應該會經歷過APP在桌面點選冷啟動的時候,你以為會順利開啟應用首頁,但是出現在你眼前的

Android應用啟動過程分析和優化方案你瞭解多少

你有沒有發現,點選安卓手機桌面上的App圖示時,有時候應用馬上進入主介面,有時候要經歷好幾秒甚至更久的白屏(也可能是黑屏)時間才能進入主介面呢?這其實是安卓應用常見的冷熱啟動問題。本文就和大家一起聊聊冷熱啟動方式和啟動頁的體驗優化方案。 啟動方式 安卓應用的啟動方式分為三種:冷啟動