Reland "Device manifest > T must not set kernel level."

Test: libvintf_test
Bug: 188939851
Change-Id: I0fa9badc7cc27ca1ce2f4c2329593d688679177d
diff --git a/AssembleVintf.cpp b/AssembleVintf.cpp
index cf427dc..7b01c8d 100644
--- a/AssembleVintf.cpp
+++ b/AssembleVintf.cpp
@@ -31,6 +31,7 @@
 #include <vintf/KernelConfigParser.h>
 #include <vintf/parse_string.h>
 #include <vintf/parse_xml.h>
+#include "constants-private.h"
 #include "utils.h"
 
 #define BUFFER_SIZE sysconf(_SC_PAGESIZE)
@@ -345,7 +346,19 @@
             std::cerr << error << "\n";
             return false;
         }
+        return true;
+    }
 
+    bool checkDeviceManifestNoKernelLevel(const HalManifest& manifest) {
+        if (manifest.level() != Level::UNSPECIFIED &&
+            manifest.level() >= details::kEnforceDeviceManifestNoKernelLevel &&
+            // Use manifest.kernel()->level() directly because inferredKernelLevel()
+            // reads manifest.level().
+            manifest.kernel().has_value() && manifest.kernel()->level() != Level::UNSPECIFIED) {
+            std::cerr << "Error: Device manifest with level " << manifest.level()
+                      << " must not set kernel level " << manifest.kernel()->level() << std::endl;
+            return false;
+        }
         return true;
     }
 
@@ -387,6 +400,10 @@
             if (!setDeviceManifestKernel(halManifest)) {
                 return false;
             }
+
+            if (!checkDeviceManifestNoKernelLevel(*halManifest)) {
+                return false;
+            }
         }
 
         if (halManifest->mType == SchemaType::FRAMEWORK) {