您當前的位置:首頁 > 曲藝

應用模組化和懶載入在 Instagram 中的實現

作者:由 Hevin 發表于 曲藝時間:2017-11-08

簡評:這是 Instagram Android 團隊分享的 Android 應用模組化和懶載入經驗,並且開源了他們的懶載入庫,連結在文章結尾。: )

隨著 Instagram 的規模和開發人員數量的不斷增加,也導致了不少的問題:

App 體積增大;

冷啟動時間增加;

所佔儲存空間增大;

並且由於應用體積的增加導致構建時間的增長,減慢了開發人員的開發速度。

。。。

為了應對這些問題,Instagram 開始了應用的模組化工作,以求在不同功能間建立起清晰的邊界。這裡就是 Instagram 他們自己分享的如何做應用模組化和懶載入的。

應用模組化

什麼是應用模組化?

模組化,顧名思義就是對程式碼根據業務邏輯進行分離和建立邊界的過程。模組化的一個好處就是能最佳化應用的啟動時間,在模組化之前,從一個功能到另一個功能的引用鏈可能會載入所有的程式碼,現在結合懶載入可以在需要的時候再載入模組。此外,對於構建時間,開發速度等等也有好處。

怎麼模組化?

模組化關鍵的就是考量各個模組所具有的依賴關係。對於每個依賴關係,判斷其是應該刪除還是保留。雖然要具體情況具體分析,但也還是有一些共通的考慮事項:

有沒有辦法將這個依賴重寫為更通用的模組,而不是從特定業務模組中進行引用。

這些依賴所實現的功能一定需要在現在引用嗎?還是說可以推遲到執行具體業務邏輯時再引用。

能否將邏輯簡化到僅限於特定功能模組的範圍內,以便更容易的判斷依賴關係。

當完成了模組化後,該功能的介面就應該只會包含一些關鍵的方法,例如:

生命週期相關的方法;

導航到該功能模組的方法;

。。。

模組的懶載入

什麼是懶載入?

延遲載入能夠將原來一大塊的 dex 檔案根據功能編譯為獨立的 dex 檔案,這能帶來的好處:

能夠在真正需要某個功能時才載入到記憶體中,而不是在每次冷啟動時載入。

如果某些模組一直是未使用狀態,這些程式碼也就不會被解壓縮,因此所佔用的磁碟空間也減少了。

能讓應用更方便的根據不同型別使用者提供不同功能,縮小應用包的大小。

並且,針對開發效率而言,我們增加了對懶載入的熱插拔支援,意味著開發人員能夠在編碼時馬上看到變化,而無需重新啟動應用。

什麼時候觸發懶載入?

一般來說,當我們預計一個模組在不久將來會使用時,就會對其載入。模組的載入因為不同的模組大小可能會有較小的延遲,因此需要採取不同的策略:

如果使用者可能透過點選觸發這個功能模組時,就在後臺預先載入模組。當然,使用者是有可能不點選的,但如果這個模組的點選機率很高,那麼這是一個合適的解決方案。

在使用者已經導航到該模組再進行載入。如果在測試中這個模組大多數時候載入延遲很小(小於 50ms),那麼我們可以簡單的直接等待載入完成。否則,可以顯示一個進度條什麼的,以便讓應用不會被當成卡住了。

還有些模組本身是非同步的,比如影片的載入和播放。對於這樣的模組,懶載入會將其載入到輔助程序。

Instagram 也開源了自己的懶載入庫 - Instagram/ig-lazy-module-loader ,感興趣的同學可以看看。

原文:App modularization and module lazy loading at Instagram and beyond

日報擴充套件閱讀:

Android 實現顏色漸變的一個小 tip

標簽: 載入  模組  模組化  Instagram  應用