Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5f1febde authored by android-build-team Robot's avatar android-build-team Robot
Browse files

Snap for 4818534 from 9bd3ee1c to pi-release

Change-Id: Idc9af3a531d434302036e2d1d61e172bd9a7849d
parents 2d48594b 9bd3ee1c
Loading
Loading
Loading
Loading
+5 −2
Original line number Original line Diff line number Diff line
@@ -80,6 +80,7 @@ static const struct fs_path_config android_dirs[] = {
    { 00775, AID_ROOT,         AID_ROOT,         0, "data/preloads" },
    { 00775, AID_ROOT,         AID_ROOT,         0, "data/preloads" },
    { 00771, AID_SYSTEM,       AID_SYSTEM,       0, "data" },
    { 00771, AID_SYSTEM,       AID_SYSTEM,       0, "data" },
    { 00755, AID_ROOT,         AID_SYSTEM,       0, "mnt" },
    { 00755, AID_ROOT,         AID_SYSTEM,       0, "mnt" },
    { 00755, AID_ROOT,         AID_SHELL,        0, "product/bin" },
    { 00750, AID_ROOT,         AID_SHELL,        0, "sbin" },
    { 00750, AID_ROOT,         AID_SHELL,        0, "sbin" },
    { 00777, AID_ROOT,         AID_ROOT,         0, "sdcard" },
    { 00777, AID_ROOT,         AID_ROOT,         0, "sdcard" },
    { 00751, AID_ROOT,         AID_SDCARD_R,     0, "storage" },
    { 00751, AID_ROOT,         AID_SDCARD_R,     0, "storage" },
@@ -195,6 +196,7 @@ static const struct fs_path_config android_files[] = {
    { 00755, AID_ROOT,      AID_ROOT,      0, "bin/*" },
    { 00755, AID_ROOT,      AID_ROOT,      0, "bin/*" },
    { 00640, AID_ROOT,      AID_SHELL,     0, "fstab.*" },
    { 00640, AID_ROOT,      AID_SHELL,     0, "fstab.*" },
    { 00750, AID_ROOT,      AID_SHELL,     0, "init*" },
    { 00750, AID_ROOT,      AID_SHELL,     0, "init*" },
    { 00755, AID_ROOT,      AID_SHELL,     0, "product/bin/*" },
    { 00750, AID_ROOT,      AID_SHELL,     0, "sbin/*" },
    { 00750, AID_ROOT,      AID_SHELL,     0, "sbin/*" },
    { 00755, AID_ROOT,      AID_SHELL,     0, "system/bin/*" },
    { 00755, AID_ROOT,      AID_SHELL,     0, "system/bin/*" },
    { 00755, AID_ROOT,      AID_ROOT,      0, "system/lib/valgrind/*" },
    { 00755, AID_ROOT,      AID_ROOT,      0, "system/lib/valgrind/*" },
@@ -237,9 +239,10 @@ static int fs_config_open(int dir, int which, const char* target_out_path) {
    return fd;
    return fd;
}
}


// if path is "vendor/<stuff>", "oem/<stuff>" or "odm/<stuff>"
// if path is "odm/<stuff>", "oem/<stuff>", "product/<stuff>" or
// "vendor/<stuff>"
static bool is_partition(const char* path, size_t len) {
static bool is_partition(const char* path, size_t len) {
    static const char* partitions[] = {"vendor/", "oem/", "odm/"};
    static const char* partitions[] = {"odm/", "oem/", "product/", "vendor/"};
    for (size_t i = 0; i < (sizeof(partitions) / sizeof(partitions[0])); ++i) {
    for (size_t i = 0; i < (sizeof(partitions) / sizeof(partitions[0])); ++i) {
        size_t plen = strlen(partitions[i]);
        size_t plen = strlen(partitions[i]);
        if (len <= plen) continue;
        if (len <= plen) continue;
+53 −33
Original line number Original line Diff line number Diff line
@@ -46,6 +46,8 @@
                                             "%s:%d: %s CHECK '" #predicate "' failed.",\
                                             "%s:%d: %s CHECK '" #predicate "' failed.",\
                                             __FILE__, __LINE__, __FUNCTION__)
                                             __FILE__, __LINE__, __FUNCTION__)


using namespace std::string_literals;

namespace android {
namespace android {


#if defined(__ANDROID__)
#if defined(__ANDROID__)
@@ -236,10 +238,15 @@ class LibraryNamespaces {
      // Different name is useful for debugging
      // Different name is useful for debugging
      namespace_name = kVendorClassloaderNamespaceName;
      namespace_name = kVendorClassloaderNamespaceName;
      ALOGD("classloader namespace configured for unbundled vendor apk. library_path=%s", library_path.c_str());
      ALOGD("classloader namespace configured for unbundled vendor apk. library_path=%s", library_path.c_str());
    } else if (!oem_public_libraries_.empty()) {
    } else {
      // oem_public_libraries are NOT available to vendor apks, otherwise it
      // oem and product public libraries are NOT available to vendor apks, otherwise it
      // would be system->vendor violation.
      // would be system->vendor violation.
      system_exposed_libraries = system_exposed_libraries + ":" + oem_public_libraries_.c_str();
      if (!oem_public_libraries_.empty()) {
        system_exposed_libraries = system_exposed_libraries + ':' + oem_public_libraries_;
      }
      if (!product_public_libraries_.empty()) {
        system_exposed_libraries = system_exposed_libraries + ':' + product_public_libraries_;
      }
    }
    }


    NativeLoaderNamespace native_loader_ns;
    NativeLoaderNamespace native_loader_ns;
@@ -351,6 +358,8 @@ class LibraryNamespaces {
    std::string vndksp_native_libraries_system_config =
    std::string vndksp_native_libraries_system_config =
            root_dir + kVndkspNativeLibrariesSystemConfigPathFromRoot;
            root_dir + kVndkspNativeLibrariesSystemConfigPathFromRoot;


    std::string product_public_native_libraries_dir = "/product/etc";

    std::string error_msg;
    std::string error_msg;
    LOG_ALWAYS_FATAL_IF(
    LOG_ALWAYS_FATAL_IF(
        !ReadConfig(public_native_libraries_system_config, &sonames, always_true, &error_msg),
        !ReadConfig(public_native_libraries_system_config, &sonames, always_true, &error_msg),
@@ -373,7 +382,7 @@ class LibraryNamespaces {
    //
    //
    // TODO(dimitry): this is a bit misleading since we do not know
    // TODO(dimitry): this is a bit misleading since we do not know
    // if the vendor public library is going to be opened from /vendor/lib
    // if the vendor public library is going to be opened from /vendor/lib
    // we might as well end up loading them from /system/lib
    // we might as well end up loading them from /system/lib or /product/lib
    // For now we rely on CTS test to catch things like this but
    // For now we rely on CTS test to catch things like this but
    // it should probably be addressed in the future.
    // it should probably be addressed in the future.
    for (const auto& soname : sonames) {
    for (const auto& soname : sonames) {
@@ -387,13 +396,43 @@ class LibraryNamespaces {
    // system libs that are exposed to apps. The libs in the txt files must be
    // system libs that are exposed to apps. The libs in the txt files must be
    // named as lib<name>.<companyname>.so.
    // named as lib<name>.<companyname>.so.
    sonames.clear();
    sonames.clear();
    std::string dirname = base::Dirname(public_native_libraries_system_config);
    ReadExtensionLibraries(base::Dirname(public_native_libraries_system_config).c_str(), &sonames);
    std::unique_ptr<DIR, decltype(&closedir)> dir(opendir(dirname.c_str()), closedir);
    oem_public_libraries_ = base::Join(sonames, ':');

    // read /product/etc/public.libraries-<companyname>.txt which contain partner defined
    // product libs that are exposed to apps.
    sonames.clear();
    ReadExtensionLibraries(product_public_native_libraries_dir.c_str(), &sonames);
    product_public_libraries_ = base::Join(sonames, ':');

    // Insert VNDK version to llndk and vndksp config file names.
    insert_vndk_version_str(&llndk_native_libraries_system_config);
    insert_vndk_version_str(&vndksp_native_libraries_system_config);

    sonames.clear();
    ReadConfig(llndk_native_libraries_system_config, &sonames, always_true);
    system_llndk_libraries_ = base::Join(sonames, ':');

    sonames.clear();
    ReadConfig(vndksp_native_libraries_system_config, &sonames, always_true);
    system_vndksp_libraries_ = base::Join(sonames, ':');

    sonames.clear();
    // This file is optional, quietly ignore if the file does not exist.
    ReadConfig(kPublicNativeLibrariesVendorConfig, &sonames, always_true, nullptr);

    vendor_public_libraries_ = base::Join(sonames, ':');
  }

  void Reset() { namespaces_.clear(); }

 private:
  void ReadExtensionLibraries(const char* dirname, std::vector<std::string>* sonames) {
    std::unique_ptr<DIR, decltype(&closedir)> dir(opendir(dirname), closedir);
    if (dir != nullptr) {
    if (dir != nullptr) {
      // Failing to opening the dir is not an error, which can happen in
      // Failing to opening the dir is not an error, which can happen in
      // webview_zygote.
      // webview_zygote.
      struct dirent* ent;
      while (struct dirent* ent = readdir(dir.get())) {
      while ((ent = readdir(dir.get())) != nullptr) {
        if (ent->d_type != DT_REG && ent->d_type != DT_LNK) {
        if (ent->d_type != DT_REG && ent->d_type != DT_LNK) {
          continue;
          continue;
        }
        }
@@ -403,14 +442,17 @@ class LibraryNamespaces {
          const size_t start = kPublicNativeLibrariesExtensionConfigPrefixLen;
          const size_t start = kPublicNativeLibrariesExtensionConfigPrefixLen;
          const size_t end = filename.size() - kPublicNativeLibrariesExtensionConfigSuffixLen;
          const size_t end = filename.size() - kPublicNativeLibrariesExtensionConfigSuffixLen;
          const std::string company_name = filename.substr(start, end - start);
          const std::string company_name = filename.substr(start, end - start);
          const std::string config_file_path = dirname + "/" + filename;
          const std::string config_file_path = dirname + "/"s + filename;
          LOG_ALWAYS_FATAL_IF(
          LOG_ALWAYS_FATAL_IF(
              company_name.empty(),
              company_name.empty(),
              "Error extracting company name from public native library list file path \"%s\"",
              "Error extracting company name from public native library list file path \"%s\"",
              config_file_path.c_str());
              config_file_path.c_str());

          std::string error_msg;

          LOG_ALWAYS_FATAL_IF(
          LOG_ALWAYS_FATAL_IF(
              !ReadConfig(
              !ReadConfig(
                  config_file_path, &sonames,
                  config_file_path, sonames,
                  [&company_name](const std::string& soname, std::string* error_msg) {
                  [&company_name](const std::string& soname, std::string* error_msg) {
                    if (android::base::StartsWith(soname, "lib") &&
                    if (android::base::StartsWith(soname, "lib") &&
                        android::base::EndsWith(soname, "." + company_name + ".so")) {
                        android::base::EndsWith(soname, "." + company_name + ".so")) {
@@ -427,32 +469,9 @@ class LibraryNamespaces {
        }
        }
      }
      }
    }
    }
    oem_public_libraries_ = base::Join(sonames, ':');

    // Insert VNDK version to llndk and vndksp config file names.
    insert_vndk_version_str(&llndk_native_libraries_system_config);
    insert_vndk_version_str(&vndksp_native_libraries_system_config);

    sonames.clear();
    ReadConfig(llndk_native_libraries_system_config, &sonames, always_true);
    system_llndk_libraries_ = base::Join(sonames, ':');

    sonames.clear();
    ReadConfig(vndksp_native_libraries_system_config, &sonames, always_true);
    system_vndksp_libraries_ = base::Join(sonames, ':');

    sonames.clear();
    // This file is optional, quietly ignore if the file does not exist.
    ReadConfig(kPublicNativeLibrariesVendorConfig, &sonames, always_true, nullptr);

    vendor_public_libraries_ = base::Join(sonames, ':');
  }
  }


  void Reset() {
    namespaces_.clear();
  }


 private:
  bool ReadConfig(const std::string& configFile, std::vector<std::string>* sonames,
  bool ReadConfig(const std::string& configFile, std::vector<std::string>* sonames,
                  const std::function<bool(const std::string& /* soname */,
                  const std::function<bool(const std::string& /* soname */,
                                           std::string* /* error_msg */)>& check_soname,
                                           std::string* /* error_msg */)>& check_soname,
@@ -559,6 +578,7 @@ class LibraryNamespaces {
  std::string system_public_libraries_;
  std::string system_public_libraries_;
  std::string vendor_public_libraries_;
  std::string vendor_public_libraries_;
  std::string oem_public_libraries_;
  std::string oem_public_libraries_;
  std::string product_public_libraries_;
  std::string system_llndk_libraries_;
  std::string system_llndk_libraries_;
  std::string system_vndksp_libraries_;
  std::string system_vndksp_libraries_;


+20 −0
Original line number Original line Diff line number Diff line
@@ -49,3 +49,23 @@ cc_library {
        "libbase",
        "libbase",
    ],
    ],
}
}

cc_library {
    name: "libfoo.product1",
    srcs: ["test.cpp"],
    cflags: ["-DLIBNAME=\"libfoo.product1.so\""],
    product_specific: true,
    shared_libs: [
        "libbase",
    ],
}

cc_library {
    name: "libbar.product1",
    srcs: ["test.cpp"],
    cflags: ["-DLIBNAME=\"libbar.product1.so\""],
    product_specific: true,
    shared_libs: [
        "libbase",
    ],
}
+7 −0
Original line number Original line Diff line number Diff line
@@ -29,6 +29,13 @@ LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)
LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)
include $(BUILD_PREBUILT)
include $(BUILD_PREBUILT)


include $(CLEAR_VARS)
LOCAL_MODULE := public.libraries-product1.txt
LOCAL_SRC_FILES:= $(LOCAL_MODULE)
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT_PRODUCT_ETC)
include $(BUILD_PREBUILT)

include $(CLEAR_VARS)
include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := oemlibrarytest-system
LOCAL_PACKAGE_NAME := oemlibrarytest-system
LOCAL_MODULE_TAGS := tests
LOCAL_MODULE_TAGS := tests
+2 −0
Original line number Original line Diff line number Diff line
libfoo.product1.so
libbar.product1.so
Loading