建構 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 檔案 更新 from) 及從新建構的 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 參數中未宣告的子集。 原始設備製造商 (OEM) 可以為 SKU 使用任何組合的 CDD 核准建構參數,同時為這些 SKU 使用單一映像檔。舉例來說,下列 SKU 多種變化版本:

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

許多原始設備製造商 (OEM) 會針對多個 SKU 使用同一張圖片,然後衍生出最終成品 名稱和裝置指紋。這個程序可簡化平台開發程序,讓有少許客製化但產品名稱不同的裝置,能共用常見圖片 (例如 tardistardispro)。

使用動態指紋

指紋是「建構」的已定義串連 參數 ro.product.brandro.product.namero.product.device。指紋 的裝置來自系統分區指紋,並會做為 裝置上所執行圖片 (和位元組) 的專屬識別碼。如要建立動態指紋,請在裝置的 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.build.fingerprintro.boot.product.hardware.sku 系統啟動載入程式屬性 (唯讀)。

更新 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 套件才能安裝 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 中繼資料中反映。