卓盟科技: 動態資源加載技術背後的兼容性升級 | Android 開發者故事

在遊戲變得日益複雜的今天,一根加載進度條再也不僅僅只是開啓冒險的倒計時,更是鏈接玩家與開發者的信使。android

玩家們老是但願遊戲能立刻加載完畢,這意味着 "加載" 這件事情自己也有輕重緩急: 遊戲開始幾分鐘內會被用到的資源須要打包進 APK,其餘的內容則等玩家啓動遊戲後在後臺下載。ide

運營老是但願遊戲裏有數不清的新花樣,這意味着 "變化" 這件事情自己成爲了 "常態": 不一樣的節日須要不一樣的開屏和主題風格,甚至連遊戲的觀感都要讓玩家以爲 "啊,原來今天也是重要的一天呢"。性能

卓盟科技的樂變遊戲分包服務,經過在遊戲加載及運行時動態下載並插入新資源,來幫助遊戲開發者知足玩家的需求。測試

網易的《流星羣俠傳》、龍淵的《多多自走棋》、紫龍的《夢幻模擬戰》、遊族的《少年三國志2》……等諸多廠商的遊戲,帶給玩家們的體驗也各不相同。但它們有一個共同點: 都使用卓盟科技的樂變遊戲分包服務來動態加載資源。google

甚至就連卓盟科技本身,也須要藉助動態加載資源來爲自家 SDK 的用戶們——也就是遊戲廠商——提供更好的開發體驗。好比讓 SDK 的集成儘可能簡單,以及在須要調整 SDK 內部資源的時候提供快捷修復,無需開發者們更新 SDK。spa

在 Android 11 提供 ResourcesLoader 接口以前,卓盟科技打造動態資源加載的過程並不輕鬆。rest

舊版解決方案

當卓盟科技開始構建其產品時,Android 並無公開接口支持動態資源加載的用例。團隊盡了最大的努力,最終使用了非公開接口添加外部資源。雖然這個實現知足了技術需求,但其實很是脆弱——它依賴於非公開接口,這些接口的兼容性保證遠遠低於官方公開 SDK,而且隨時可能在沒有提早通知的狀況下被更改或刪除。code

卓盟科技發現,隨着每次 Android 新版本的發佈,兼容性問題會意外出現。這些都須要進行額外的測試和開發,以確保產品的穩定性。通過屢次迭代團隊一共花費了 6 個工程師*月和大量的代碼將其解決方案穩定下來,同時理解它可能還會在下一個 Android 版本中再出問題。隨着 Android 嚴格 限制非公開接口 以提高應用的穩定性和兼容性,卓盟科技須要移除對那些非公開接口的依賴。blog

可持續的解決方案

隨着 Android 系統團隊愈來愈專一於幫助應用遷移到公開接口的工做,卓盟科技看到了完全解決兼容性問題的曙光。他們聯繫了 Android 團隊來提供反饋,說明他們的具體用例和對公開接口的詳細需求。接口

在雙方的屢次溝通和持續協做下,Android 11 中首次發佈了支持動態資源加載的公開接口。卓盟科技已經遷移至新的 ResourcesLoader 接口,並得到了生產率和產品質量的大幅提高。卓盟科技認爲 ResourcesLoader 接口具備如下優點:

  • 使用簡單。 開發團隊兩天內便完成了從現有方案至新方案的切換及測試。
  • 性能無損。 和直接將資源內置在包內相比並沒有下降 (某些場景下甚至有提升,由於包內的部分資源是壓縮的,而經過 ResourcesLoader 添加進去的資源是非壓縮的)。
  • 開發高效。 之前的方案須要高級工程師先去了解 AssetManager 的原理,找到對應的私有接口及其在各個系統版本上的實現細節;同時須要掌握 zip 文件結構等和 Android 開發無關的技術細節。而使用新的公開接口後,一個能看懂文檔的初級工程師便可輕鬆應對。
  • 維護簡單。 以前的方案爲了兼容各類狀況,累計代碼行數超過 1,000 行,而新的方案代碼僅幾行便可!
  • 向前兼容。 經過使用 Android 官方支持的公開接口,開發者的解決方案將在將來的 Android 平臺上具備更好的兼容性。
String sdkroot = getApplicationInfo().dataDir + "/lebian";
ResourcesLoader rl = new ResourcesLoader();
rl.addProvider(ResourcesProvider.loadFromDirectory(sdkroot, null));
Resources res = getResources();
res.addLoaders(rl);
final AssetManager assetManager = res.getAssets();

△ 使用 ResourcesLoader API 以後,核心代碼只需幾行

性能提高

卓盟科技以 16,028 個文件 (總大小 1.47GB,壓縮後爲 1.36GB) 爲例,使用四種加載方案進行測試:

  • 直接從 APK 中讀取
  • 使用某些私有接口加載目錄後讀取
  • 使用 ResourcesLoader 接口加載 APK 後讀取
  • 使用 ResourcesLoader 接口加載目錄後讀取

前三種方案都對資源文件進行了壓縮,平均加載時間都在 19 秒左右;而方案四經過 ResourcesLoader 加載目錄後直接讀取未壓縮的資源,平均加載時間僅爲 3 秒左右,性能提升了 6 倍!

卓盟科技首席執行官兼產品負責人黃杲總結了這套新接口的做用: "新的 ResourcesLoader 接口大大下降了開發和維護成本,使咱們可以更加專一於產品和業務創新。"

共執畫筆,共繪良圖

△ 卓盟科技團隊

△ 卓盟科技團隊

"依靠 Android 平臺,咱們開發了一些有價值的產品和服務,這些產品也支撐着咱們持續在 Android 平臺投入更多的資源去開發更多創新的產品。" 卓盟科技表示,"但願能有更多的機會參與到 Android 生態的建設中,貢獻咱們的綿薄之力,讓 Android 對消費者更易用,對開發者更輕鬆。"

卓盟科技致力於提高其解決方案的長期兼容性。遷移至 ResourcesLoader 公開接口提高了穩定性和運行性能、簡化了代碼複雜性、下降了將來 Android 系統上的兼容性風險。更爲重要的是,因爲 ResourcesLoader 是 Android 11 中的公開接口,整個 Android 開發者社區均可以利用它來得到收益。

Android 團隊一如既往地重視開發者的反饋和創造力。動態資源加載接口的誕生,與開發者的支持與合做密不可分。咱們也期待更多的開發者和卓盟科技同樣,在 Android 生態中揮灑創意、創造價值、收穫成功,同時也幫助 Android 成爲開發者和用戶們的絕佳平臺!

相關文章
相關標籤/搜索