assemble_vintf: add --no-kernel-requirements option

When specified, <config> under <kernel> will not be written to the
output matrix, and kernel minor revision will be set to zero.
These requirements are added in P but is verified against the running
kernel (instead of the incoming kernel). This incorrect behavior
in recovery forces us to drop these requirements during OTA.

These requirements are still checked by VTS.

Bug: 111840577
Test: libvintf_test
Change-Id: Id0d7851f5cc11fbd8e6e2928ce377769855445db
diff --git a/parse_xml.cpp b/parse_xml.cpp
index fbac04e..7947fc3 100644
--- a/parse_xml.cpp
+++ b/parse_xml.cpp
@@ -601,12 +601,23 @@
 
 struct MatrixKernelConverter : public XmlNodeConverter<MatrixKernel> {
     std::string elementName() const override { return "kernel"; }
-    void mutateNode(const MatrixKernel &kernel, NodeType *root, DocType *d) const override {
-        appendAttr(root, "version", kernel.mMinLts);
+    void mutateNode(const MatrixKernel& kernel, NodeType* root, DocType* d) const override {
+        mutateNode(kernel, root, d, SerializeFlag::EVERYTHING);
+    }
+    void mutateNode(const MatrixKernel& kernel, NodeType* root, DocType* d,
+                    SerializeFlags flags) const override {
+        KernelVersion kv = kernel.mMinLts;
+        if (flags & SerializeFlag::NO_KERNEL_MINOR_REVISION) {
+            kv.minorRev = 0u;
+        }
+        appendAttr(root, "version", kv);
+
         if (!kernel.mConditions.empty()) {
             appendChild(root, matrixKernelConditionsConverter(kernel.mConditions, d));
         }
-        appendChildren(root, kernelConfigConverter, kernel.mConfigs, d);
+        if (!(flags & SerializeFlag::NO_KERNEL_CONFIGS)) {
+            appendChildren(root, kernelConfigConverter, kernel.mConfigs, d);
+        }
     }
     bool buildObject(MatrixKernel* object, NodeType* root, std::string* error) const override {
         if (!parseAttr(root, "version", &object->mMinLts, error) ||
@@ -1023,7 +1034,7 @@
         }
         if (m.mType == SchemaType::FRAMEWORK) {
             if (!(flags & SerializeFlag::NO_KERNEL)) {
-                appendChildren(root, matrixKernelConverter, m.framework.mKernels, d);
+                appendChildren(root, matrixKernelConverter, m.framework.mKernels, d, flags);
             }
             if (!(flags & SerializeFlag::NO_SEPOLICY)) {
                 if (!(m.framework.mSepolicy == Sepolicy{})) {