本文主要是介绍Android A/B System - Generate OTA Package,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- Makefile
- ota_from_target_files.py
- OTA Package Format
- protobuf
- protobuf是什么?
- 语法
- update_metadata.proto
- Generate Flow
- Generate
- Full OTA Package
- Delta OTA Package
- DeltaReadPartition()
- FragmentOperation()
- SortOperationByDestination(aops)
- MergeOperations()
- AddSourceHash()
- Hash
- Signature
- Reference
Android A/B System系列
- Android A/B System概述
- Android A/B system - bootctrl
- Android A/B system - update_engine
Makefile
先说点无关的,Makefile这个东西还是要耐心点看,不要浮躁。这里推荐一篇适合小白阅读的讲解:
Make 命令教程
另外复杂的逻辑,读起来很绕,可以在Makefile里面把变量打印出来看看:
makefile 打印变量的值
这一节的目标是搞清楚:执行make otapackage
这个命令的时候,发生了什么?
Makefile的路径:build/make/core/Makefile
下面开始分析:
可以看到.PHONY: otapackage
,它依赖于$(INTERNAL_OTA_PACKAGE_TARGET)
。
接下来看$(INTERNAL_OTA_PACKAGE_TARGET)
,先来看它生成的文件名字是什么:
PRODUCT_OUT := $(TARGET_PRODUCT_OUT_ROOT)/$(TARGET_DEVICE)
TARGET_PRODUCT_OUT_ROOT) := $(TARGET_OUT_ROOT)/product
TARGET_OUT_ROOT := $(OUT_DIR)/target
OUT_DIR := out
TARGET_DEVICE := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEVICE)
INTERNAL_PRODUCT := $(call resolve-short-product-name, $(TARGET_PRODUCT))
name = $(TARGET_PRODUCT)-ota-$(FILE_NAME_TAG)
FILE_NAME_TAG := eng.$(USER)
如上是依赖关系,可以在build/make里面搜索到,那么总结起来,最终生成的文件是:
out/target/product/$(TARGET_OUT_ROOT)/$(TARGET_PRODUCT)-ota-eng.$(USER).zip
假设$(TARGET_OUT_ROOT)
为tardis,$USER
为root,那么最终的结果为:
out/target/product/tardis/tardis-ota-eng.root.zip
接下来看$(INTERNAL_OTA_PACKAGE_TARGET)
的依赖关系:
$(BRILLO_UPDATE_PAYLOAD)
(for a/b system,这个之后再讲)$(BUILT_TARGET_FILES_PACKAGE)
$(HOST_OUT)
$(KEY_CERT_PAIR)
/build/core/Makefile
1. $(HOST_OUT)
HOST_OUT := $(HOST_OUT_ROOT)/$(HOST_OS)-$(HOST_PREBUILT_ARCH)
HOST_OUT_ROOT := $(OUT_DIR)/host
HOST_OS := linux
HOST_PREBUILT_ARCH := x86
$(HOST_OUT)
实际为out/host/linux-x86
2. $(KEY_CERT_PAIR)
KEY_CERT_PAIR := $(DEFAULT_KEY_CERT_PAIR)
DEFAULT_KEY_CERT_PAIR := $(DEFAULT_SYSTEM_DEV_CERTIFICATE)
所以,$(KEY_CERT_PAIR)
默认值为build/target/product/security/testkey
3. $(BUILT_TARGET_FILES_PACKAGE)
BUILT_TARGET_FILES_PACKAGE:= $(intermediates)/$(name).zip
intermediates := $(call intermediates-dir-for,PACKAGING,target_files)
intermediates-dir-for是函数,后面的是参数,这句话的意思是寻找out/target/product/$(TARGET_PRODUCT)/obj/
中PACKAGING
类型文件中以target_files
开头的目录。name
前面分析过,name
是$(TARGET_PRODUCT)-ota-eng.$(USER)
假设$(TARGET_OUT_ROOT)
为tardis,$USER
为root,那么name
就是tradis-ota-eng.root
它的作用是生成了最终包的中间包。
Summary
总结来看,make otapackage
这个命令,最终执行的是如下的命令,也就是生成完整包的命令。
./build/tools/releasetools/ota_from_target_files -v \-p out/host/linux-x86 \-k \build/target/product/security/testkey \out/target/product/tardis/obj/PACKAGING/target_files_intermediates/tardis-ota.eng.root.zip \out/target/product/tardis/tardis-ota.eng.root.zip
ota_from_target_files.py
ota_from_target_files.py吃一些参数,我这里列举一些常用的:
-p
:Search for binaries run by this script-i
:Generate an incremental OTA using the given target-files zip as the starting build.-k
:Key to use to sign the package-v
:Show command lines being executed
这些命令的传递关系如图所示:
- ota_from_target_files(WriteABOTAPackageWithBrilloScript())
- brillo_update_payload
- delta_generator(generate_delta_main.cc)
- brillo_update_payload
其中,ota_from_target_file将命令,参数翻译成brillo_update_payload [cmd] [args]
brillo_update_payload包括如下命令:(每个命令后面带参数,有很多,这里不再赘述)
- generate --xxxxx
- hash
- sign
- properities
OTA Package Format
protobuf
protobuf是什么?
xxx.proto文件表示一种结构化的存储方式,它有如下特点:
- smaller
- faster
- simpler
Google 官方解释:Protocol Buffers
语法
For example:
message相当于jave的class,C的struct,message里面开头的变量有三种:
required
:a well-formed message must have exactly one of this field.optional
:a well-formed message can have zero or one of this field (but not more than one
这篇关于Android A/B System - Generate OTA Package的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!