日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

App啟動優化-Android性能優化

瀏覽:25日期:2022-09-27 11:44:42

通常用戶期望app響應和加載速度越快越好。一個啟動速度慢的app很可能會給用戶留下不好的印象,除了導致用戶在應用市場上的打分低之外,很有可能導致致用戶直接卸載。

這篇文章提供了優化app啟動時間的方法。先解釋了app進程啟動的內部流程。然后討論如何優化啟動的性能。最后列出幾個常見的啟動問題和解決方案。

一 啟動內幕

App啟動可能發生在以下三種狀態 之一,每一種都會影響到展現給用戶的時間:冷啟動、熱啟動和溫啟動(翻譯的有點怪,介于冷和熱之間吧)。

冷啟動下,app所做的事情不較多,其它兩種情況,系統只需要將app從后臺切到前臺。建議你在冷啟動的基礎上做優化,這樣也會提升熱啟動和溫啟動的性能。

為了更好地優化app的啟動,了解系統和app層做了什么以及如何相互影響很有必要。

1.1 冷啟動

冷啟動指:在app啟動之前,系統的進程還沒有,直到app啟動創建app的進程。冷啟動會發生在device重啟或者app被殺死的情況下。這種啟動在優化啟動時間上,有更大的挑戰,因為相比其它兩種啟動方式,系統和app有更多的工作需要處理。

冷啟動之前,系統會執行以下三個task:

1、加載并啟動app

2、在app啟動后,立即展示空白的window

3、創建app進程

一旦系統創建了app進程,那么app進程就會執行以下步驟

1、創建app對象

2、啟動main thread

3、創建MainActivity

4、Inflate view

5、布置屏幕

6、進行首次繪制

一旦app進程完成了第一次繪制,系統進程就會用main activity替換已經展示的background window。之后用戶才可以使用app。

下圖展示了系統和app進程互相如何工作的,展示了app啟動時期的幾個重要部分,在創建app和main activity之間,我們可以提升性能問題

App啟動優化-Android性能優化

Application的創建

當應用啟動的時候,空白的window在app第一次完成繪制之前都會存在。在那之后,系統進程才會替換啟動窗口,允許用戶開始和app交互。

如果你復寫了 Application.oncreate() 方法,app啟動的時候,會調用該方法。之后,app會孵化主線程(UI線程),并通過它來創建main activity。

從這之后,系統和app級別的進程將會按照 app lifecycle stages 執行。

Activity的創建

在app進程創建了Activity之后,Activity將會執行以下操作

1、初始化值

2、調用構造函數

3、調用毀掉方法,比如Activity.onCreate()。

通常,onCreate方法會對加載時間有比較大的影響。因為它將執行繁重的工作:加載和填充view,并初始化Activity運行期間需要用的對象。

1.2熱啟動

相對于冷啟動,熱啟動會簡單的多。如果app的所有Activities還存在內存中,那么系統需要做的就是將activity切換到前臺。這樣app會避免進行的對象初始化,布局填充和渲染。

但是,如果一些內存在觸發內存回調方法的時候被回收了,比如onTrimMemory(),那么這些對象就需要重新創建。

熱啟動會和冷啟動有相同的行為。系統也會展示一個空白的window,知道app完成Activity的渲染。

1.3 溫啟動

溫啟動做的工作介于冷熱啟動之間。這里列舉幾種可能被認為是溫啟動的狀態:

1、用戶離開了app,然后重新啟動它。這時進程還在繼續運行,但是Activity被回收了,app需要重新創建activity。

2、系統將你的app回收了,然后用戶重新啟動app。進程和Activity都需要重新啟動,但它們可以從onCreate方法保存的bundle中恢復。

二優化啟動性能

為了確定啟動時間的性能問題,我們需要先確定app啟動花費了多少時間。

2.1 Time to initial display

從4.4(API 19)開始,logcat會輸出帶有Displayed的log。該值代表從app啟動進程到完成Activity第一次繪制的時間。該時間內完成了一下流程:

啟動進程初始化對象創建和初始化Activity填充布局第一次繪制app

打出的log如下:

ActivityManager: Displayed com.android.myexample/.StartupTiming: +3s534ms

如果你從命令行或者終端跟蹤log的話,可以比較直接的定位到該log。如果在AndroidStudio中,別忘記關閉filter。

App啟動優化-Android性能優化

Displayed值并沒有捕獲所有資源都被加載和展示的總時間。那些不在layout文件中或者創建app初始化所需要對象的時間不包含在內。因為這些資源是在一個內部進程中加載的,并且不會阻塞app的初始化展示。

2.2 Time to full display

你可以調用 reportFullyDrawn() )方法去測量從應用啟動到所有資源和view層級都被繪制出來的時間。這對于app執行懶加載的情況很有用。在懶加載中,app不會阻塞window的初始化繪制,但同步進行資源加載和view的更新會阻塞。

由于懶加載,app的初始化展示不會包含所有的資源。你可以考慮完全加載并展示所有資源和view的時候作為一個考量。比如,UI可能完全加載了,包括一些text的繪制,但是由于圖片需要從網絡獲取,這時還沒有展示。

為了處理這種情況,你可以手動地調用reportFullyDrawn方法讓系統知道你的activity已經通過懶加載完成了。但你是用該方法的時候,logcat展示的時間就包含從應用被創建到reportFullyDrawn方法被調用的時間。

定位瓶頸

兩種方式可以幫助你定位問題:AndroidStudio中的Method Tracer和內嵌tracing代碼的方式。更多可以參考 documentation .

如果無法使用Method Tracer Tool ,或者覺得trace的時機不夠準確,那么你可以通過在app和Activity的onCreate方法中嵌入代碼進行追蹤,比如寫下追蹤代碼。更多信息,可以參考 Trace 、Systrace

三常見的問題3.1 繁重的App初始化

當你繼承了Application對象,又在Application對象進行初始化的時候執行繁重的工作或者復雜的邏輯,那么就可能導致啟動的性能問題。在啟動的時候花一些時間去初始化一些子類可能完全沒必要。

在app初始化的時候,其它的挑戰包括垃圾回收事件,繁重的操作,比如I/O,都有可能會阻塞進程的初始化。對于Dalvik運行環境來說,垃圾回收是一個需要特別考慮的點,Art運行環境會并發的執行垃圾回收,以便最小化垃圾回收產生的影響。

3.1.1定位為題

使用method tracing或者內嵌代碼來定位這個問題

Method tracing

Running the Method Tracer tool reveals that the callApplicationOnCreate() method eventually calls your com.example.customApplication.onCreate method. If the tool shows that these methods are taking a long time to finish executing, you should explore further to see what work is occurring there.

內嵌代碼的方式

可以對以下代碼進行追蹤

1、App的onCreate方法

2、onCreate中初始化的所有全局單例對象

3、所有I/O,反序列化,或者可能導致性能問題的循環

3.1.2 解決方案

如果是由于不必要的初始化或者硬盤I/O操作導致的問題,解決方案就是懶初始化對象:只初始化立即需要的。而不是在一開始就創建全局的靜態對象,可以將它們的初始化放在一個單例中,當app首次訪問它們的時候再初始化對象。

3.2繁重的Activity初始化

Activity的創建有時會承擔大量的復雜操作。通常這里存在可以優化的點。常見的問題有:

1、填充大量復雜的布局

2、硬盤操作或者網絡操作阻塞了繪制

3、加載或者編碼bitmap

4、柵欄化VectorDrawable對象

5、Activity中其它子系統的初始化

3.2.1定位問題

和定位App啟動問題類似,也是通過method tracing或者嵌入代碼來定位。

Method tracing

當執行Method Tracer tool的時候,你應該關注繼承于Application的子類的構造函數和onCreate方法。

如果該工具表明代碼中花了很長時間去執行,那么你就應該進一步查看這里的具體操作。

嵌入代碼的方式

追蹤的部分可能是以下代碼塊(和App初始化一樣)

1、App的onCreate方法

2、啟動時初始化的所有全局單例對象

3、所有I/O,反序列化,或者可能導致性能問題的循環

3.2.2 解決方案

上面可能有很多潛在的問題,這列舉兩種通用的問題和解決方案:

view的層級越龐大,app就會花越多的時間去填充它

減少多余的或者嵌套的布局

不填充哪些不需要在啟動時就需要展示的view。可通過ViewStub來實現,在需要的時候再填充

在main thread中做資源的初始化也會減慢啟動速度。可以通過下面來解決

延遲所有的資源初始化或者放在其它線程中去做

允許app先加載和展示view,那些依賴于bitmap或者其它資源之后再去更新

三 主題化的啟動屏幕

我們可以通過主題化app的啟動屏幕來改善啟動體驗。這樣整個app的啟動和接下來的操作會顯得更加連貫。但這樣只是將Activity的慢啟動問題隱藏了。

一種常用的方式實現主題啟動屏幕的方式是使用 windowDisablePreview 主題屬性關閉系統進程在app啟動時繪制的初始化空白屏幕。但是,這種方式會導致更長時間。同樣的,這樣也會迫使用戶等到Activity啟動后才會得到反饋,會讓用戶產生app本身是否有問題的困惑。

解決方案

建議你不應該禁止預覽窗口,你應該遵循 Material Design 標準。使用Activity的windowBackground主題屬性來為啟動的Activity提供一個簡單的drawable。

布局文件

<layer-list xmlns:android='http://schemas.android.com/apk/res/android' android:opacity='opaque'> <!-- The background color, preferably the same as your normal theme --> <item android:drawable='@android:color/white'/> <!-- Your product logo - 144dp color version of your app icon --> <item> <bitmap android:src='http://www.b3g6.com/bcjs/@drawable/product_logo_144dp' android:gravity='center'/> </item> </layer-list>

Manifest file:

<activity ... android:theme='@style/AppTheme.Launcher' />

然后在代碼中將主題切換回app的主題,最簡單的方式是在 super.onCreate() 和 setContentView()方法之前 調用 setTheme(R.style.AppTheme)

public class MyMainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { // Make sure this is before calling super.onCreate setTheme(R.style.Theme_MyApp); super.onCreate(savedInstanceState); // ... }}

來自:http://www.lightskystreet.com/2016/10/15/android-optimize-start/

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩中文首页| 国产精品中文字幕制服诱惑| 国产午夜精品一区在线观看| 国产视频一区免费看| 国产 日韩 欧美 综合 一区| 中文字幕一区日韩精品| 免费精品视频最新在线| 91精品蜜臀一区二区三区在线| 乱一区二区av| 先锋亚洲精品| 日韩在线卡一卡二| 国产婷婷精品| 亚洲一级在线| 亚洲一区二区成人| 午夜宅男久久久| 久久不射网站| 丝袜美腿亚洲一区二区图片| 在线看片不卡| 黄页网站一区| 影音国产精品| 久久久久99| 精品三级久久| 超碰99在线| 桃色一区二区| 日韩大片在线播放| 日韩成人亚洲| 欧美亚洲日本精品| 久久精品91| 久久亚洲专区| 亚洲一区二区动漫| 日韩av不卡在线观看| 日韩在线观看一区二区三区| 蜜臀a∨国产成人精品| 91精品国产自产精品男人的天堂 | 日本亚洲最大的色成网站www| 视频国产精品| 日韩一区精品| 国产欧美三级| 国产精品久久久久av电视剧| 91精品推荐| 夜夜嗨一区二区三区| 丝瓜av网站精品一区二区| 国产私拍福利精品视频二区| 国产精品白丝久久av网站| 欧美黄页在线免费观看| 亚洲午夜黄色| 美女久久一区| 美国三级日本三级久久99| 日韩中文欧美在线| 国产精品多人| 国产夫妻在线| 免费av一区| 国产视频网站一区二区三区| 久久69成人| 91精品国产自产在线观看永久∴ | 久久久久免费| 久久国产日韩| 国产亚洲高清一区| 黑森林国产精品av| 午夜久久久久| 国产午夜精品一区在线观看| 高清一区二区| 女人天堂亚洲aⅴ在线观看| 先锋亚洲精品| 精品一级视频| 欧美 日韩 国产一区二区在线视频 | 久久电影tv| 99香蕉国产精品偷在线观看 | 日本免费久久| 亚洲电影在线一区二区三区| 日韩精品一二三四| 久久www成人_看片免费不卡| 久久精品一区二区国产| 久久久噜噜噜| 天海翼亚洲一区二区三区| 久久99青青| 亚洲国产不卡| 国产精品美女在线观看直播| 国产精品7m凸凹视频分类| 麻豆极品一区二区三区| 久久国产中文字幕| 97久久超碰| 亚洲午夜电影| 久久精品国产福利| 欧美肉体xxxx裸体137大胆| 美国三级日本三级久久99 | 亚洲91精品| 另类欧美日韩国产在线| 欧美特黄视频| 精品久久久网| 另类激情亚洲| 精品亚洲a∨一区二区三区18| 亚洲女同一区| 精品久久久亚洲| 日韩精品一级中文字幕精品视频免费观看 | 风间由美中文字幕在线看视频国产欧美| 欧美日中文字幕| 欧美日韩一区二区国产| 亚洲在线一区| 国产一区国产二区国产三区 | 国产精品午夜av| 亚洲一二av| 136国产福利精品导航网址| 久久国产麻豆精品| 在线亚洲免费| 日韩高清不卡| 国产中文欧美日韩在线| 欧美激情福利| 91成人精品观看| 黄色在线一区| 精品一区欧美| 日韩国产欧美一区二区| 日韩1区2区3区| 国产亚洲精品v| 亚洲精品一区二区妖精| caoporn视频在线| 日韩三级久久| 中文亚洲欧美| 欧美成a人免费观看久久| 精品亚洲a∨一区二区三区18| 日韩欧美2区| 亚洲国产一区二区在线观看| 电影91久久久| 91成人在线精品视频| 久久视频精品| 色综合狠狠操| 国产亚洲一卡2卡3卡4卡新区| 伊人久久一区| 日韩欧美午夜| 精品三级在线| 午夜视频一区二区在线观看| 欧美精品一线| 精品日韩毛片| 久久久久久美女精品| 麻豆久久一区| 精品国产91| 日本午夜精品久久久久| 久久av在线| 亚洲男人在线| 香蕉成人久久| 国产视频一区欧美| 亚洲精选成人| 91国内精品| 久久精品国产福利| 热三久草你在线| 欧美福利一区| 综合激情在线| 国产亚洲久久| 国产成人精品一区二区三区视频 | 韩日一区二区| 神马久久午夜| 美女亚洲一区| 亚洲综合色婷婷在线观看| 欧美日韩a区| 最新中文字幕在线播放| 亚洲高清二区| 综合激情网...| 国产精品久久久久久久久久白浆| 中文字幕一区二区三区四区久久 | 中文字幕在线看片| 不卡一区2区| 天堂va欧美ⅴa亚洲va一国产| 国产精品亚洲四区在线观看| 中文字幕一区久| 99香蕉国产精品偷在线观看| 婷婷五月色综合香五月| 麻豆久久久久久久| 蜜桃成人av| 欧美日韩网址| 香蕉成人av| 亚洲无线观看| 精品一区二区三区在线观看视频| 久久国产精品成人免费观看的软件| 中日韩男男gay无套| 日本成人精品| 蜜桃av在线播放| 亚洲狼人精品一区二区三区| 久久精品女人| 噜噜噜躁狠狠躁狠狠精品视频 | 成人久久一区| 亚洲欧洲美洲国产香蕉| 精品久久电影| 日韩中文字幕麻豆| 国产一区二区色噜噜| 国产精品日韩| 精品国产一区二区三区2021| 视频一区中文| 国产精品久久久久久久久久久久久久久 | 国产91欧美| 免费看欧美美女黄的网站| 加勒比视频一区| 只有精品亚洲| 婷婷激情一区| 国产女人18毛片水真多18精品| 欧美91视频| 欧美激情久久久久久久久久久| 欧美精品自拍| 成人国产精品一区二区网站| 91久久久久| 福利片在线一区二区 |