OSDN Git Service

Generate vendor stuff only if vndk is avilable
authorJooyung Han <jooyung@google.com>
Tue, 11 Feb 2020 23:43:31 +0000 (08:43 +0900)
committerJooyung Han <jooyung@google.com>
Wed, 12 Feb 2020 07:09:28 +0000 (16:09 +0900)
Linkerconfig runs even when there is no apexes available. When vndk apex
is not available, having vendor section or namespaces requiring vndk
libraries is meaningless.

This is necessary because we'd like to load some variables from vndk
apex, but relying on those variables when vndk apex is not available may
fail to generate linker configuration.

Bug: 145184886
Test: build / flash / boot
Change-Id: I7c77757254a63c8bc7470c4ae87f2db3779e6465

contents/configuration/baseconfig.cc
contents/context/context.cc
contents/include/linkerconfig/context.h
contents/section/system.cc
contents/tests/backward_compatibility/default_test.cc
contents/tests/backward_compatibility/vndklite_test.cc

index f35d265..41b2731 100644 (file)
@@ -22,14 +22,22 @@ using android::linkerconfig::modules::DirToSection;
 using android::linkerconfig::modules::Section;
 
 namespace {
-void redirect_section(std::vector<DirToSection>& dirToSection,
-                      const std::string& from, const std::string& to) {
-  for (auto& [key, val] : dirToSection) {
-    if (val == from) {
-      val = to;
+void RedirectSection(std::vector<DirToSection>& dir_to_section,
+                     const std::string& from, const std::string& to) {
+  for (auto& [dir, section] : dir_to_section) {
+    if (section == from) {
+      section = to;
     }
   }
 }
+void RemoveSection(std::vector<DirToSection>& dir_to_section,
+                   const std::string& to_be_removed) {
+  dir_to_section.erase(
+      std::remove_if(dir_to_section.begin(),
+                     dir_to_section.end(),
+                     [&](auto pair) { return (pair.second == to_be_removed); }),
+      dir_to_section.end());
+}
 }  // namespace
 
 namespace android {
@@ -82,12 +90,17 @@ android::linkerconfig::modules::Configuration CreateBaseConfiguration(
   };
 
   sections.emplace_back(BuildSystemSection(ctx));
-  sections.emplace_back(BuildVendorSection(ctx));
-  if (android::linkerconfig::modules::IsProductVndkVersionDefined() &&
-      !android::linkerconfig::modules::IsVndkLiteDevice()) {
-    sections.emplace_back(BuildProductSection(ctx));
+  if (ctx.IsVndkAvailable()) {
+    sections.emplace_back(BuildVendorSection(ctx));
+    if (android::linkerconfig::modules::IsProductVndkVersionDefined() &&
+        !android::linkerconfig::modules::IsVndkLiteDevice()) {
+      sections.emplace_back(BuildProductSection(ctx));
+    } else {
+      RedirectSection(dirToSection, "product", "system");
+    }
   } else {
-    redirect_section(dirToSection, "product", "system");
+    RemoveSection(dirToSection, "product");
+    RemoveSection(dirToSection, "vendor");
   }
 
   sections.emplace_back(BuildUnrestrictedSection(ctx));
index ede1cd4..38ffd2f 100644 (file)
 
 #include "linkerconfig/context.h"
 
+#include <android-base/strings.h>
+
 #include "linkerconfig/log.h"
 #include "linkerconfig/namespacebuilder.h"
 #include "linkerconfig/variables.h"
 
+using android::base::StartsWith;
 using android::linkerconfig::modules::ApexInfo;
 using android::linkerconfig::modules::Namespace;
 
@@ -74,6 +77,15 @@ void Context::SetCurrentLinkerConfigType(LinkerConfigType config_type) {
   current_linkerconfig_type_ = config_type;
 }
 
+bool Context::IsVndkAvailable() const {
+  for (auto& apex : GetApexModules()) {
+    if (StartsWith(apex.name, "com.android.vndk.")) {
+      return true;
+    }
+  }
+  return false;
+}
+
 void Context::RegisterApexNamespaceBuilder(const std::string& name,
                                            ApexNamespaceBuilder builder) {
   builders_[name] = builder;
index abd953c..02b1d96 100644 (file)
@@ -64,6 +64,9 @@ class Context : public modules::BaseContext {
   void SetCurrentSection(SectionType value);
   void SetCurrentLinkerConfigType(LinkerConfigType value);
 
+  // Returns true if vndk apex is available
+  bool IsVndkAvailable() const;
+
   // Returns the namespace that covers /system/${LIB}.
   std::string GetSystemNamespaceName() const;
 
index bb47364..9321abd 100644 (file)
@@ -33,10 +33,11 @@ Section BuildSystemSection(Context& ctx) {
   std::vector<Namespace> namespaces;
 
   namespaces.emplace_back(BuildSystemDefaultNamespace(ctx));
-  namespaces.emplace_back(BuildSphalNamespace(ctx));
-  namespaces.emplace_back(BuildRsNamespace(ctx));
-  namespaces.emplace_back(BuildVndkNamespace(ctx));
-
+  if (ctx.IsVndkAvailable()) {
+    namespaces.emplace_back(BuildSphalNamespace(ctx));
+    namespaces.emplace_back(BuildRsNamespace(ctx));
+    namespaces.emplace_back(BuildVndkNamespace(ctx));
+  }
   return BuildSection(ctx,
                       "system",
                       std::move(namespaces),
index 3c9ec29..3bb95fc 100644 (file)
 
 #include <gtest/gtest.h>
 
+#include "linkerconfig/apex.h"
 #include "linkerconfig/baseconfig.h"
 #include "linkerconfig/variables.h"
 #include "testbase.h"
 
 using android::linkerconfig::contents::Context;
+using android::linkerconfig::modules::ApexInfo;
 using android::linkerconfig::modules::AsanPath;
 
-TEST(linkerconfig_default_backward_compatibility, common_system_section) {
-  MockVariables();
-
+struct linkerconfig_default_backward_compatibility : ::testing::Test {
+  void SetUp() override {
+    MockVariables("Q");
+    ApexInfo vndk_apex;
+    vndk_apex.name = "com.android.vndk.vQ";
+    ctx.AddApexModule(vndk_apex);
+  }
   Context ctx;
+};
+
+TEST_F(linkerconfig_default_backward_compatibility, common_system_section) {
   auto config = android::linkerconfig::contents::CreateBaseConfiguration(ctx);
 
   auto system_section = config.GetSection("system");
@@ -108,10 +117,7 @@ TEST(linkerconfig_default_backward_compatibility, common_system_section) {
                                                     AsanPath::WITH_DATA_ASAN));
 }
 
-TEST(linkerconfig_default_backward_compatibility, common_vendor_section) {
-  MockVariables();
-
-  Context ctx;
+TEST_F(linkerconfig_default_backward_compatibility, common_vendor_section) {
   auto config = android::linkerconfig::contents::CreateBaseConfiguration(ctx);
 
   auto vendor_section = config.GetSection("vendor");
@@ -144,10 +150,8 @@ TEST(linkerconfig_default_backward_compatibility, common_vendor_section) {
                                                  AsanPath::WITH_DATA_ASAN));
 }
 
-TEST(linkerconfig_default_backward_compatibility, common_unrestricted_section) {
-  MockVariables();
-
-  Context ctx;
+TEST_F(linkerconfig_default_backward_compatibility,
+       common_unrestricted_section) {
   auto config = android::linkerconfig::contents::CreateBaseConfiguration(ctx);
 
   auto unrestricted_section = config.GetSection("unrestricted");
@@ -162,11 +166,9 @@ TEST(linkerconfig_default_backward_compatibility, common_unrestricted_section) {
                                                     AsanPath::WITH_DATA_ASAN));
 }
 
-TEST(linkerconfig_default_backward_compatibility, vndk_27) {
-  MockVariables();
+TEST_F(linkerconfig_default_backward_compatibility, vndk_27) {
   android::linkerconfig::modules::Variables::AddValue("ro.vndk.version", "27");
 
-  Context ctx;
   auto config = android::linkerconfig::contents::CreateBaseConfiguration(ctx);
 
   auto vendor_section = config.GetSection("vendor");
index 6e113c3..2d665c3 100644 (file)
 
 #include <gtest/gtest.h>
 
+#include "linkerconfig/apex.h"
 #include "linkerconfig/baseconfig.h"
 #include "linkerconfig/variables.h"
 #include "testbase.h"
 
 using android::linkerconfig::contents::Context;
+using android::linkerconfig::modules::ApexInfo;
 using android::linkerconfig::modules::AsanPath;
 
-TEST(linkerconfig_vndklite_backward_compatibility, system_section) {
-  MockVariables();
-  MockVnkdLite();
-
+struct linkerconfig_vndklite_backward_compatibility : ::testing::Test {
+  void SetUp() override {
+    MockVariables();
+    MockVnkdLite();
+    ApexInfo vndk_apex;
+    vndk_apex.name = "com.android.vndk.vQ";
+    ctx.AddApexModule(vndk_apex);
+  }
   Context ctx;
+};
+
+TEST_F(linkerconfig_vndklite_backward_compatibility, system_section) {
   auto config = android::linkerconfig::contents::CreateBaseConfiguration(ctx);
 
   auto system_section = config.GetSection("system");
@@ -95,11 +104,7 @@ TEST(linkerconfig_vndklite_backward_compatibility, system_section) {
                                                     AsanPath::WITH_DATA_ASAN));
 }
 
-TEST(linkerconfig_vndklite_backward_compatibility, vendor_section) {
-  MockVariables();
-  MockVnkdLite();
-
-  Context ctx;
+TEST_F(linkerconfig_vndklite_backward_compatibility, vendor_section) {
   auto config = android::linkerconfig::contents::CreateBaseConfiguration(ctx);
 
   auto vendor_section = config.GetSection("vendor");
@@ -122,11 +127,7 @@ TEST(linkerconfig_vndklite_backward_compatibility, vendor_section) {
                                                     AsanPath::WITH_DATA_ASAN));
 }
 
-TEST(linkerconfig_vndklite_backward_compatibility, unrestricted_section) {
-  MockVariables();
-  MockVnkdLite();
-
-  Context ctx;
+TEST_F(linkerconfig_vndklite_backward_compatibility, unrestricted_section) {
   auto config = android::linkerconfig::contents::CreateBaseConfiguration(ctx);
 
   auto unrestricted_section = config.GetSection("unrestricted");