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"