6月9日結束的蘋果WWDC15大會上,蘋果公司推出了多個新技術,不過對於手游開發者們來說,可能最具有革命意義的是庫克在發布會現場都沒有提到的應用瘦身功能(App Thinning),它是其Xcode 7測試版的功能之一。
按照蘋果官方的解釋,應用瘦身功能分為三個部分:首先是分割功能Slicing,它可以對應用/游戲內容進行分割,根據用戶設備類型和屏幕分辨率的不同分發定制化下載包,開發者只需要把完整應用包的內容上傳到iTunes Connect即可。
另外,該功能還包含了中間代碼功能(Bitcode),可以讓蘋果在未來為你的應用進行再次優化,而避免了發布新版本的麻煩,同時可以大大減少調試工作量。
應用瘦身的第三個功能就是on-demand資源,開發者可以把應用初始化用不到的資源分類打包上傳到App Store,在用戶使用的時候系統會根據資源標簽在必要的時候調用資源,當某些資源不再使用的時候會被系統自動清除,這樣不僅減少了應用下載和加載時間,還大大縮小了安裝包體。
對於開發者們來說,這個功能可以減少很多的bug調試時間,讓游戲包體變得更小,提高各種設備用戶的游戲體驗。可以說,蘋果的這個技術在很大程度上解決了不同設備的性能差異問題,實現了one-for-all的需求。不過Gamelook認為這個功能如果安卓渠道可以用的話,就會大大降低設備碎片化給開發者們帶來的適配難題,拉近和iOS設備之間的差距。
以下請看Gamelook整理的應用瘦身功能以及On-demand資源內容的詳細介紹(更多詳細內容請參考官網英文地址):
第一部分:應用瘦身以及其功能
App Store和操作系統(iOS和watchOS)根據用戶特定的設備能力量身優化應用安裝,以達到最低的設備空間占用。這個優化的過程,就被成為應用瘦身,它可以讓你創作的應用利用大多數的設備功能、占用最小的磁盤空間並且為蘋果公司未來的更新進行調整。更快的下載速度和更少的空間占用可以帶來更好的用戶體驗。
本章節描述的是應用瘦身的3大組件:應用分割(Slicing)、中間代碼(Bitcode)和On-demand資源(Resources)。
應用分割功能(Slicing,僅針對iOS平台)
Slicing就是創造並傳輸為不同目標設備而設計的變體應用包(variant,以下簡稱定制化下載包)的處理過程。一個定制化下載包僅包含針對特定設備所需要的可執行架構以及資源。你可以繼續開發並且把完整版本的應用上傳到iTunes Connect,然後App Store會根據玩家設備類型和分辨率創造並傳輸對應的應用。這裡,你可以認為資源根據玩家設備分辨率和類型的不同而分割成了多種類型,GPU資源也根據設備能力進行了切分,當用戶安裝應用的時候,他們可以下載並安裝適合自己設備的定制化應用包。
Xcode會在研發過程中模擬分割,所以你可以在本地創作並測試定制應用包,當你在一個設備上研發並運行應用的時候,Xcode會對其進行分割,當你創造一個檔案的時候,Xcode會包含完整版的應用,但允許你從檔案中輸出不同的定制應用包。
提醒:對於iOS應用來說,應用分割僅支持最新版本的iTunes,以及運行iOS 9.0或者更高系統的設備,否則的話,App Store將會為用戶分發統一的安裝包。
分割功能流程圖
應用分割是在研發過程和分銷過程中進行的,基本處理程序如下:
1.在Xcode裡,定位目標設備並在資源目錄中提供多種分辨率圖形,你必須使用資源目錄這樣才能進行分割。
2.在模擬器或者一個設備上研發並運行應用。
3.Xcode會為選定設備類型生成變體包,提高調試銷量並允許你在本地設備進行變體包測試。
4.創建應用檔案並為特定設備輸出對應的變體應用包。
5.在目標設備測試所有的變體包以更早的發現硬件配置方面的問題。
6.把應用上傳到iTunes Connect。
7.App Store從檔案中創建單獨的應用定制包,定制包的數量取決於Xcode項目中所存在的架構和資源的數量。
8.在iTunes Connect當中,向制定測試者們分發測試版的應用。
9.測試者們通過TestFlight在你的應用所支持的設備上安裝測試版本,TestFlight會根據用戶設備的不同而下載特定的變體應用包。
注意:為了測試App Store在應用發布之前為你創造的變體包,最好是只邀請內部測試者(你團隊裡的iTunes Connect用戶)並且使用TestFlight下載變體包。如果邀請了外部測試者(比如只通過郵箱地址登錄),那麼他們就必須等待Beta App Review在他們下載變體包之前通過了你的應用。
10.然後在iTunes Connect裡發布你的應用。
11.用戶在應用支持的設備上進行安裝,App Store應用下載會根據用戶設備類型分發變體應用包。
中間代碼功能(Bitcode ,適用於iOS和watchOS)
Bitcode是一個已編譯程序(Compiled Program)的中間代碼(intermediate representation)。如果你上傳到iTunes Connect裡的應用包含bitcode的話,就可以被編譯和鏈接到App Store。加入Bitcode可以讓蘋果在未來對你的應用二進制(app binary)進行再次優化,而不需要你向App Store提交新版本。
注意:對於iOS應用來說,Bitcode是默認但可選擇的。如果你提供Bitcode,那麼應用包裡的所有應用和框架都需要加入Bitcode,而watchOS應用則必須加入Bitcode。
On-Demand資源(適用於iOS系統)
On-Demand資源指的是你可以通過關鍵詞和命令的方式進行分組歸類的資源,比如圖像和音頻,App Store會把這些資源放在蘋果服務器上並且為你管理下載。On-Demand資源可以加快下載速度並縮小應用包體,提高用戶的首次登錄體驗。比如,一款游戲應用可以根據等級和任務的不同把資源分組,在玩家達到下一個等級或者完成一個任務之後才會用到後續的資源,同樣,應用也可以只在用戶進行IAP購買的時候提供對應的資源。
當一些on-demand資源不再需要而且磁盤空間較少的時候,操作系統會自動清除它們。如果你在App Store之外對自己的應用進行測試或者分發,那就需要你自己來管理這些On-Demand資源。需要注意的是,可執行的on-demand資源是不支持的,App Store也會對on-Demand資源進行分割(即上面說過的Slicing),進一步提高用戶體驗。
對於用戶們來說,on-demand資源是以透明的形式在後台運作的,當用戶需要對應功能的時候,這些資源就會被提供。
第二部分:什麼是On-Demand資源
提示:這是一個正在研發的API或技術的概要文件,蘋果公司提供這些信息主要是為了幫助你通過蘋果產品使用這些技術或者編程界面而做好計劃,該信息有可能會在未來發生改變,本文當中提到的軟件應該以最終發布的操作系統測試和最終文檔為准,未來有可能會提供新版本的文檔信息。
On-Demand資源指的是寄存在App Store並與應用下載包分離的應用內容,使用On-demand資源可以讓應用包體更小,安裝時間更短。
本部分文檔主要是提供你的應用使用on-demand資源所需要的信息。在閱讀本文檔之前,你首先應該熟悉資源編程,想要獲得更多信息,請參考資源編程指南。
On-Demand資源是有生命周期的
On-Demand資源可以讓應用包體更小,下載速度更快,應用內容更豐富,主要是通過在App Store存儲資源的方式實現,與你的應用包體是分開的。
蘋果操作系統會根據你的應用請求而管理on-demand資源的下載和存儲,基本運作流程如下:應用請求資源-使用資源-然後釋放請求。被下載之後,這些資源會通過多次登錄而留存在用戶設備上,讓應用體驗更快。
On-Demand資源是默認自動開啟的,前提是你的項目支持對應的OS版本。
標簽主要用於辨識和對on-demand資源進行分組。
在研發過程中,標簽用於辨識和分組on-demand資源,標簽名字可以用於辨識資源和應用的關系。Xcode會提供創造和管理標簽的工具,同時在應用被安裝之後或者安裝完成之後指定特殊標簽。
在運行期間,應用負責管理標簽。
應用請求會通過操作系統獲得標簽,然後系統會下載並檢查組件資源並且下載所有不存在於用戶設備上的所需資源。在此過程中,應用可以追蹤下載過程,如果有必要還可以調整優先級。
標簽被使用完之後,在從存儲中移除標簽的時候,應用可以設定一個系統預留優先級,優先級較低的標簽會首先被清除。
在與系統互動的時候會用到2個classes:NsbundleResourceRequest用來管理標簽的使用、追蹤下載並調整下載優先級;NSBundle的一個擴展class被用來設定標簽的預留優先級。
On-demand資源可以是多種類型,但可執行代碼除外。
有關資源的一些信息
在電腦程序中,資源指的是和程序的可執行代碼同時存在的數據文件。有了資源文件,你的代碼就可以極大的簡化,不必通過創造復雜的數據或者圖形設置寫復雜的代碼。比如,和用代碼按像素形式來創造圖像不同的是,在圖形編輯器中創造資源可以更加有效率和實用。為了充分利用資源的優勢,你的代碼只需要在運行的時候加載並使用即可。
除了簡化你的代碼之外,資源還是所有應用國際化管理非常重要的一部分。你在應用裡不需要編寫字符串並以及其他用戶可見的內容,你可以把這些內容放在外部的資源文件裡,這樣本地化應用的時候就變得非常簡單,你只需要為每一種所支持的語言創造新版本的資源文件即可。OS X和iOS也使用了這樣方式管理本地化資源,根據用戶的偏好語言加載需要的資源文件。
本文件提供有關OS X和iOS系統支持的資源類型信息以及你如何在寫代碼的時候使用這些資源的指導。本文件並不針對資源創作過程,大多數的資源都是通過第三方或者開發者自己的工具提供,另外,盡管本文的講述的是應用中的資源使用,但這些信息同樣適用於其它類型的可執行包,包括框架和插件。
在閱讀本文檔之前,你需要熟悉應用包體的組織結構,理解這個結構可以讓管理變得更容易,並且尋找你的應用所需要使用的資源也更為便捷。
應用可以包含很多類型的資源,但有些資源是由iOS和OS X直接支持的。
Nib文件存儲你的應用的UI對象
Nib文件是用來創作iOS和Mac應用的經典文件類型,一個nib文件就是你希望在運行期間重新創作的一系列freeze-dried對象數據檔案。Nib文件通常用於存儲預置的窗口、視圖以及其他可視化對象,但是也可以用來存儲非可視化對象,比如controllers。
你可以在Xcode中通過Interface Builder編輯Nib文件,它可以提供一個i額圖形編輯器來管理對象。當你隨後把一個nib文件加載到應用中的時候,nib加載代碼會實例化文件中的每一個對象,並且會把它重新存儲於你在Interface Builder中所定義的state中。這樣,你在Interface Builder中看到的就和應用運行中所看到的內容一致了。
字符串資源包含可本地化的文本。
在iOS和Mac應用中,圖像、音頻和影響資源的重要性很高,圖像可以用來創造獨特的視覺風格,音頻和影像文件同樣可以強化整體的用戶應用體驗,同時可以簡化代碼。兩種操作系統都支持加載並在應用中呈現這些資源。
哪些應用適合使用On-Demand資源功能?
On-Demand資源指的是和應用下載包分離並且存在App Store上的應用內容,應用請求一系列的on-demand資源,操作系統管理下載和存儲。可以使用on-demand資源獲得優勢的應用包擴:
1.初始化資源延遲加載的應用,這些應用的一些資源屬於應用的主要功能,但在初次登錄的時候卻用不到,資源會被標記為需要初始化,當應用運行的時候,操作系統會自動下載這些資源,比如圖形編輯應用。
2.應用資源需要延遲加載的應用:這類應用只在特定情況下使用一些資源,比如在一個帶有很多關卡的游戲中,只有玩家們進入特定的關卡才需要使用對應的資源。
3.需要遠程存儲低使用率資源的應用:這類應用的有些資源使用率非常低,只有在需要的時候才加載這部分資源。比如有些應用的新手教程資源只有在第一次打開應用的時候才會用到,以後可能再也不會用到,後來的一些功能教學也只是用到的時候才加載,隨後再也不使用。
4.需要遠程存儲IAP資源的應用:這類應用通過IAP提供額外的資源,這些資源只有在用戶購買的時候才會被用到,比如,一個用戶購買SuperGeeky表情包的時候,這個表情資源才會被用到。
5.首次登錄需要加載資源的應用:這類應用有些資源是只需要初次登錄的時候才加載,並且在重復登錄的時候用不到。比如一個只有在首次登錄時才加入教學內容的應用。
在研發過程中,開發者可以為on-demand資源分配一個或者多個標簽,也就是你用來辨識特定資源的字符串,你可以通過標簽的名字來決定對應資源在應用中的使用,比如游戲中第五級采用到的資源可以用與level5相關的標簽。
On-Demand資源的循環周期
帶有標簽的資源使用流程大致如下:
帶標簽的資源被存儲在App Store裡-應用通過標簽請求使用資源-系統下載資源包-保存資源包-使用完成後系統釋放資源包。
存儲大小限制
App Store對於on-demand資源使用是有存儲空間限制的,具體請參考下表。