經過ART 提升Android App 性能


Android Pie中,咱們android

推出了
,這
是一項新的優化功能,可在新安裝或更新後大大縮短應用程序啓動時間。平均而言,咱們觀察到應用程序在各類設備上的啓動速度提升了 15%(冷啓動)。一些英雄案例甚至顯示 30%+更快的啓動時間。其中一個最重要的方面是用戶能夠免費得到此功能,無需他們的支持或開發人員的努力!

ART優化Play Cloud中的配置文件

該功能創建在先前的Profile Guided Optimization(PGO)工做的基礎上,該工做是在Android 7.0 Nougat中引入的。PGO容許Android Runtime經過構建應用程序最重要的熱門代碼的配置文件並將其優化工做集中在其上來幫助提升應用程序的性能。這能夠帶來巨大的改進,同時減小徹底編譯的應用程序的傳統內存和存儲影響。可是,它依賴於設備在空閒維護模式下根據這些代碼配置文件優化應用程序,這意味着它可能在用戶看到好處以前幾天 - 咱們的目標是改進。性能優化


Play Cloud中的ART優化配置文件
利用Android Play的強大功能,在安裝/更新時帶來全部PGO優點:大多數用戶無需等待便可得到出色的性能!

這個想法依賴於兩個關鍵的觀察:架構

  1. 應用程序一般在衆多用戶和設備之間具備許多經常使用的代碼路徑(熱代碼),例如在啓動或關鍵用戶路徑期間使用的類。這一般能夠經過聚合幾百個數據點來發現。
  2. 應用程序開發人員一般會逐步推出他們的應用程序,從alpha / beta渠道開始,而後擴展到更普遍的受衆。即便沒有alpha / beta設置,用戶也經常會增長到新版本的應用。

這意味着咱們可使用應用程序的初始部署來爲其他用戶引導性能。ART分析應用程序代碼的哪些部分值得在初始設備上進行優化,而後將數據上傳到Play Cloud,後者將構建核心聚合代碼配置文件(包含與全部設備相關的信息)。一旦有足夠的信息,代碼配置文件就會發布並與應用程序的APK一塊兒安裝。app

在設備上,代碼配置文件充當種子,在安裝時實現有效的配置文件引導優化。這些優化有助於改善冷啓動時間和穩定狀態性能,全部這些都不須要app開發人員編寫單行代碼。ide

第1步:構建代碼配置文件

其中一個主要目標是儘量快地從聚合和匿名數據中構建高質量,穩定的代碼配置文件(以最大限度地增長能夠受益的用戶數量),同時確保咱們有足夠的數據來準確優化應用程序的性能。採樣過多的數據會在安裝時佔用更多帶寬和時間。此外,咱們構建代碼配置文件的時間越長,得到好處的用戶就越少。採樣過少的數據,代碼配置文件將沒有足夠的信息來肯定適當優化的內容,以便產生影響。佈局

聚合的結果就是咱們所說的核心代碼配置文件,它只包含有關每一個設備隨機會話樣本中常常出現的代碼的匿名數據。咱們刪除異常值以確保咱們專一於對大多數用戶而言重要的代碼。性能

實驗代表,能夠在很短的時間內很是快速地計算出最經常使用的代碼路徑。這意味着咱們可以以足夠快的速度構建代碼配置文件,以便大多數用戶受益。學習

第2步:安裝代碼配置文件

Android 9.0 Pie中,咱們引入了一種新類型的安裝工件:dex元數據文件。與APK相似,dex元數據文件是常規存檔,其中包含有關如何優化APK的數據 - 例如已在雲中構建的核心代碼配置文件。一個關鍵的區別是dex元數據僅由平臺和應用商店管理,而且不會被開發人員直接看到。優化

還有對App Bundles / Google Play動態交付的內置支持:無需任何開發人員干預,全部應用程序的功能拆分都通過優化。ui

第3步:使用代碼配置文件優化性能

要了解這些代碼配置文件如何實現更好的性能,咱們須要查看它們的結構。代碼配置文件包含如下信息

  • 啓動期間加載的類
  • 運行時認爲值得優化的熱方法
  • 代碼的佈局(例如,在啓動或啓動後執行的代碼)

使用這些信息,咱們使用了各類優化技術,其中如下三項提供了大部分優點:

  • 咱們使用啓動類來構建預先填充的堆,其中類已預先初始化(稱爲應用程序映像)。當應用程序啓動時,咱們將圖像直接映射到內存中,以便全部啓動類均可用。

    • 這樣作的好處是應用程序的執行能夠節省週期,由於它不須要再次執行工做,從而能夠縮短啓動時間。
  • 代碼預編譯:
    咱們預編譯全部熱代碼。當應用程序執行時,代碼中最重要的部分已通過優化,能夠本地執行。該應用程序再也不須要等待JIT編譯器啓動。

  • 好處是代碼被映射爲乾淨的內存(與JIT髒內存相比),這提升了總體內存效率。內存壓力下內核能夠釋放乾淨的內存,而髒內存則不能,減小內核殺死應用程序的可能性。

  • 更高效的dex佈局:
    咱們根據配置文件公開的方法信息從新組織dex字節碼。dex字節碼佈局以下所示:[啓動代碼,發佈啓動代碼,其他非配置代碼]。

    • 這樣作的好處是能夠更高效地將dex字節代碼加載到內存中:內存頁面具備更好的佔用率,而且因爲全部內容都在一塊兒,所以咱們須要減小負載,而且咱們能夠減小I / O.

改進和觀察

咱們在去年年末向Playstore上的全部應用程序推出了雲中的配置文件。

  • 超過30,000個應用程序已經顯示出改進
  • 平均而言,冷啓動在各類設備上的速度提升了15%
    • 許多頂級應用在所選設備上得到20%+(例如Youtube)甚至30%(例如Google搜索)。
  • 在Android Pie獲取配置文件的應用程序安裝量的90%以上
  • 額外優化的安裝時間幾乎沒有增長
  • 適用於全部Pie設備。

一個很是有趣的觀察是,平均而言,ART概述了大約20%的應用方法(若是咱們計算代碼的實際大小,則更少)。對於某些應用程序,配置文件僅佔代碼的2%,而對於某些應用程序,該數字則高達60%。

爲何這是一個重要的觀察?這意味着運行時沒有看到不少應用程序代碼,所以不會投入代碼的優化。雖然有許多有效的用例,其中代碼將不會被執行(例如錯誤處理或向後兼容性代碼),但這也多是因爲未使用的功能或沒必要要的代碼。偏斜分佈是一個強烈的信號,後者能夠在進一步優化中發揮重要做用(例如,經過刪除不須要的dex字節碼來下降APK大小)。

將來發展

咱們對ART優化配置文件所展現的改進感到興奮,而且咱們未來會更多地發展這一律念。構建每一個應用程序的代碼配置文件爲更多應用程序改進提供了機會。開發人員可使用數據根據最終用戶的相關性和重要性來改進應用。使用「我的檔案」中收集的信息,能夠從新組織或修剪代碼,以提升效率。開發人員可使用App Bundle根據其使用狀況拆分其功能,並避免向用戶發送沒必要要的代碼。咱們已經看到應用啓動時間的巨大改進,並但願看到配置文件帶來的額外好處,使開發人員的生活更輕鬆,同時爲咱們的用戶提供更好的體驗。

經過ART來提升Android APP性能只是Android性能優化學習的其中一小點,關於Android開發的學習,在這我分享一份大綱,有須要的朋友能夠點擊查看 騰訊T3Android高級技術腦圖  加入咱們 【騰訊@Android高級架構】
相關文章
相關標籤/搜索