[轉載]recovery 升級前相容性檢查(Vendor Interface Object)
https://blog.csdn.net/csdn66_2016/article/details/81704720
從android P(9.0)版本開始,我們發現編譯出來的OTA升級了裡面多了一個檔案,compatibility.zip,這個裡面儲存這system與vendor分割槽的一些特性,用來做升級前的相容性檢查。其實從android O開始已經增加了這個功能,但是沒有預設開啟。直到android P上,已經預設開啟了。
解壓compatibility.zip後,內容如下:
我們先從google的官方瞭解下這個功能。
https://source.android.com/devices/architecture/vintf/
Framework(system)和Device(vendor)匹配的框架如下:
Manifest 描述了提供給對方的feature, Matrix 描述了需要對方提供的feature。Manifest 和 Matrix 在OTA升級前會進行匹配檢查,以確保framework和device是相容的。總的來說,manifest是提供端,matrix是需求端。
下面以android P最新的aosp的code為例。
Framework Manifest:
manifest.xml的原始檔由google手動生成,其存在路徑:
system/libhidl/vintfdata/manifest.xml
system/libhidl/vintfdata/manifest_healthd_exclude.xml
至於xml的內容就不貼上來了,可以到對應的目錄去檢視原始檔。manifest.xml的格式可以參考官方文件即可,也不在此詳細講解。
Framework Compatibility Matrix:
Framework compatibility matrix描述的是framework對 device的需求。這個matrix檔案是和Android Framework Image(system.img)關聯的。Framework compatibility matrix的這些需要被device manifest支援。
compatibility matrix原始檔路徑:
hardware/interfaces/compatibility_matrices/compatibility_matrix.1.xml
hardware/interfaces/compatibility_matrices/compatibility_matrix.2.xml
hardware/interfaces/compatibility_matrices/compatibility_matrix.3.xml
hardware/interfaces/compatibility_matrices/compatibility_matrix.empty.xml
hardware/interfaces/compatibility_matrices/compatibility_matrix.legacy.xml
Device Manifest:
由BoardConfig.mk中定義
device/xxxx/xxxx/BoardConfig.mk定義:
DEVICE_MANIFEST_FILE := device/xxxx/xxxx/manifest.xml
原始檔為 device/xxxx/xxxx/manifest.xml
Device Compatibility Matrix:
如果BoardConfig.mk中有定義,則以定義的檔案為原始檔:
#DEVICE_MATRIX_FILE := device/amlogic/common/compatibility_matrix.xml
如果沒有定義,則使用預設的原始檔:
system/libhidl/vintfdata/device_compatibility_matrix.default.xml
如上,我們找到了device manifest,device compatibility matrix,framework manifest,framework compatibility matrix各自對應的原始檔,然後我們通過編譯規則生成最終的xml檔案。
build/make/target/board/Android.mk(定義了Device Manifest生成規則)
-
# Device Manifest
-
ifdef DEVICE_MANIFEST_FILE
-
# $(DEVICE_MANIFEST_FILE) can be a list of files
-
include
$(CLEAR_VARS)
-
LOCAL_MODULE := device_manifest.xml
-
LOCAL_MODULE_STEM := manifest.xml
-
LOCAL_MODULE_CLASS := ETC
-
LOCAL_MODULE_PATH :=
$(TARGET_OUT_VENDOR)/etc/vintf
-
-
GEN := $(local-generated-sources-dir)/manifest.xml
-
$(GEN): PRIVATE_DEVICE_MANIFEST_FILE :=
$(DEVICE_MANIFEST_FILE)
-
$(GEN):
$(DEVICE_MANIFEST_FILE)
$(HOST_OUT_EXECUTABLES)/assemble_vintf
-
BOARD_SEPOLICY_VERS=
$(BOARD_SEPOLICY_VERS) \
-
PRODUCT_ENFORCE_VINTF_MANIFEST=
$(PRODUCT_ENFORCE_VINTF_MANIFEST) \
-
PRODUCT_SHIPPING_API_LEVEL=
$(PRODUCT_SHIPPING_API_LEVEL) \
-
$(HOST_OUT_EXECUTABLES)/assemble_vintf -o
$@ \
-
-i
$(call normalize-path-list,$(PRIVATE_DEVICE_MANIFEST_FILE))
-
-
LOCAL_PREBUILT_MODULE_FILE :=
$(GEN)
-
include
$(BUILD_PREBUILT)
-
BUILT_VENDOR_MANIFEST :=
$(LOCAL_BUILT_MODULE)
-
endif
system/libhidl/vintfdata/Android.mk(定義了Device Compatibility Matrix / Framework Manifest編譯規則)
-
# Device Compatibility Matrix
-
ifdef DEVICE_MATRIX_FILE
-
DEVICE_MATRIX_INPUT_FILE :=
$(DEVICE_MATRIX_FILE)
-
else
-
DEVICE_MATRIX_INPUT_FILE :=
$(LOCAL_PATH)/device_compatibility_matrix.default.xml
-
endif
-
-
include
$(CLEAR_VARS)
-
LOCAL_MODULE := device_compatibility_matrix.xml
-
LOCAL_MODULE_STEM := compatibility_matrix.xml
-
LOCAL_MODULE_CLASS := ETC
-
LOCAL_MODULE_PATH :=
$(TARGET_OUT_VENDOR)/etc/vintf
-
-
GEN := $(local-generated-sources-dir)/compatibility_matrix.xml
-
-
$(GEN): PRIVATE_VINTF_VNDK_VERSION :=
$(VINTF_VNDK_VERSION)
-
$(GEN):
$(DEVICE_MATRIX_INPUT_FILE)
$(HOST_OUT_EXECUTABLES)/assemble_vintf
-
REQUIRED_VNDK_VERSION=
$(PRIVATE_VINTF_VNDK_VERSION) \
-
BOARD_SYSTEMSDK_VERSIONS=
"$(BOARD_SYSTEMSDK_VERSIONS)" \
-
$(HOST_OUT_EXECUTABLES)/assemble_vintf -i
$< -o
$@
-
-
LOCAL_PREBUILT_MODULE_FILE :=
$(GEN)
-
include
$(BUILD_PREBUILT)
-
BUILT_VENDOR_MATRIX :=
$(LOCAL_BUILT_MODULE)
-
-
# Framework Manifest
-
include
$(CLEAR_VARS)
-
LOCAL_MODULE := framework_manifest.xml
-
LOCAL_MODULE_STEM := manifest.xml
-
LOCAL_MODULE_CLASS := ETC
-
LOCAL_MODULE_PATH :=
$(TARGET_OUT)/etc/vintf
-
-
GEN := $(local-generated-sources-dir)/manifest.xml
-
-
$(GEN): PRIVATE_FLAGS :=
-
-
ifeq (
$(PRODUCT_ENFORCE_VINTF_MANIFEST),true)
-
ifdef BUILT_VENDOR_MATRIX
-
$(GEN):
$(BUILT_VENDOR_MATRIX)
-
$(GEN): PRIVATE_FLAGS += -c
"$(BUILT_VENDOR_MATRIX)"
-
endif
-
endif
-
-
$(GEN): PRIVATE_VINTF_VNDK_VERSION :=
$(VINTF_VNDK_VERSION)
-
$(GEN): PRIVATE_FRAMEWORK_MANIFEST_INPUT_FILES :=
$(FRAMEWORK_MANIFEST_INPUT_FILES)
-
$(GEN):
$(FRAMEWORK_MANIFEST_INPUT_FILES)
$(HOST_OUT_EXECUTABLES)/assemble_vintf
-
PROVIDED_VNDK_VERSIONS=
"$(PRIVATE_VINTF_VNDK_VERSION) $(PRODUCT_EXTRA_VNDK_VERSIONS)" \
-
PLATFORM_SYSTEMSDK_VERSIONS=
"$(PLATFORM_SYSTEMSDK_VERSIONS)" \
-
$(HOST_OUT_EXECUTABLES)/assemble_vintf \
-
-i
$(call normalize-path-list,$(PRIVATE_FRAMEWORK_MANIFEST_INPUT_FILES)) \
-
-o
$@
$(PRIVATE_FLAGS)
hardware/interfaces/compatibility_matrices/Android.mk
hardware/interfaces/compatibility_matrices/compatibility_matrix.mk (定義了Framework Compatibility Matrix規則)
# 詳細規則請檢視原始檔,就不貼程式碼了
有了上述原始檔及編譯規則,則可以生成最終的xml檔案了, 具體的呼叫,都是使用了out/host/linux-x86/bin/assemble_vintf工具。
生成的最終的xml對應的分割槽路徑如下:
/system/compatibility_matrix.xml
/system/etc/vintf/manifest.xml
/vendor/etc/vintf/compatibility_matrix.xml
/vendor/etc/vintf/manifest.xml
至此,我們在升級過程,可以從升級包update.zip中獲取manifest與matrix檔案(system_manifest.xml system_matrix.xml vendor_manifest.xml vendor_matrix.xml),然後掛載/system /vendor分割槽,與system/vendor分割槽對應的xml對比校驗,檢查是否符合升級條件。滿足條件,則繼續後面的升級,如果不滿足條件,則終止升級。
具體的程式碼實現,bootable/recovery/install.cpp中
在升級包的完整性校驗完成之後,就進行相容性校驗,最終的實現呼叫的介面是(system/libvintf/VintfObject.cpp):android::vintf::VintfObjectRecovery::CheckCompatibility
參考:
https://www.jianshu.com/p/a9ea323f892c
https://source.android.com/devices/architecture/vintf/
相關文章
- nginx 版本升級 轉載Nginx
- 新Windows相容性不佳使用者升級受阻(轉)Windows
- 老專案升級總結之程式碼相容性檢測
- Brew 升級更新錯誤"Failed to install vendor Ruby."AI
- 檢查oracle的patch的升級情況Oracle
- Python升級和相容性配置Python
- Oracle 12c升級檢查問題分析Oracle
- ORACLE EXADATA升級—從11.2.3.1.0到11.2.3.3.0–(9)升級後的檢查Oracle
- [轉載]Linux/Mac go版本升級LinuxMacGo
- 起飛前檢查
- w10升級相容性未通過怎麼調_w10升級相容性未通過設定方法
- Object.defineProperty() (轉載)Object
- object checkpoint物件檢查點小記Object物件
- 全站HTTPS升級系列(一)升級前的科普工作HTTP
- 轉載:Ubuntu 升級 golang 版本完美步驟UbuntuGolang
- Linux:檢查當前執行級別的五種方法Linux
- w10升級相容性未透過怎麼調_w10升級相容性未透過設定方法
- 升級win10系統時提示相容性檢測未透過如何解決Win10
- 深入淺出檢查點和例項recovery
- Oracle 10.2.0.1 升級到 10.2.0.4--轉載Oracle
- 資料庫的升級和降級[轉載wisdomone1 ]資料庫
- 用DELPHI製作線上程式升級資訊查詢 (轉)
- NPM使用前設定和升級NPM
- oracle upgrade 升級前測試,升級後穩定計劃Oracle
- 保護模式下的特權級檢查 (轉)模式
- 升級到oracle 12c 的相容性矩陣Oracle矩陣
- 資料庫 升級/降級 相容性矩陣 (文件 ID 1577660.1)資料庫矩陣
- 1.4.2. 檢查當前版本號
- 使用 Nuxt Kit 檢查模組與 Nuxt 版本相容性UX
- WatchKit程式設計指南:Interface Object–介面物件程式設計Object物件
- Interface到底繼承於Object嗎?之我見繼承Object
- Object.assign相容性問題Object
- Google擬升級影片搜尋推新影片下載(轉)Go
- 【轉載】檢視當前會話SID的三種方法會話
- Mac怎麼用,寫在升級Mojave前Mac
- 衛生部:取消入學就業體檢中乙肝檢查--轉載就業
- LINUX核心升級 (轉)Linux
- LINUX核心升級(轉)Linux