建構 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 或更高版本支援對具有不同 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是區域,可以是通用區域(例如 NA、EMEA 或 CHN),也可以是特定於國家或語言的區域(例如 JPN、ENG 或 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.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.*屬性被 import 語句覆蓋時可能的運行時指紋。該檔案需要每行一個屬性,其中每行具有以下格式: 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 元資料中。