建構 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 會建構完整的 OTA 套件 (位於 $OUT 中)。產生的 .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 以上版本支援使用單一 OTA 套件,為多部具有不同 SKU 的裝置進行更新。如要這麼做,請將目標裝置設定為使用動態指紋,並更新 OTA 中繼資料 (使用 OTA 工具),在前後條件項目中加入裝置名稱和指紋。

關於 SKU

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

SKU = <product><device><modifierA><modifierB><modifierC>
  • modifierA 是裝置等級 (例如 Pro、 Premium 或 Plus)
  • modifierB 是硬體變體 (例如無線電)
  • modifierC 是指區域,可以是通用區域 (例如 NA、EMEA 或 CHN),也可以是國家/地區或語言專屬區域 (例如 JPN、ENG 或 CHN)

許多原始設備製造商會為多個 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,protardistardispro 裝置的 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 中繼資料中。