diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2018-06-03 07:20:49 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2018-06-03 07:20:49 +0000 |
commit | 5f1febdeef6fcddd9155f40e453b080d71502264 (patch) | |
tree | 1cda29d5f9f175e9aa898ccd7abfd76ab1241db9 | |
parent | 2d48594be4d1f5ce69f130ccd2d9c90700c46816 (diff) | |
parent | 9bd3ee1c4f14f268b0959edd891ef852b95370b8 (diff) | |
download | core-5f1febdeef6fcddd9155f40e453b080d71502264.tar.gz |
Snap for 4818534 from 9bd3ee1c4f14f268b0959edd891ef852b95370b8 to pi-release
Change-Id: Idc9af3a531d434302036e2d1d61e172bd9a7849d
-rw-r--r-- | libcutils/fs_config.cpp | 7 | ||||
-rw-r--r-- | libnativeloader/native_loader.cpp | 86 | ||||
-rw-r--r-- | libnativeloader/test/Android.bp | 20 | ||||
-rw-r--r-- | libnativeloader/test/Android.mk | 7 | ||||
-rw-r--r-- | libnativeloader/test/public.libraries-product1.txt | 2 | ||||
-rw-r--r-- | libnativeloader/test/src/android/test/app/TestActivity.java | 2 | ||||
-rw-r--r-- | libsystem/include/system/camera.h | 9 | ||||
-rw-r--r-- | rootdir/etc/ld.config.txt | 16 | ||||
-rw-r--r-- | rootdir/etc/ld.config.vndk_lite.txt | 10 |
9 files changed, 120 insertions, 39 deletions
diff --git a/libcutils/fs_config.cpp b/libcutils/fs_config.cpp index cd61d950d..5b79b1d7d 100644 --- a/libcutils/fs_config.cpp +++ b/libcutils/fs_config.cpp @@ -80,6 +80,7 @@ static const struct fs_path_config android_dirs[] = { { 00775, AID_ROOT, AID_ROOT, 0, "data/preloads" }, { 00771, AID_SYSTEM, AID_SYSTEM, 0, "data" }, { 00755, AID_ROOT, AID_SYSTEM, 0, "mnt" }, + { 00755, AID_ROOT, AID_SHELL, 0, "product/bin" }, { 00750, AID_ROOT, AID_SHELL, 0, "sbin" }, { 00777, AID_ROOT, AID_ROOT, 0, "sdcard" }, { 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/*" }, { 00640, AID_ROOT, AID_SHELL, 0, "fstab.*" }, { 00750, AID_ROOT, AID_SHELL, 0, "init*" }, + { 00755, AID_ROOT, AID_SHELL, 0, "product/bin/*" }, { 00750, AID_ROOT, AID_SHELL, 0, "sbin/*" }, { 00755, AID_ROOT, AID_SHELL, 0, "system/bin/*" }, { 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; } -// 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 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) { size_t plen = strlen(partitions[i]); if (len <= plen) continue; diff --git a/libnativeloader/native_loader.cpp b/libnativeloader/native_loader.cpp index 0ebb22647..7fef10685 100644 --- a/libnativeloader/native_loader.cpp +++ b/libnativeloader/native_loader.cpp @@ -46,6 +46,8 @@ "%s:%d: %s CHECK '" #predicate "' failed.",\ __FILE__, __LINE__, __FUNCTION__) +using namespace std::string_literals; + namespace android { #if defined(__ANDROID__) @@ -236,10 +238,15 @@ class LibraryNamespaces { // Different name is useful for debugging namespace_name = kVendorClassloaderNamespaceName; ALOGD("classloader namespace configured for unbundled vendor apk. library_path=%s", library_path.c_str()); - } else if (!oem_public_libraries_.empty()) { - // oem_public_libraries are NOT available to vendor apks, otherwise it + } else { + // oem and product public libraries are NOT available to vendor apks, otherwise it // 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; @@ -351,6 +358,8 @@ class LibraryNamespaces { std::string vndksp_native_libraries_system_config = root_dir + kVndkspNativeLibrariesSystemConfigPathFromRoot; + std::string product_public_native_libraries_dir = "/product/etc"; + std::string error_msg; LOG_ALWAYS_FATAL_IF( !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 // 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 // it should probably be addressed in the future. 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 // named as lib<name>.<companyname>.so. sonames.clear(); - std::string dirname = base::Dirname(public_native_libraries_system_config); - std::unique_ptr<DIR, decltype(&closedir)> dir(opendir(dirname.c_str()), closedir); + ReadExtensionLibraries(base::Dirname(public_native_libraries_system_config).c_str(), &sonames); + 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) { // Failing to opening the dir is not an error, which can happen in // webview_zygote. - struct dirent* ent; - while ((ent = readdir(dir.get())) != nullptr) { + while (struct dirent* ent = readdir(dir.get())) { if (ent->d_type != DT_REG && ent->d_type != DT_LNK) { continue; } @@ -403,14 +442,17 @@ class LibraryNamespaces { const size_t start = kPublicNativeLibrariesExtensionConfigPrefixLen; const size_t end = filename.size() - kPublicNativeLibrariesExtensionConfigSuffixLen; 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( company_name.empty(), "Error extracting company name from public native library list file path \"%s\"", config_file_path.c_str()); + + std::string error_msg; + LOG_ALWAYS_FATAL_IF( !ReadConfig( - config_file_path, &sonames, + config_file_path, sonames, [&company_name](const std::string& soname, std::string* error_msg) { if (android::base::StartsWith(soname, "lib") && 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, const std::function<bool(const std::string& /* soname */, std::string* /* error_msg */)>& check_soname, @@ -559,6 +578,7 @@ class LibraryNamespaces { std::string system_public_libraries_; std::string vendor_public_libraries_; std::string oem_public_libraries_; + std::string product_public_libraries_; std::string system_llndk_libraries_; std::string system_vndksp_libraries_; diff --git a/libnativeloader/test/Android.bp b/libnativeloader/test/Android.bp index 5cf88b09b..d528f3031 100644 --- a/libnativeloader/test/Android.bp +++ b/libnativeloader/test/Android.bp @@ -49,3 +49,23 @@ cc_library { "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", + ], +} diff --git a/libnativeloader/test/Android.mk b/libnativeloader/test/Android.mk index e62545465..65e7b09bc 100644 --- a/libnativeloader/test/Android.mk +++ b/libnativeloader/test/Android.mk @@ -30,6 +30,13 @@ LOCAL_MODULE_PATH := $(TARGET_OUT_ETC) 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) LOCAL_PACKAGE_NAME := oemlibrarytest-system LOCAL_MODULE_TAGS := tests LOCAL_MANIFEST_FILE := system/AndroidManifest.xml diff --git a/libnativeloader/test/public.libraries-product1.txt b/libnativeloader/test/public.libraries-product1.txt new file mode 100644 index 000000000..358154c62 --- /dev/null +++ b/libnativeloader/test/public.libraries-product1.txt @@ -0,0 +1,2 @@ +libfoo.product1.so +libbar.product1.so diff --git a/libnativeloader/test/src/android/test/app/TestActivity.java b/libnativeloader/test/src/android/test/app/TestActivity.java index 214892df2..a7a455d33 100644 --- a/libnativeloader/test/src/android/test/app/TestActivity.java +++ b/libnativeloader/test/src/android/test/app/TestActivity.java @@ -29,6 +29,8 @@ public class TestActivity extends Activity { tryLoadingLib("bar.oem1"); tryLoadingLib("foo.oem2"); tryLoadingLib("bar.oem2"); + tryLoadingLib("foo.product1"); + tryLoadingLib("bar.product1"); } private void tryLoadingLib(String name) { diff --git a/libsystem/include/system/camera.h b/libsystem/include/system/camera.h index 5d0873ac4..7d796737c 100644 --- a/libsystem/include/system/camera.h +++ b/libsystem/include/system/camera.h @@ -203,6 +203,15 @@ enum { * (except disconnect and sending CAMERA_CMD_PING) after getting this. */ CAMERA_ERROR_RELEASED = 2, + + /** + * Camera was released because device policy change or the client application + * is going to background. The client should call Camera::disconnect + * immediately after getting this notification. Otherwise, the camera will be + * released by camera service in a short time. The client should not call any + * method (except disconnect and sending CAMERA_CMD_PING) after getting this. + */ + CAMERA_ERROR_DISABLED = 3, CAMERA_ERROR_SERVER_DIED = 100 }; diff --git a/rootdir/etc/ld.config.txt b/rootdir/etc/ld.config.txt index ba96cc84a..a0b1996ad 100644 --- a/rootdir/etc/ld.config.txt +++ b/rootdir/etc/ld.config.txt @@ -7,6 +7,7 @@ # absolute path of an executable is selected. dir.system = /system/bin/ dir.system = /system/xbin/ +dir.system = /product/bin/ dir.vendor = /odm/bin/ dir.vendor = /vendor/bin/ @@ -37,7 +38,8 @@ additional.namespaces = sphal,vndk,rs ############################################################################### namespace.default.isolated = true -namespace.default.search.paths = /system/${LIB} +namespace.default.search.paths = /system/${LIB} +namespace.default.search.paths += /product/${LIB} # We can't have entire /system/${LIB} as permitted paths because doing so # makes it possible to load libs in /system/${LIB}/vndk* directories by @@ -49,6 +51,7 @@ namespace.default.search.paths = /system/${LIB} namespace.default.permitted.paths = /system/${LIB}/drm namespace.default.permitted.paths += /system/${LIB}/extractors namespace.default.permitted.paths += /system/${LIB}/hw +namespace.default.permitted.paths += /product/${LIB} # These are where odex files are located. libart has to be able to dlopen the files namespace.default.permitted.paths += /system/framework namespace.default.permitted.paths += /system/app @@ -68,6 +71,8 @@ namespace.default.permitted.paths += /mnt/expand namespace.default.asan.search.paths = /data/asan/system/${LIB} namespace.default.asan.search.paths += /system/${LIB} +namespace.default.asan.search.paths += /data/asan/product/${LIB} +namespace.default.asan.search.paths += /product/${LIB} namespace.default.asan.permitted.paths = /data namespace.default.asan.permitted.paths += /system/${LIB}/drm @@ -83,6 +88,7 @@ namespace.default.asan.permitted.paths += /odm/framework namespace.default.asan.permitted.paths += /odm/app namespace.default.asan.permitted.paths += /odm/priv-app namespace.default.asan.permitted.paths += /oem/app +namespace.default.asan.permitted.paths += /product/${LIB} namespace.default.asan.permitted.paths += /product/framework namespace.default.asan.permitted.paths += /product/app namespace.default.asan.permitted.paths += /product/priv-app @@ -320,10 +326,13 @@ namespace.vndk.link.default.allow_all_shared_libs = true ############################################################################### namespace.system.isolated = false -namespace.system.search.paths = /system/${LIB} +namespace.system.search.paths = /system/${LIB} +namespace.system.search.paths += /product/${LIB} namespace.system.asan.search.paths = /data/asan/system/${LIB} namespace.system.asan.search.paths += /system/${LIB} +namespace.system.asan.search.paths += /data/asan/product/${LIB} +namespace.system.asan.search.paths += /product/${LIB} ############################################################################### # Namespace config for binaries under /postinstall. @@ -335,4 +344,5 @@ namespace.system.asan.search.paths += /system/${LIB} ############################################################################### [postinstall] namespace.default.isolated = false -namespace.default.search.paths = /system/${LIB} +namespace.default.search.paths = /system/${LIB} +namespace.default.search.paths += /product/${LIB} diff --git a/rootdir/etc/ld.config.vndk_lite.txt b/rootdir/etc/ld.config.vndk_lite.txt index 1fd419586..db65c14fc 100644 --- a/rootdir/etc/ld.config.vndk_lite.txt +++ b/rootdir/etc/ld.config.vndk_lite.txt @@ -7,6 +7,7 @@ # absolute path of an executable is selected. dir.system = /system/bin/ dir.system = /system/xbin/ +dir.system = /product/bin/ dir.vendor = /odm/bin/ dir.vendor = /vendor/bin/ @@ -40,6 +41,7 @@ namespace.default.isolated = false namespace.default.search.paths = /system/${LIB} namespace.default.search.paths += /odm/${LIB} namespace.default.search.paths += /vendor/${LIB} +namespace.default.search.paths += /product/${LIB} namespace.default.asan.search.paths = /data/asan/system/${LIB} namespace.default.asan.search.paths += /system/${LIB} @@ -47,6 +49,8 @@ namespace.default.asan.search.paths += /data/asan/odm/${LIB} namespace.default.asan.search.paths += /odm/${LIB} namespace.default.asan.search.paths += /data/asan/vendor/${LIB} namespace.default.asan.search.paths += /vendor/${LIB} +namespace.default.asan.search.paths += /data/asan/product/${LIB} +namespace.default.asan.search.paths += /product/${LIB} ############################################################################### # "sphal" namespace @@ -205,6 +209,7 @@ namespace.default.search.paths += /vendor/${LIB}/vndk-sp namespace.default.search.paths += /system/${LIB}/vndk%VNDK_VER% namespace.default.search.paths += /system/${LIB}/vndk-sp%VNDK_VER% namespace.default.search.paths += /system/${LIB} +namespace.default.search.paths += /product/${LIB} namespace.default.asan.search.paths = /data/asan/odm/${LIB} namespace.default.asan.search.paths += /odm/${LIB} @@ -224,6 +229,8 @@ namespace.default.asan.search.paths += /data/asan/system/${LIB}/vndk-sp%VNDK_VER namespace.default.asan.search.paths += /system/${LIB}/vndk-sp%VNDK_VER% namespace.default.asan.search.paths += /data/asan/system/${LIB} namespace.default.asan.search.paths += /system/${LIB} +namespace.default.asan.search.paths += /data/asan/product/${LIB} +namespace.default.asan.search.paths += /product/${LIB} ############################################################################### # Namespace config for binaries under /postinstall. @@ -235,4 +242,5 @@ namespace.default.asan.search.paths += /system/${LIB} ############################################################################### [postinstall] namespace.default.isolated = false -namespace.default.search.paths = /system/${LIB} +namespace.default.search.paths = /system/${LIB} +namespace.default.search.paths += /product/${LIB} |