[譯] 經過 Play Cloud 的 ART 優化配置提高應用性能

在 Android Pie 中,咱們在 Play Cloud 中推出了 ART 優化配置,這是一項新的優化特性,它大大提升了新安裝或更新應用後的啓動時間。平均而言,在不一樣設備上,咱們觀測到應用啓動時間減小了 15%(冷啓動)。一些明星案例甚至減小了 30% 以上。這其中最重要的一點是用戶能夠無償使用該特性,而無需用戶或開發者的任何額外操做!html

來源:Google 內部數據

Play Cloud 的 ART 優化配置

該特性創建在由 Android 7.0 Nougat 引入的 Profile Guided Optimization(PGO)基礎之上。PGO 容許 Android Runtime 經過構建應用中熱門代碼的配置,並集中優化配置來提高應用性能。這能夠帶來巨大的改進,同時減小徹底編譯的應用在傳統內存及存儲上的影響。然而,它依賴於設備在空閒維護模式下根據這些代碼配置來優化應用,這意味着用戶可能須要幾天時間才能看到這些好處 — 這是咱們旨在改進的。前端

來源:Google 內部數據

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

這個想法依賴於兩個關鍵的觀測結果:ios

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

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

在設備上代碼配置做爲種子,在安裝時實現有效的配置來引導優化。這些優化有助於改善冷啓動時間以及穩定性能狀態,全部這些都無需 app 開發者編寫任何代碼。github

第一步:構建代碼配置

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

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

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

來自 Google 應用的平均數據,來源:Google 內部數據

第二步:安裝代碼配置

在 Android 9.0 Pie 中,咱們引入了一種新型安裝工件:dex 元數據文件。相似於 APK,dex 元數據文件是常規的存檔文件,它包含如何優化 APK 的數據 — 就像在 cloud 中構建的代碼核心配置同樣。它們之間一個關鍵的區別是 dex 元數據僅由平臺和應用商店管理,而且對開發者來講是不直接可見。佈局

還有對 App Bundles / Google Play 動態分發的內建支持:無需任何開發者干預,全部應用的功能拆分都通過優化。

第三步:使用代碼配置來優化性能

要搞明白這些代碼配置究竟如何實現更好的性能,咱們須要查看它們的結構。代碼配置包含如下信息:

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

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

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

    • 這樣作的好處是應用的執行能夠節省週期,由於它無需再次執行,從而能夠縮短啓動時間。
  • 代碼預編譯:咱們預先編譯全部熱門代碼。當應用執行時,代碼中最重要的部分已通過優化,可在本地直接執行。應用無需再等待 JIT 編譯器啓動。

    • 這樣作的好處是代碼被映射爲乾淨的內存(與 JIT 的髒內存相比較),這提升了總體的內存的效率。內存壓力下內核能夠釋放乾淨的內存,而髒內存則不能被釋放,這減小了內核殺死應用的可能性。
  • 更高效的 dex 佈局:咱們根據配置拋出的方法信息從新組織 dex 字節碼。dex 字節碼佈局以下所示:[啓動代碼、啓動後的代碼、其他非配置代碼]。

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

改進和統計

咱們在去年年末向 Playstore 上的全部應用推出了 Play Cloud 的配置。

  • 已超過 30,000 個應用有所改進

  • 平均而言,冷啓動在各類設備上的速度提升了 15%

    • 許多排名靠前的應用在所選設備上得到了 20%+(好比 Youtube)甚至 30%(好比 Google 搜索)的提高。
  • 在 Android Pie 上安裝的應用中有 90% 以上得到了優化

  • 額外優化的安裝時間幾乎沒有增長

  • 適用於全部 Pie 設備。

一個很是有趣的觀測結果是,平均而言,ART 優化了大約 20% 的應用方法(若是咱們計算代碼的實際大小,則更少)。而對於另外一些應用,配置僅佔代碼量的 2%,而對於某些應用,該數字則高達 60%。

來源:Google 內部數據

爲何這是一個十分重要的統計?這意味着 Runtime 沒有看到太多的應用代碼,所以沒有對代碼進行優化。雖然有不少代碼不會被執行的例子(好比錯誤處理或向後兼容性代碼),但這也多是因爲未使用的功能或沒必要要的代碼所形成的。傾斜分佈是一個強烈的信號,它代表後者能夠在進一步優化中發揮重要做用(好比經過刪除不須要的 dex 字節碼來減小 APK 大小)。

將來發展

咱們爲 ART 優化配置所帶來的改進感到興奮,咱們將會在將來更多地發展這一律念。構建每一個應用的代碼配置爲更多應用改進提供了機會。開發者可使用數據,以根據(功能與)終端用戶的相關性及重要性來改進應用。使用配置中收集到的信息,能夠從新組織或修剪代碼,以提升效率。開發者可使用 App Bundle,根據其使用狀況來拆分功能,並避免向用戶發送沒必要要的代碼。咱們已經看到應用啓動時間的巨大改進,並但願看到配置所帶來的其餘額外好處,使開發者的生活更加輕鬆,同時爲咱們的用戶提供更好的體驗。

若是發現譯文存在錯誤或其餘須要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可得到相應獎勵積分。文章開頭的 本文永久連接 即爲本文在 GitHub 上的 MarkDown 連接。


掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 AndroidiOS前端後端區塊鏈產品設計人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章
相關標籤/搜索