應用模組化和懶載入在 Instagram 中的實現
簡評:這是 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
上一篇:四大皆空是什麼意思?