中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

android性能優化之啟動過程的示例分析

發布時間:2021-09-15 16:21:18 來源:億速云 閱讀:148 作者:小新 欄目:移動開發

小編給大家分享一下android性能優化之啟動過程的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

一、應用的啟動方式

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

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性能優化之啟動過程的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永城市| 文水县| 玉龙| 美姑县| 海丰县| 铜川市| 通江县| 金沙县| 济源市| 泰顺县| 深泽县| 海南省| 二连浩特市| 铜山县| 元阳县| 军事| 沂源县| 环江| 永城市| 丰顺县| 乌苏市| 榆树市| 遂昌县| 兰溪市| 泉州市| 获嘉县| 临沭县| 宁国市| 石台县| 高碑店市| 舞阳县| 铅山县| 天镇县| 斗六市| 宾川县| 石门县| 肇东市| 太白县| 阳高县| 南华县| 阿合奇县|