建構 OTA 套件

您可以使用 build/make/tools/releasetools 中提供的 ota_from_target_files 工具,為使用 A/B 系統更新非 A/B 系統更新的裝置建構完整版漸進式 OTA 套件。這項工具會將 Android 建構系統產生的 target-files.zip 檔案做為輸入。

對於搭載 Android 11 以上版本的裝置,您可以為使用不同 SKU 的多部裝置建構一個 OTA 套件。為此,您需要將目標裝置設定為使用動態指紋,並更新 OTA 中繼資料,在先決條件和後置條件項目中加入裝置名稱和指紋。

Android 8.0 已淘汰非 A/B 裝置的檔案型 OTA 套件,這類套件必須改用區塊式 OTA 套件。如要產生區塊式 OTA 套件或搭載 Android 7.x 以下版本的裝置,請將 --block 選項傳遞至 ota_from_target_files 參數。

建構完整更新內容

「完整」更新是 OTA 套件,內含裝置的完整最終狀態 (系統、啟動和復原分區)。只要裝置能夠接收和套用套件,無論裝置目前狀態為何,套件都能安裝版本。舉例來說,下列指令會使用發布工具為 tardis 裝置建構 target-files.zip 封存。

. build/envsetup.sh && lunch tardis-eng
mkdir dist_output
make dist DIST_DIR=dist_output

make dist 會在 $OUT 中建構完整的 OTA 套件。最終的 .zip 檔案包含為 tardis 裝置建構 OTA 套件所需的一切項目。您也可以建構 ota_from_target_files 做為 Python 二進位檔,然後將其呼叫以建構完整或漸進式套件。

ota_from_target_files dist_output/tardis-target_files.zip ota_update.zip

ota_from_target_files 路徑會在 $PATH 中設定,而產生的 Python 二進位檔位於 out/ 目錄中。

ota_update.zip 已準備好傳送至測試裝置 (所有內容都會使用測試金鑰簽署)。如果是使用者裝置,請產生並使用您的私密金鑰,詳情請參閱「簽署要發布的版本」。

建構漸進式更新

「漸進式」更新是 OTA 套件,包含裝置上現有資料的二進位修補程式。漸進式更新的套件通常較少,因為這類套件不需要包含未變更的檔案。此外,由於變更的檔案通常與先前版本非常相似,因此套件只需要包含兩個檔案之間差異的編碼。

您只能在具有建構套件的來源版本的裝置上安裝漸進式更新套件。如要建構漸進式更新,您需要上一個版本 (來源要更新的檔案) 的 target_files.zip 檔案,以及新建構作業的 target_files.zip 檔案。舉例來說,下列指令會使用發布工具為 tardis 裝置建構漸進式更新。

ota_from_target_files -i PREVIOUS-tardis-target_files.zip dist_output/tardis-target_files.zip incremental_ota_update.zip

這個版本與先前的版本非常類似,增量更新套件 (incremental_ota_update.zip) 遠小於對應完整更新檔 (約 1 MB,而非 60 MB)。

只將漸進式套件發布到執行與漸進式套件起點完全相同的裝置。您必須將 PREVIOUS-tardis-target_files.zipPREVIOUS-tardis-img.zip 中的映像檔刷新 (使用 make dist 建構的映像檔,以使用 fastboot update) 刷新,而非使用 PRODUCT_OUT 目錄中的映像檔 (使用 make 建構,使用 fastboot flashall 更新)。嘗試在有其他版本的裝置上安裝漸進式套件會導致安裝錯誤。當安裝失敗時,裝置會保持相同的工作狀態 (執行舊系統);套件會在輕觸檔案之前驗證所有檔案的先前狀態,以免裝置在半升級狀態下分流。

為提供最佳使用者體驗,每 3 到 4 次增量更新都提供一次完整更新。這有助於使用者掌握最新版本,並避免長時間安裝逐步增量更新。

為多個 SKU 建構 OTA 套件

Android 11 以上版本支援針對擁有不同 SKU 的多部裝置使用單一 OTA 套件。要這麼做,必須將目標裝置設定為使用動態指紋,並更新 OTA 中繼資料 (使用 OTA 工具),在先決條件和事後條件項目中加入裝置名稱和指紋。

關於 SKU

SKU 格式是合併建構參數值的變化版本,通常是目前 build_fingerprint 參數中未宣告的子集。原始設備製造商 (OEM) 可以在 SKU 中使用任何 CDD 核准的建構參數組合,並為這些 SKU 使用單一映像檔。舉例來說,以下 SKU 有多個變化版本:

SKU = <product><device><modifierA><modifierB><modifierC>
  • modifierA 是裝置層級 (例如 Pro、Premium 或 Plus)
  • modifierB 是硬體變化版本 (例如無線電)
  • modifierC 是區域,可以是一般區域 (例如北美洲、歐洲、中東和非洲地區或瑞士),或是特定國家/地區或特定語言 (例如 JPN、ENG 或 CHN)

許多 OEM 會使用單一映像檔用於多個 SKU,然後在裝置啟動後,在執行階段衍生最終產品名稱和裝置指紋。這個程序可簡化平台開發程序,讓進行小幅自訂但產品名稱不同的裝置可以共用相同的映像檔 (例如 tardistardispro)。

使用動態指紋

指紋是建構參數 (例如 ro.product.brandro.product.namero.product.device) 的定義串連。裝置的指紋衍生自系統分區指紋,並會做為裝置上執行映像檔 (和位元組) 的專屬 ID。如要建立「動態」指紋,請使用裝置 build.prop 檔案中的動態邏輯在裝置開機時取得系統啟動載入程式變數的值,然後使用該資料為該裝置建立動態指紋。

例如,如要在 tardistardispro 裝置上使用動態指紋,請更新下列檔案,如下所示。

  • 更新 odm/etc/build_std.prop 檔案,加入下列內容。

    ro.odm.product.device=tardis
    
  • 更新 odm/etc/build_pro.prop 檔案,加入下列內容。

    ro.odm.product.device=tardispro
    
  • 更新 odm/etc/build.prop 檔案,加入下列幾行內容。

    ro.odm.product.device=tardis
    import /odm/etc/build_${ro.boot.product.hardware.sku}.prop
    

這些行會根據 ro.boot.product.hardware.sku 系統啟動載入程式屬性的值 (唯讀),動態設定裝置名稱、指紋和 ro.build.fingerprint 值。

更新 OTA 套件中繼資料

OTA 套件包含說明套件的中繼資料檔案 (META-INF/com/android/metadata),包括 OTA 套件的先決條件和張貼條件。舉例來說,以下程式碼是指定 tardis 裝置的 OTA 套件中繼資料檔案。

post-build=google/tardis/tardis:11/RP1A.200521.001/6516341:userdebug/dev-keys
post-build-incremental=6516341
post-sdk-level=30
post-security-patch-level=2020-07-05
post-timestamp=1590026334
pre-build=google/tardis/tardis:11/RP1A.200519.002.A1/6515794:userdebug/dev-keys
pre-build-incremental=6515794
pre-device=tardis

pre-devicepre-build-incrementalpre-build 值會定義裝置在 OTA 套件安裝前須具備的狀態。post-build-incrementalpost-build 值會定義裝置在 OTA 套件安裝後預期會發生的狀態。pre-post- 欄位的值衍生自下列對應的建構屬性。

  • pre-device 值衍生自 ro.product.device 建構屬性。
  • pre-build-incrementalpost-build-incremental 值衍生自 ro.build.version.incremental 建構屬性。
  • pre-buildpost-build 值衍生自 ro.build.fingerprint 建構屬性。

在搭載 Android 11 以上版本的裝置上,您可以使用 OTA 工具中的 --boot_variable_file 旗標指定檔案路徑,該檔案包含建立裝置動態指紋時使用的執行階段變數值。然後資料會用於更新 OTA 中繼資料,在 pre-post- 條件中加入裝置名稱和指紋 (使用直立線字元 | 做為分隔符號)。--boot_variable_file 旗標具有下列語法和說明。

  • 語法:--boot_variable_file <path>
  • 說明:指定檔案的路徑,且包含 ro.boot.* 的可能值。當匯入陳述式覆寫某些 ro.product.* 屬性時,可用來計算可能的執行階段指紋。在這個檔案中,每一行都應包含一個屬性,其中每一行的格式如下:prop_name=value1,value2

例如,當屬性為 ro.boot.product.hardware.sku=std,pro 時,tardistardispro 裝置的 OTA 中繼資料如下所示。

post-build=google/tardis/tardis:11/<suffix>|google/tardis/tardispro:11/<suffix>
pre-build=google/tardis/tardis:11/<suffix>|google/tardis/tardispro:11/<suffix>
pre-device=tardis|tardispro

如要在搭載 Android 10 的裝置上支援這項功能,請參閱參考實作。此變更清單會有條件剖析 build.prop 檔案中的 import 陳述式,讓系統在最終 OTA 中繼資料內識別屬性覆寫設定,並反映該覆寫值。