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 {
};
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));
#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;
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;
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;
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),
#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");
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");
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");
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");
#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");
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");
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");