2016年1月3日 星期日

利用資源分割優化iOS包裝大小


POVILAS KANAPICKAS 原文

App分割(App Slicing)是iOS9.0和tvOS開始加入的一個新功能,主要為了減小主要App包的大小。開發者可以根據不同蘋果設備上傳不同的版本的包到App Store, 只有符合使用者設備的版本才會被下載。

App分割在iOS平台上很有用,因為這將幫助開發者包入更多的資源(Asset)到主要的包內還能不超過100MB。要達到這個目的,你當然也可以採用我們之前介紹的動態載入資源(On-demand Resource)方法。但就代表產品必須連著網路隨時動態下載所需資源,不是很方便做法也需要一些技術。App分割沒有這些問題。

App分割可分為兩類:可執行程式的分割和資源的分割。前者分割後會移除執行檔中不需要的可執行程式。App Store對於所有iOS/tvOS 9.0及以上版本的App會自動執行這動作。而後者會移除不需要的資源,開發者需要設定些東西來達成這個功能,本文將會說明如何實現。

資源分割的主要目標是解決相同資源各種不同形式的使用下減少浪費空間和頻寬,頻繁的重複利用資源是很常發生的,各種不同新舊程度的iOS設備也仍在廣泛使用中,它們硬體版本之間存在許多效能的差異。所以開發者常會因為要在不同設備表現最佳品質需要使用不同的資源(例如:不同解析度的圖片),好照顧到不同效能的設備。在iOS 9.0之前,資源需要包含在主App包中,這既浪費設備空間也浪費頻寬,因為最後只會用到所有資源的一部分。透過App資源分割,用不到的資源都能被排除在外。

資源分割最簡單的方法就是透過Asset Bundle,這是最有效也最簡單的方案。Asset Bundle是Unity內建的功能,效能和載入一般普通檔案的效能沒差別。Asset Bundle也能用於剛剛提到動態載入資源的後端,所以對一個已經使用了動態載入的App要額外幫App瘦身就很方便,反之亦然。當Asset Bundle設定完成後,基本不需要做額外修改就能讓App資源分割。本篇文章不會說明如何使用Asset Bundle,如果你有興趣可以參考這裡

要使用應用資源分割,開發者必須先指定哪些設備要使用哪些資源,然後在App啟動時載入這些資源,在iOS App開發設定,你需要先在資源目錄裡建立資料集(Data Set)或圖像集(Image Set),設定裝置變數然後指定包含哪些資源。在Unity裡,你需要設定Asset Bundle變數(即多個含有相同資源集的不同包裝)。並在程式中用UnityEditor.iOS.BuildPipeline.collectResources 來註冊所有參與App資源分割的資源包。然後在Player Settings中指定設備要求。最後在App啟動時使用AssetBundle.CreateFromFile 手動載入資源包。


下面兩段範例說明App資源分割的做法:
註冊要使用App資源分割的資源(編輯器腳本)

using UnityEditor.iOS;
#if ENABLE_IOS_APP_SLICING
public class BuildResources
{
 [InitializeOnLoadMethod]
 static void SetupResourcesBuild()
 {
   UnityEditor.iOS.BuildPipeline.collectResources += CollectResources;
 }
 static UnityEditor.iOS.Resource[] CollectResources()
 {
  return new Resource[] {
    new Resource("asset-bundle-name").BindVariant("path/to/asset-bundle.hd"), "hd")
                                     .BindVariant("path/to/asset-bundle.md"), "md")
                                     .BindVariant("path/to/asset-bundle.sd"), "sd"),
  };
 }
在啟動時載入資源包
< ...>
var bundle = AssetBundle.LoadFromFile("res://asset-bundle-name");

// now use AssetBundle APIs to load assets
// or Application.LoadLevel to load scenes

var asset = bundle.LoadAsset("Asset");
< ...>

簡單入門Asset Bundle和App分割的方法就是研究Asset Bundle 範例。我們已經放在BitBucket讓開發者下載,裡面也有詳細描述如何使用這些Demo。

沒有留言:

張貼留言

著作人