構建 OTA 包

您可以使用build/make/tools/releasetools releasetools 中提供的ota_from_target_files工具為使用A/B 系統更新或非 A/B 系統更新的設備構建完整和增量 OTA 包。該工具將 Android 構建系統生成的target-files.zip文件作為輸入。

對於運行 Android 11 或更高版本的設備,您可以為具有不同 SKU 的多台設備構建一個 OTA 包。這樣做需要將目標設備配置為使用動態指紋更新 OTA 元數據以在前置條件和後置條件條目中包含設備名稱和指紋。

對於非 A/B 設備,Android 8.0 已棄用基於文件的 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現在可以發送到測試設備(所有內容都使用測試密鑰簽名)。對於用戶設備,生成並使用您自己的私鑰,如Signing builds for release中所述。

構建增量更新

增量更新是一個 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 C 是地區,可以是通用的(例如 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,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 元數據中。