1. 程式人生 > >Android效能優化之 App啟動原理分析及速度和時間優化

Android效能優化之 App啟動原理分析及速度和時間優化

應用的啟動速度緩慢這是很多開發者都遇到的一個問題,比如啟動緩慢導致的黑屏,白屏問題,大部分的答案都是做一個透明的主題,或者是做一個Splash介面,但是這並沒有從根本上解決這個問題。那麼如何從根本上解決這個問題或者做到一定程度的緩解?

一、應用的啟動方式

1、冷啟動:當啟動應用時,後臺沒有該應用的程序,這時系統會首先會建立一個新的程序分配給該應用,這種啟動方式就是冷啟動。

2、熱啟動:當啟動應用時,後臺已有該應用的程序,比如按下home鍵,這種在已有程序的情況下,這種啟動會從已有的程序中來啟動應用,這種啟動方式叫熱啟動。

3、溫啟動 :當啟動應用時,後臺已有該應用的程序,但是啟動的入口Activity被幹掉了,比如按了back鍵,應用雖然退出了,但是該應用的程序是依然會保留在後臺,這種啟動方式叫溫啟動。

二、應用的啟動時間統計

adb shell am start -W [PackageName]/[PackageName.MainActivity]

執行成功後將返回三個測量到的時間: 

這裡面涉及到三個時間,ThisTime、TotalTime 和 WaitTime。WaitTime 是 startActivityAndWait 這個方法的呼叫耗時,ThisTime 是指呼叫過程中最後一個 Activity 啟動時間到這個 Activity 的 startActivityAndWait 呼叫結束。TotalTime 是指呼叫過程中第一個 Activity 的啟動時間到最後一個 Activity 的 startActivityAndWait 結束。如果過程中只有一個 Activity ,則 TotalTime 等於 ThisTime。

三、效能檢查項

從我們Application開始到首頁顯示出來,這個過程,我們應該注意一些什麼,將這個過程細分一下,會有下面的時間點需要注意。

Application的構造器方法——>attachBaseContext()——>onCreate()——>Activity的構造方法——>onCreate()——>配置主題中背景等屬性——>onStart()——>onResume()——>測量、佈局、繪製顯示在介面上。

因為上面這些階段全部都是在主執行緒中執行的,任何不經意的操作都可能拖慢應用的啟動速度。所以我們不應在Application以及Activity的生命週期回撥中做任何費時操作,具體指標大概是你在onCreate,onResume,onStart等回撥中所花費的總時間最好不要超過400ms,否則使用者在桌面點選你的應用圖示後,將感覺到明顯的卡頓。但是有些不得以的任務又必須在UI顯示之前執行。所以我們要將任務劃分優先順序。

  • 優先順序為1的在應用啟動時,就開始載入
  • 優先順序為2的在首頁渲染完成後,開始載入
  • 優先順序為3的在首頁渲染完成後,延遲載入

對於首頁渲染完成後,開始載入,或者延遲載入,延遲載入的目的就是介面先顯示出來,然後載入,但是你覺得要延遲多久呢?在 Android 的高階機型上,應用的啟動是非常快的 , 這時候只需要 Delay 很短的時間就可以了, 但是在低端機型上,應用的啟動就沒有那麼快了,而且現在應用為了相容舊的機型,往往需要 Delay 較長的時間,這樣帶來體驗上的差異是很明顯的。延遲載入有一種方式。

  第一種寫法:直接PostDelay 300ms.
  myHandler.postDelayed(mLoadingRunnable, DEALY_TIME);
  第二種寫法:優化的DelayLoad
  getWindow().getDecorView().post(new Runnable() {
    @Override
   public void run() {
        myHandler.post(mLoadingRunnable);
   }
  });
  1. 第一種寫法:直接PostDelay 300ms.

  2. myHandler.postDelayed(mLoadingRunnable, DEALY_TIME);

  3. 第二種寫法:優化的DelayLoad

  4. getWindow().getDecorView().post(new Runnable() {

  5. @Override

  6. public void run() {

  7. myHandler.post(mLoadingRunnable);

  8. }

  9. });

極力推薦用第二種,在視窗完成以後進行載入,這裡面的run方法是在onResume之後執行的。關於這種懶載入機制,參考Android應用啟動優化:一種DelayLoad的實現和原理(上篇),給出了詳細的解釋。

四、利用TraceView逐個修復

通過上面我們知道一種懶載入機制,所以我們可以將Application中和首頁的onCreate中的有些耗時任務,放到首頁渲染完畢後加載。如何找出這些耗時任務,TraceView就派上用場了,TraceView的用法,移步我的前面的部落格Android效能優化第(六)篇---TraceView 分析圖怎麼看?


比如在首頁的onCreate中我們進行了使用者啟動上報,這個進行懶載入是不是分分鐘減少139毫秒呢?


在比如在Application裡面用到了GSON,將String轉化成json,我將這個移動到懶載入裡面,是不是又減少了100毫秒呢?

在比如,有些Application中做了支付SDK的初始化,使用者又不會一開啟App就要支付,放在Application中載入幹嘛?

此處我們這裡舉得例子是優化了139毫秒和100毫秒的,其實真正耗時的任務有的有1秒多,都被我優化完了,所以trace圖中看不到了,就舉個了這兩個例子,還有SharedPreferences也是耗時大戶,經過檢測儲存一個boolean變數耗時120+毫秒以上。

利用TraceView可以清楚我們每一個方法的耗時時間,極大的幫助了我們做優化工作。

五、優化思路總結
1、UI渲染優化,去除重複繪製,減少UI重複繪製時間,開啟設定中的GPU過度繪製開關,各介面過度繪製不應超過2.5x;也就是開啟此除錯開關後,介面整體呈現淺色,特別複雜的介面,紅色區域也不應該超過全螢幕的四分之一;
2、根據優先順序的劃分,KoMobileApplication的一些初始化工作能否將任務優先順序劃分成3,在首頁渲染完成後進行載入,比如:PaySDKManager。
3、主執行緒中的所有SharedPreference能否在非UI執行緒中進行,SharedPreferences的apply函式需要注意,因為Commit函式會阻塞IO,這個函式雖然執行很快,但是系統會有另外一個執行緒來負責寫操作,當apply頻率高的時候,該執行緒就會比較佔用CPU資源。類似的還有統計埋點等,在主執行緒埋點但非同步執行緒提交,頻率高的情況也會出現這樣的問題。
4、檢查BaseActivity,不恰當的操作會影響所有子Activity的啟動。
5、對於首次啟動的黑屏問題,對於“黑屏”是否可以設計一個.9圖片替換掉,間接減少使用者等待時間。
6、對於網路錯誤介面,友好提示介面,使用ViewStub的方式,減少UI一次性繪製的壓力。
7、任務優先順序為2,3的,通過下面這種方式進行懶載入的方式

  getWindow().getDecorView().post(new Runnable() {
   @Override
   public void run() {
       myHandler.post(mLoadingRunnable);
    }
  });
  1. getWindow().getDecorView().post(new Runnable() {

  2. @Override

  3. public void run() {

  4. myHandler.post(mLoadingRunnable);

  5. }

  6. });

8、Multidex的使用,也是拖慢啟動速度的元凶,必須要做優化。後面有空專門寫一篇Multidex。

相關連結:

相關推薦

Android效能優化 App啟動原理分析速度時間優化

應用的啟動速度緩慢這是很多開發者都遇到的一個問題,比如啟動緩慢導致的黑屏,白屏問題,大部分的答案都是做一個透明的主題,或者是做一個Splash介面,但是這並沒有從根本上解決這個問題。那麼如何從根本上解決這個問題或者做到一定程度的緩解? 一、應用的啟動方式 1、冷啟動:

Android效能優化(一)App啟動原理分析啟動時間優化

一、啟動原理解析 Android是基於Linux核心的,當手機啟動,載入完Linux核心後,會由Linux系統的init祖先程序fork出Zygote程序,所有的Android應用程式程序以及系統服務程序都是這個Zygote的子程序(由它fork出來的)。其中最重要的一個就

效能優化App啟動時間

App啟動模式分類 1.冷啟動 冷啟動狀態:系統不存在該應用的程序。啟動應用才能創建出應用的程序。 一般是中應用在開機後或者系統停止後的第一次啟動過程。因為系統和應用在冷啟動時需要做跟多的工作 所以減少

Android效能測試啟動時間

          冷啟動是Android效能測試中的重要指標,即應用從程序未建立到完全啟動的時間,一般要求時長<1.5s,過長需要考慮優化。 獲取冷啟動時間的方法: 1.用命令列  adb shell am start

Java多執行緒優化偏向鎖原理分析

本文來自Ken Wu's Blog,原文標題:《Java偏向鎖實現原理(Biased Locking)》 閱讀本文的讀者,需要對Java輕量級鎖有一定的瞭解,知道lock record, mark word之類的名詞。 Java偏向鎖(Biased Locking)是

Spring5深度原始碼分析(三)AnnotationConfigApplicationContext啟動原理分析

程式碼地址:https://github.com/showkawa/spring-annotation/tree/master/src/main/java/com/brian AnnotationConfigApplicationContext啟動原理分析主要分析下面三點 1.@Qualifier與@P

Netty學習旅----ThreadLocal原理分析效能優化思考(思考篇)

/** * Returns the value in the current thread's copy of this * thread-local variable. If the variable has no value for the

Android 效能優化應用啟動

寫在前面 最近工作轉到Android 效能優化方向,剛轉過來,相關經驗缺乏,紀錄一個目前讓人惱火的問題。非常遺憾,本文到目前為止還未能提供解決問題的優化方案,也沒有明確定位到導致效能問題的瓶頸所在。就像解數學題一樣,花費了大把時間,然並卵。之所以寫它

Android效能優化啟動優化

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

Android進階——效能優化佈局渲染原理底層機制詳解(四)

引言 UI 全稱User Interaction,我第一次聽到這個名詞是在大學的時候,當時候上人機互動課,我們教授說他認為iPhone的i 就是代表Interaction的意思,暫且不必爭辯是非。回到我們軟體開發中來,UI是使用者感知與互動的第一且唯一的途徑,

Android 65K問題Multidex原理分析NoClassDefFoundError的解決方法

bottom mini ati ... types auto weight right for Android 65K問題相信困惑了不少人,盡管AS的出來能夠通過分dex高速解決65K問題,可是同一時候也easy由於某些代碼沒有打包到MainDex裏

Android應用優化啟動優化

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

iOS作業系統-- App啟動流程分析優化

背景知識: mach-o檔案為基於Mach核心的作業系統的可執行檔案、目的碼或動態庫,是.out的代替,其提供了更強的擴充套件性並提升了符號表中資訊的訪問速度, 符號表,用於標記原始碼中包括識別符號、宣告資訊、行號、函式名稱等元素的具體資訊,比如說資料型別、作用域以及記憶體地址,iOS符號表在dS

IOS —— App啟動原理程式碼優化

哈嘍,好久不見。最近處於心情低迷期就沒怎麼來更新文章了。 在下也算是個半路出家的程式碼家,從之前的文章更新到現在 依然是還是從基礎學起,萬物歸基礎! 所以從今天起每天回來更新彙報學習成果!!每天 今天主要接觸的是Application相關的知識,包括App啟動原理,以及windos視窗控制以及Appd

SpringBoot學習筆記一【Idea下建立springboot示例、啟動原理分析與兩種部署啟動方式】

1、使用背景 首先說下我們為什麼使用springboot,原因有以下幾點 1、快速建立獨立執行的spring專案以及與主流框架繼承 2、使用嵌入式的Servlet容器,無需打成war包 3、starters自動依賴於版本控制 4、大量的自動配置,簡化開發,也可修改預設值 5、

Android原始碼解析Launcher啟動分析

轉載自:http://blog.csdn.net/luoshengyang/article/details/6767736         在前面一篇文章中,我們分析了Android系統在啟動時安裝應用程式的過程,這些應用程式安裝好之後,還需要有一個Home應用

深入淺出Android中的App啟動流程分析

App啟動是指使用者點選手機桌面的app對應的icon開始,所以我們需要明白幾點基礎知識: 1.桌面也是一個Activity叫Launcher.java 2.在桌面點選icon啟動app跟在app內部啟動另一個Activity是一樣的都是呼叫startAct

Android走進Frameworkapp是如何被啟動

前言 一個app的程式是怎麼啟動的?入口在哪裡? 聽說ActivityManagerServices很屌,Why? Activity生命週期到底是誰呼叫的? Application又是在哪裡初始化的?onCreate又是如何被呼叫的? 面試官常常會問

HashMap原理分析JDK1.8效能優化

HashMap是java中一個重要概念,其原始碼部分研究起來也非常有意思,這裡做下總結。本文中1-4的原文連結是: http://blog.csdn.net/vking_wang/article/details/141665931、HashMap的資料結構資料結構中有陣列和連結串列來實現對資料的儲存,但這兩者

Android學習探索App多渠道打包動態添加修改資源屬性

Android App 前言: 關於Android渠道打包是一個比較老的話題,今天主要記錄總結一下多渠道打包以及如果動態配置修改一些資源屬性。今天以公司實際需求為例進行演示,由於項目復用很多公共的業務組件,而且業務組件之間的跳轉采用Scheme協議,每個業務組