android 效能最佳化 -- 啟動過程 冷啟動 暖開機

來源:互聯網
上載者:User

標籤:設定   大致   bundle   sdcard   操作   calling   isp   ppt   匯入   

一、應用的啟動方式

  通常來說,啟動方式分為兩種:冷啟動和暖開機。

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

  2、暖開機:當啟動應用時,後台已有該應用的進程(例:按back鍵、home鍵,應用雖然會退出,但是該應用的進程是依然會保留在後台,可進入工作清單查看),所以在已有進程的情況下,這種啟動會從已有的進程中來啟動應用,這個方式叫暖開機。

  特點

  1、冷啟動:冷啟動因為系統會重新建立一個新的進程分配給它,所以會先建立和初始化Application類,再建立和初始化MainActivity類(包括一系列的測量、布局、繪製),最後顯示在介面上。

  2、暖開機:暖開機因為會從已有的進程中來啟動,所以暖開機就不會走Application這步了,而是直接走MainActivity(包括一系列的測量、布局、繪製),所以暖開機的過程只需要建立和初始化一個MainActivity就行了,而不必建立和初始化Application,

  因為一個應用從新進程的建立到進程的銷毀,Application只會初始化一次。

二、應用的啟動過程

  冷啟動啟動流程:當點擊app的啟動表徵圖時,安卓系統會從Zygote進程中fork建立出一個新的進程分配給該應用,之後會依次建立和初始化Application類、建立MainActivity類、載入主題樣式Theme中的               

  windowBackground等屬性設定給MainActivity以及配置Activity層級上的一些屬性、再inflate布局、當onCreate/onStart/onResume方法都走完了後最後才進行contentView的measure/layout/draw顯示在介面上,所以直到這裡,

  應用的第一次啟動才算完成,這時候我們看到的介面也就是所說的第一幀。所以,總結一下,應用的啟動流程如下:

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

  大致流程如下:

  1、點擊案頭表徵圖,Launcher會啟動程式預設的Acticity,之後再按照程式的邏輯啟動各種Activity

  2、啟動Activity都需要藉助應用程式架構層的ActivityManagerService服務進程(Service也是由ActivityManagerService進程來啟動的);在Android應用程式架構層中,ActivityManagerService是一個非常重要的介面,

  它不但負責啟動Activity和Service,還負責管理Activity和Service。

    Step 1. 無論是通過Launcher來啟動Activity,還是通過Activity內部調用startActivity介面來啟動新的Activity,都通過Binder處理序間通訊進入到ActivityManagerService進程中,並且調用ActivityManagerService.startActivity介面;

    Step 2. ActivityManagerService調用ActivityStack.startActivityMayWait來做準備要啟動的Activity的相關資訊;

    Step 3. ActivityStack通知ApplicationThread要進行Activity啟動調度了,這裡的ApplicationThread代表的是調用ActivityManagerService.startActivity介面的進程,對於通過點擊應用程式圖示的情景來說,這個進程就是Launcher了,

    而對於通過在Activity內部調用startActivity的情景來說,這個進程就是這個Activity所在的進程了;

    Step 4. ApplicationThread不執行真正的啟動操作,它通過調用ActivityManagerService.activityPaused介面進入到ActivityManagerService進程中,看看是否需要建立新的進程來啟動Activity;

    Step 5. 對於通過點擊應用程式圖示來啟動Activity的情景來說,ActivityManagerService在這一步中,會調用startProcessLocked來建立一個新的進程,而對於通過在Activity內部調用startActivity來啟動新的Activity來說,這一步是不需要執行的,

    因為新的Activity就在原來的Activity所在的進程中進行啟動;

    Step 6. ActivityManagerServic調用ApplicationThread.scheduleLaunchActivity介面,通知相應的進程執行啟動Activity的操作;

    Step 7. ApplicationThread把這個啟動Activity的操作轉寄給ActivityThread,ActivityThread通過ClassLoader匯入相應的Activity類,然後把它啟動起來。

 

三、冷啟動過程中碰到的白屏黑屏以及最佳化啟動時間

  1、白屏問題 :

  android studio升級 2.0之後 加上Instant Run,Instant Run為了能夠讓我們快速部署代碼,背後其實是有一套非常複雜的邏輯的,比如要在APK中建立伺服器與Android Studio進行通訊,以及代碼差異比對和替換等,在研發過程中可能出現白屏問題,

  一般release版的程式是不會出現這種現象的;

  如果接下來還會出現白屏問題,可以查看style檔案

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">       <item name="android:windowIsTranslucent">true</item>   <item name="android:windowNoTitle">true</item> </style>

加入了兩個屬性,windowIsTranslucent和windowNoTitle,將這兩個屬性都設定成true,就可以讓程式在初始化的時候視窗是透明的,初始化結束後程式主介面才會顯示出來,從而也就完全看不到白屏介面了

 

  2、啟動時間的最佳化

  先測量activity的啟動時間-------Activity的reportFullyDrawn()方法 

   你就需要調用Activity的reportFullyDrawn()。它將在log裡報告從apk初始化(和前面Displayed的時間是一樣的)到reportFullyDrawn() 方法被調用用了多長時間。

      reportFullyDrawn()方法顯示的log也是類似這樣:

      ActivityManager: Displayed com.Android.myexample/.StartupTiming: +768ms

     在4.4上調用reportFullyDrawn()方法會崩潰(但是log還是能正常列印),提示需要UPDATE_DEVICE_STATS許可權 ,但是這個許可權只有系統app才能授權。解決的辦法是這樣調

try{    reportFullyDrawn();}catch(SecurityException e){}

還有一種測量啟動時間的方法也值得一提,那就是screenrecord命令

  首先啟動帶—bugreport選項(它可以在frames 中新增時間戳記-應該是L中的特性)的screenrecord 命令:

  $ adb shell screenrecord --bugreport /sdcard/launch.mp4
  然後點擊app的表徵圖,等待app顯示,ctrl-C screenrecord, 使用adb pull命令把檔案匯出到電腦。  $ adb pull /sdcard/launch.mp4

  現在你可以開啟錄製視頻看看發生了什麼。你需要一個能逐幀查看的視頻播放器(mac上的Quicktime 就可以,不清楚其它os上什麼播放器這個功能最好使)。現在逐幀播放,注意視頻的上方有一個frame 時間戳記。

  一直往前直到你發現app表徵圖高亮了為止。這個時候系統已經處理了表徵圖上的點擊事件,開始啟動app了,記錄下這一幀的時間。繼續播放幀直到你看到了app整個UI的第一幀為止。根據不同情況(是否有啟動視窗,是否有啟動畫面等等),

  事件和視窗發生的實際順序可能會有不同。對於一個簡單的app來說,你會首先見到啟動視窗,然後漸層出app真實的UI。在你看到UI上的任何內容之後,你應該記錄下第一幀,這時app完成了布局和繪製,準備開始顯示出來了。同時也記錄下這一幀所發生的時間。

  現在把這兩個時間相減 ((UI displayed) - (icon tapped)); 得到app從點擊到繪製就緒的所有時間。雖然這個時間包含了進程啟動之前的時間,但是至少它可以用於跟其他app比較。

Android冷啟動時間最佳化

     冷啟動時間是指當使用者點擊你的app那一刻到系統調用Activity.onCreate()之間的時間段。在這個時間段內,WindowManager會先載入app主題樣式中的windowBackground做為app的預覽元素,然後再真正去載入activity的layout布局

冷啟動時間最佳化

  知道了Android冷啟動時間的原理之後,就可以通過一些小技巧來對冷啟動時間進行最佳化,從而讓你app載入變得”快“一些(視覺體驗上的快)。我們可製作一個啟動Activity的背景樣式的.9圖片,然後把這個.9圖片做為windowBackground。

  

  圖片製作好之後,我們就可以用它做為app冷啟動階段的預覽元素,如下設定:

①為啟動的Activity自訂一個Theme

<style name="AppTheme.Launcher">    <item name="android:windowBackground">@drawable/window_background_statusbar_toolbar_tab</item></style>

②將新的Theme應用到設定到AndroidManifest.xml

<activity    android:name=".MainActivity"    android:theme="@style/AppTheme.Launcher">      <intent-filter>        <action android:name="android.intent.action.MAIN" />        <category android:name="android.intent.category.LAUNCHER" />    </intent-filter></activity>

③由於給MainActivity設定了一個新的Theme,這樣做會覆蓋原來的Theme,所以在MainActivity中需要設定回原來的Theme

public class MainActivity extends AppCompatActivity {     @Override    protected void onCreate(Bundle savedInstanceState) {         // Make sure this line comes before calling super.onCreate().        setTheme(R.style.AppTheme);         super.onCreate(savedInstanceState);    }}

 

android 效能最佳化 -- 啟動過程 冷啟動 暖開機

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.