assemble_vintf: accept --kernel for manifests.
Add KernelInfo to HalManifest object.
The final verified_assembled_vendor_manifest.xml will contain
<kernel> information for compatibility check during OTA.
Bug: 111125947
Test: build verified_assembled_vendor_manifest.xml
Change-Id: If5a3124b6cbed4da9b2038c30274c223ee52b259
diff --git a/parse_xml.cpp b/parse_xml.cpp
index 6498012..fee7ba6 100644
--- a/parse_xml.cpp
+++ b/parse_xml.cpp
@@ -331,6 +331,18 @@
}
template <typename T>
+ inline bool parseOptionalChild(NodeType* root, const XmlNodeConverter<T>& conv,
+ std::optional<T>* t, std::string* error) const {
+ NodeType* child = getChild(root, conv.elementName());
+ if (child == nullptr) {
+ *t = std::nullopt;
+ return true;
+ }
+ *t = std::make_optional<T>();
+ return conv.deserialize(&**t, child, error);
+ }
+
+ template <typename T>
inline bool parseChildren(NodeType* root, const XmlNodeConverter<T>& conv, std::vector<T>* v,
std::string* error) const {
auto nodes = getChildren(root, conv.elementName());
@@ -928,6 +940,12 @@
if (m.mLevel != Level::UNSPECIFIED) {
this->appendAttr(root, "target-level", m.mLevel);
}
+
+ if (flags.isKernelEnabled()) {
+ if (!!m.kernel()) {
+ appendChild(root, kernelInfoConverter.serialize(*m.kernel(), d, flags));
+ }
+ }
} else if (m.mType == SchemaType::FRAMEWORK) {
if (flags.isVndkEnabled()) {
#pragma clang diagnostic push
@@ -973,6 +991,10 @@
error)) {
return false;
}
+
+ if (!parseOptionalChild(root, kernelInfoConverter, &object->device.mKernel, error)) {
+ return false;
+ }
} else if (object->mType == SchemaType::FRAMEWORK) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"