App Thinning

App Thinning可以譯成“應用瘦身”。指的是App store 和操作系統在安裝iOS或者watchOS的 app 的時候通過一些列的優化,盡可能減少安裝包的大小,使得 app 以最小的合適的大小被安裝到你的設備上。而這個過程包括了三個過程:slicing, bitcode, and on-demand resources。

slicing

App Slicing在節省應用所需資源中發揮著最重要的作用。

很多應用需要在不同尺寸的設備上運行,針對這些不同的設備,它們內含不同的獨立資源,而大部分是你的設備不需要的。所以App store會針對不同的設備制作不同的“簡化版App”,當你下載app時候只需要下載不同的“簡化版app”就可以了。

比如用戶使用的是iPhone 5c,它運行的是32位CPU和GPU,并不支持Metal API。但如果用戶下載的是一款最新的通用游戲應用,它的二進制中含有64位代碼,iPad和“3x”iPhone 6 Plus 資源以及Metal API代碼,這些都是你的設備用不上的。它只需要32位代碼,“2x”iPhone尺寸資源以及OpenGL圖形代碼。

Slicing 的主要的工作流程如下:

1、在 Xcode中,選擇好目標設備并且使用 asset catalog 提供多分辨率的圖片資源

只有使用 asset catalog 才能正確使Slicing作用于資源文件

2、在模擬器或者設備上編譯并運行app

3、Xcode 會自動構建針對你運行設備的“簡化版app”,同時也是為了減少編譯時間和進行本地的測試

4、打包app(為了及時發現不同目標設備的配置錯誤,可以在本地為目標設備導出“簡化版app“,測試無誤后再打包)

5、上傳打包好的app到 iTunes connect。App store 將會為上傳的app歸檔創建不同的“簡化版app”。

6、在 iTunes Connect 中, 發布一個預覽版給合格的測試者進行測試

7、測試者通過 TestFlight 下載預覽版。TestFlight 會自動根據測試者的設備下載合適的“簡化版app”。

Bitcode (iOS, watchOS)

Bitcode是一個編譯好的程序的中間表示形式。上傳到 iTunes Connect 中的包含Bitcode的app 將會在 App store 中進行鏈接和編譯。蘋果會對包含Bitcode的二進制app進行二次優化,而不需要提交一個新的app版本到app store中。

On-Demand Resources (iOS)

ODR(on-demand resources 隨需應變資源)是iOS減少應用資源消耗的另外一種方法。比如多級游戲,用戶需要的通常都是他們當前的級數以及下一級。ODR意味著用戶可以下載他們需要的幾級游戲。隨著你的級數不斷增加,應用再下載其他級數,并將用戶成功過關的級數刪掉。

當用戶點擊應用內容的時候,就會動態從App Store上進行下載,也就是說用戶只會在需要的時候占用存儲空間。這項功能有趣之處還在于當將這些內容在后臺進行下載之后,當存儲空間緊張的時候會自動進行刪除。

On-Demand Resources可以是除了可執行代碼外的任意類型。

在開發過程中,你可以通過分配一個或多個tag來識別On-Demand Resources。你可以使用tag的別名來確定什么時候將它加載到你的App中。

下圖展示了一個在App中保持最小資源占用的例子

可以給資源設置優先級,比如當App從Appstore安裝后就立即加載。

**On-Demand Resources的生命周期**

1、App向操作系統請求資源。操作系統將請求發送給包含所有所需資源的asset packs。

2、asset packs檢查請求的資源本地是否存在。如果存在,則直接提供App使用。

3、如果請求的資源本地不存在,則它們被保存在App Store。

4、操作系統開始下載本地不存在的資源

5、遠程資源下載完畢

6、當資源下載成功或監測到資源包已經被下載,資源包內存計數將會被+1,并通知App此資源可用。

7、當請求的資源可用,App使用資源標簽對應的資源。

8、操作系統在本地釋放資源標簽

9、操作系統在本地清除資源緩存。當一個緩存資源不與任何請求相關聯時,操作系統會在一定時間后將它釋放掉。

完整的生命周期如下圖所示

實際處理方法

1、iOS9以后Xcode默認開啟On-Demand Resources功能,可以在下圖所示位置進行設置。

2、在App中創建Tags

3、給文件設置tag

4、給圖片設置tag

5、給tag設置加載的優先級

有三種加載優先級

* **Initial install tags.** 資源和App同時下載,在App Store中,App的大小計算已經包含了這部分資源。當沒有NSBundleResourceRequest對象訪問它們時,它們將會從設備上清除。

* **Prefetch tag order.** 在App安裝后開始下載,按照預加載列表中的順序依次下載。

* **Dowloaded only on demand.** 只有在App中發出請求時才會下載。

**資源大小限制**

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容