diff options
author | Inseob Kim | 2018-05-03 21:39:12 -0500 |
---|---|---|
committer | Inseob Kim | 2018-05-30 19:59:21 -0500 |
commit | e5c2de355b3d37015f332af5fc97d535d97f9693 (patch) | |
tree | 3437504159776068fd06ca44a402d54f7e75d1a2 | |
parent | 39edb87aaf21f9bd452f3f164ee90cf7a9e14518 (diff) | |
download | platform-system-core-e5c2de355b3d37015f332af5fc97d535d97f9693.tar.gz platform-system-core-e5c2de355b3d37015f332af5fc97d535d97f9693.tar.xz platform-system-core-e5c2de355b3d37015f332af5fc97d535d97f9693.zip |
Support product-specific libraries
Product-specific libraries in /product/lib can be exposed to Android
apps by adding the list of the libs into
/product/etc/public.libraries-<companyname>.txt. The libs MUST be named
as lib<name>.<companyname>.so.
Bug: 73095206
Test: with taimen
mma -j and runtest.sh. The libs are all loaded in system, but not in
vendor. After reinstalling app using adb -r and reopening app, only
libraries listed in .txt are loaded
Change-Id: I7c386813c72a7b225a7f244b6c5fec4ac0660fd3
Merged-In: I7c386813c72a7b225a7f244b6c5fec4ac0660fd3
(cherry picked from commit 67cb05654cfa677fd5db33ea0629a9496a9ae907)
-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-- | rootdir/etc/ld.config.txt | 15 | ||||
-rw-r--r-- | rootdir/etc/ld.config.vndk_lite.txt | 9 |
7 files changed, 104 insertions, 37 deletions
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 @@ | |||
46 | "%s:%d: %s CHECK '" #predicate "' failed.",\ | 46 | "%s:%d: %s CHECK '" #predicate "' failed.",\ |
47 | __FILE__, __LINE__, __FUNCTION__) | 47 | __FILE__, __LINE__, __FUNCTION__) |
48 | 48 | ||
49 | using namespace std::string_literals; | ||
50 | |||
49 | namespace android { | 51 | namespace android { |
50 | 52 | ||
51 | #if defined(__ANDROID__) | 53 | #if defined(__ANDROID__) |
@@ -236,10 +238,15 @@ class LibraryNamespaces { | |||
236 | // Different name is useful for debugging | 238 | // Different name is useful for debugging |
237 | namespace_name = kVendorClassloaderNamespaceName; | 239 | namespace_name = kVendorClassloaderNamespaceName; |
238 | ALOGD("classloader namespace configured for unbundled vendor apk. library_path=%s", library_path.c_str()); | 240 | ALOGD("classloader namespace configured for unbundled vendor apk. library_path=%s", library_path.c_str()); |
239 | } else if (!oem_public_libraries_.empty()) { | 241 | } else { |
240 | // oem_public_libraries are NOT available to vendor apks, otherwise it | 242 | // oem and product public libraries are NOT available to vendor apks, otherwise it |
241 | // would be system->vendor violation. | 243 | // would be system->vendor violation. |
242 | system_exposed_libraries = system_exposed_libraries + ":" + oem_public_libraries_.c_str(); | 244 | if (!oem_public_libraries_.empty()) { |
245 | system_exposed_libraries = system_exposed_libraries + ':' + oem_public_libraries_; | ||
246 | } | ||
247 | if (!product_public_libraries_.empty()) { | ||
248 | system_exposed_libraries = system_exposed_libraries + ':' + product_public_libraries_; | ||
249 | } | ||
243 | } | 250 | } |
244 | 251 | ||
245 | NativeLoaderNamespace native_loader_ns; | 252 | NativeLoaderNamespace native_loader_ns; |
@@ -351,6 +358,8 @@ class LibraryNamespaces { | |||
351 | std::string vndksp_native_libraries_system_config = | 358 | std::string vndksp_native_libraries_system_config = |
352 | root_dir + kVndkspNativeLibrariesSystemConfigPathFromRoot; | 359 | root_dir + kVndkspNativeLibrariesSystemConfigPathFromRoot; |
353 | 360 | ||
361 | std::string product_public_native_libraries_dir = "/product/etc"; | ||
362 | |||
354 | std::string error_msg; | 363 | std::string error_msg; |
355 | LOG_ALWAYS_FATAL_IF( | 364 | LOG_ALWAYS_FATAL_IF( |
356 | !ReadConfig(public_native_libraries_system_config, &sonames, always_true, &error_msg), | 365 | !ReadConfig(public_native_libraries_system_config, &sonames, always_true, &error_msg), |
@@ -373,7 +382,7 @@ class LibraryNamespaces { | |||
373 | // | 382 | // |
374 | // TODO(dimitry): this is a bit misleading since we do not know | 383 | // TODO(dimitry): this is a bit misleading since we do not know |
375 | // if the vendor public library is going to be opened from /vendor/lib | 384 | // if the vendor public library is going to be opened from /vendor/lib |
376 | // we might as well end up loading them from /system/lib | 385 | // we might as well end up loading them from /system/lib or /product/lib |
377 | // For now we rely on CTS test to catch things like this but | 386 | // For now we rely on CTS test to catch things like this but |
378 | // it should probably be addressed in the future. | 387 | // it should probably be addressed in the future. |
379 | for (const auto& soname : sonames) { | 388 | for (const auto& soname : sonames) { |
@@ -387,13 +396,43 @@ class LibraryNamespaces { | |||
387 | // system libs that are exposed to apps. The libs in the txt files must be | 396 | // system libs that are exposed to apps. The libs in the txt files must be |
388 | // named as lib<name>.<companyname>.so. | 397 | // named as lib<name>.<companyname>.so. |
389 | sonames.clear(); | 398 | sonames.clear(); |
390 | std::string dirname = base::Dirname(public_native_libraries_system_config); | 399 | ReadExtensionLibraries(base::Dirname(public_native_libraries_system_config).c_str(), &sonames); |
391 | std::unique_ptr<DIR, decltype(&closedir)> dir(opendir(dirname.c_str()), closedir); | 400 | oem_public_libraries_ = base::Join(sonames, ':'); |
401 | |||
402 | // read /product/etc/public.libraries-<companyname>.txt which contain partner defined | ||
403 | // product libs that are exposed to apps. | ||
404 | sonames.clear(); | ||
405 | ReadExtensionLibraries(product_public_native_libraries_dir.c_str(), &sonames); | ||
406 | product_public_libraries_ = base::Join(sonames, ':'); | ||
407 | |||
408 | // Insert VNDK version to llndk and vndksp config file names. | ||
409 | insert_vndk_version_str(&llndk_native_libraries_system_config); | ||
410 | insert_vndk_version_str(&vndksp_native_libraries_system_config); | ||
411 | |||
412 | sonames.clear(); | ||
413 | ReadConfig(llndk_native_libraries_system_config, &sonames, always_true); | ||
414 | system_llndk_libraries_ = base::Join(sonames, ':'); | ||
415 | |||
416 | sonames.clear(); | ||
417 | ReadConfig(vndksp_native_libraries_system_config, &sonames, always_true); | ||
418 | system_vndksp_libraries_ = base::Join(sonames, ':'); | ||
419 | |||
420 | sonames.clear(); | ||
421 | // This file is optional, quietly ignore if the file does not exist. | ||
422 | ReadConfig(kPublicNativeLibrariesVendorConfig, &sonames, always_true, nullptr); | ||
423 | |||
424 | vendor_public_libraries_ = base::Join(sonames, ':'); | ||
425 | } | ||
426 | |||
427 | void Reset() { namespaces_.clear(); } | ||
428 | |||
429 | private: | ||
430 | void ReadExtensionLibraries(const char* dirname, std::vector<std::string>* sonames) { | ||
431 | std::unique_ptr<DIR, decltype(&closedir)> dir(opendir(dirname), closedir); | ||
392 | if (dir != nullptr) { | 432 | if (dir != nullptr) { |
393 | // Failing to opening the dir is not an error, which can happen in | 433 | // Failing to opening the dir is not an error, which can happen in |
394 | // webview_zygote. | 434 | // webview_zygote. |
395 | struct dirent* ent; | 435 | while (struct dirent* ent = readdir(dir.get())) { |
396 | while ((ent = readdir(dir.get())) != nullptr) { | ||
397 | if (ent->d_type != DT_REG && ent->d_type != DT_LNK) { | 436 | if (ent->d_type != DT_REG && ent->d_type != DT_LNK) { |
398 | continue; | 437 | continue; |
399 | } | 438 | } |
@@ -403,14 +442,17 @@ class LibraryNamespaces { | |||
403 | const size_t start = kPublicNativeLibrariesExtensionConfigPrefixLen; | 442 | const size_t start = kPublicNativeLibrariesExtensionConfigPrefixLen; |
404 | const size_t end = filename.size() - kPublicNativeLibrariesExtensionConfigSuffixLen; | 443 | const size_t end = filename.size() - kPublicNativeLibrariesExtensionConfigSuffixLen; |
405 | const std::string company_name = filename.substr(start, end - start); | 444 | const std::string company_name = filename.substr(start, end - start); |
406 | const std::string config_file_path = dirname + "/" + filename; | 445 | const std::string config_file_path = dirname + "/"s + filename; |
407 | LOG_ALWAYS_FATAL_IF( | 446 | LOG_ALWAYS_FATAL_IF( |
408 | company_name.empty(), | 447 | company_name.empty(), |
409 | "Error extracting company name from public native library list file path \"%s\"", | 448 | "Error extracting company name from public native library list file path \"%s\"", |
410 | config_file_path.c_str()); | 449 | config_file_path.c_str()); |
450 | |||
451 | std::string error_msg; | ||
452 | |||
411 | LOG_ALWAYS_FATAL_IF( | 453 | LOG_ALWAYS_FATAL_IF( |
412 | !ReadConfig( | 454 | !ReadConfig( |
413 | config_file_path, &sonames, | 455 | config_file_path, sonames, |
414 | [&company_name](const std::string& soname, std::string* error_msg) { | 456 | [&company_name](const std::string& soname, std::string* error_msg) { |
415 | if (android::base::StartsWith(soname, "lib") && | 457 | if (android::base::StartsWith(soname, "lib") && |
416 | android::base::EndsWith(soname, "." + company_name + ".so")) { | 458 | android::base::EndsWith(soname, "." + company_name + ".so")) { |
@@ -427,32 +469,9 @@ class LibraryNamespaces { | |||
427 | } | 469 | } |
428 | } | 470 | } |
429 | } | 471 | } |
430 | oem_public_libraries_ = base::Join(sonames, ':'); | ||
431 | |||
432 | // Insert VNDK version to llndk and vndksp config file names. | ||
433 | insert_vndk_version_str(&llndk_native_libraries_system_config); | ||
434 | insert_vndk_version_str(&vndksp_native_libraries_system_config); | ||
435 | |||
436 | sonames.clear(); | ||
437 | ReadConfig(llndk_native_libraries_system_config, &sonames, always_true); | ||
438 | system_llndk_libraries_ = base::Join(sonames, ':'); | ||
439 | |||
440 | sonames.clear(); | ||
441 | ReadConfig(vndksp_native_libraries_system_config, &sonames, always_true); | ||
442 | system_vndksp_libraries_ = base::Join(sonames, ':'); | ||
443 | |||
444 | sonames.clear(); | ||
445 | // This file is optional, quietly ignore if the file does not exist. | ||
446 | ReadConfig(kPublicNativeLibrariesVendorConfig, &sonames, always_true, nullptr); | ||
447 | |||
448 | vendor_public_libraries_ = base::Join(sonames, ':'); | ||
449 | } | 472 | } |
450 | 473 | ||
451 | void Reset() { | ||
452 | namespaces_.clear(); | ||
453 | } | ||
454 | 474 | ||
455 | private: | ||
456 | bool ReadConfig(const std::string& configFile, std::vector<std::string>* sonames, | 475 | bool ReadConfig(const std::string& configFile, std::vector<std::string>* sonames, |
457 | const std::function<bool(const std::string& /* soname */, | 476 | const std::function<bool(const std::string& /* soname */, |
458 | std::string* /* error_msg */)>& check_soname, | 477 | std::string* /* error_msg */)>& check_soname, |
@@ -559,6 +578,7 @@ class LibraryNamespaces { | |||
559 | std::string system_public_libraries_; | 578 | std::string system_public_libraries_; |
560 | std::string vendor_public_libraries_; | 579 | std::string vendor_public_libraries_; |
561 | std::string oem_public_libraries_; | 580 | std::string oem_public_libraries_; |
581 | std::string product_public_libraries_; | ||
562 | std::string system_llndk_libraries_; | 582 | std::string system_llndk_libraries_; |
563 | std::string system_vndksp_libraries_; | 583 | std::string system_vndksp_libraries_; |
564 | 584 | ||
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 { | |||
49 | "libbase", | 49 | "libbase", |
50 | ], | 50 | ], |
51 | } | 51 | } |
52 | |||
53 | cc_library { | ||
54 | name: "libfoo.product1", | ||
55 | srcs: ["test.cpp"], | ||
56 | cflags: ["-DLIBNAME=\"libfoo.product1.so\""], | ||
57 | product_specific: true, | ||
58 | shared_libs: [ | ||
59 | "libbase", | ||
60 | ], | ||
61 | } | ||
62 | |||
63 | cc_library { | ||
64 | name: "libbar.product1", | ||
65 | srcs: ["test.cpp"], | ||
66 | cflags: ["-DLIBNAME=\"libbar.product1.so\""], | ||
67 | product_specific: true, | ||
68 | shared_libs: [ | ||
69 | "libbase", | ||
70 | ], | ||
71 | } | ||
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) | |||
30 | include $(BUILD_PREBUILT) | 30 | include $(BUILD_PREBUILT) |
31 | 31 | ||
32 | include $(CLEAR_VARS) | 32 | include $(CLEAR_VARS) |
33 | LOCAL_MODULE := public.libraries-product1.txt | ||
34 | LOCAL_SRC_FILES:= $(LOCAL_MODULE) | ||
35 | LOCAL_MODULE_CLASS := ETC | ||
36 | LOCAL_MODULE_PATH := $(TARGET_OUT_PRODUCT_ETC) | ||
37 | include $(BUILD_PREBUILT) | ||
38 | |||
39 | include $(CLEAR_VARS) | ||
33 | LOCAL_PACKAGE_NAME := oemlibrarytest-system | 40 | LOCAL_PACKAGE_NAME := oemlibrarytest-system |
34 | LOCAL_MODULE_TAGS := tests | 41 | LOCAL_MODULE_TAGS := tests |
35 | LOCAL_MANIFEST_FILE := system/AndroidManifest.xml | 42 | 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 @@ | |||
1 | libfoo.product1.so | ||
2 | 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 { | |||
29 | tryLoadingLib("bar.oem1"); | 29 | tryLoadingLib("bar.oem1"); |
30 | tryLoadingLib("foo.oem2"); | 30 | tryLoadingLib("foo.oem2"); |
31 | tryLoadingLib("bar.oem2"); | 31 | tryLoadingLib("bar.oem2"); |
32 | tryLoadingLib("foo.product1"); | ||
33 | tryLoadingLib("bar.product1"); | ||
32 | } | 34 | } |
33 | 35 | ||
34 | private void tryLoadingLib(String name) { | 36 | private void tryLoadingLib(String name) { |
diff --git a/rootdir/etc/ld.config.txt b/rootdir/etc/ld.config.txt index ba96cc84a..51e3f9efc 100644 --- a/rootdir/etc/ld.config.txt +++ b/rootdir/etc/ld.config.txt | |||
@@ -37,7 +37,8 @@ additional.namespaces = sphal,vndk,rs | |||
37 | ############################################################################### | 37 | ############################################################################### |
38 | namespace.default.isolated = true | 38 | namespace.default.isolated = true |
39 | 39 | ||
40 | namespace.default.search.paths = /system/${LIB} | 40 | namespace.default.search.paths = /system/${LIB} |
41 | namespace.default.search.paths += /product/${LIB} | ||
41 | 42 | ||
42 | # We can't have entire /system/${LIB} as permitted paths because doing so | 43 | # We can't have entire /system/${LIB} as permitted paths because doing so |
43 | # makes it possible to load libs in /system/${LIB}/vndk* directories by | 44 | # makes it possible to load libs in /system/${LIB}/vndk* directories by |
@@ -49,6 +50,7 @@ namespace.default.search.paths = /system/${LIB} | |||
49 | namespace.default.permitted.paths = /system/${LIB}/drm | 50 | namespace.default.permitted.paths = /system/${LIB}/drm |
50 | namespace.default.permitted.paths += /system/${LIB}/extractors | 51 | namespace.default.permitted.paths += /system/${LIB}/extractors |
51 | namespace.default.permitted.paths += /system/${LIB}/hw | 52 | namespace.default.permitted.paths += /system/${LIB}/hw |
53 | namespace.default.permitted.paths += /product/${LIB} | ||
52 | # These are where odex files are located. libart has to be able to dlopen the files | 54 | # These are where odex files are located. libart has to be able to dlopen the files |
53 | namespace.default.permitted.paths += /system/framework | 55 | namespace.default.permitted.paths += /system/framework |
54 | namespace.default.permitted.paths += /system/app | 56 | namespace.default.permitted.paths += /system/app |
@@ -68,6 +70,8 @@ namespace.default.permitted.paths += /mnt/expand | |||
68 | 70 | ||
69 | namespace.default.asan.search.paths = /data/asan/system/${LIB} | 71 | namespace.default.asan.search.paths = /data/asan/system/${LIB} |
70 | namespace.default.asan.search.paths += /system/${LIB} | 72 | namespace.default.asan.search.paths += /system/${LIB} |
73 | namespace.default.asan.search.paths += /data/asan/product/${LIB} | ||
74 | namespace.default.asan.search.paths += /product/${LIB} | ||
71 | 75 | ||
72 | namespace.default.asan.permitted.paths = /data | 76 | namespace.default.asan.permitted.paths = /data |
73 | namespace.default.asan.permitted.paths += /system/${LIB}/drm | 77 | namespace.default.asan.permitted.paths += /system/${LIB}/drm |
@@ -83,6 +87,7 @@ namespace.default.asan.permitted.paths += /odm/framework | |||
83 | namespace.default.asan.permitted.paths += /odm/app | 87 | namespace.default.asan.permitted.paths += /odm/app |
84 | namespace.default.asan.permitted.paths += /odm/priv-app | 88 | namespace.default.asan.permitted.paths += /odm/priv-app |
85 | namespace.default.asan.permitted.paths += /oem/app | 89 | namespace.default.asan.permitted.paths += /oem/app |
90 | namespace.default.asan.permitted.paths += /product/${LIB} | ||
86 | namespace.default.asan.permitted.paths += /product/framework | 91 | namespace.default.asan.permitted.paths += /product/framework |
87 | namespace.default.asan.permitted.paths += /product/app | 92 | namespace.default.asan.permitted.paths += /product/app |
88 | namespace.default.asan.permitted.paths += /product/priv-app | 93 | namespace.default.asan.permitted.paths += /product/priv-app |
@@ -320,10 +325,13 @@ namespace.vndk.link.default.allow_all_shared_libs = true | |||
320 | ############################################################################### | 325 | ############################################################################### |
321 | namespace.system.isolated = false | 326 | namespace.system.isolated = false |
322 | 327 | ||
323 | namespace.system.search.paths = /system/${LIB} | 328 | namespace.system.search.paths = /system/${LIB} |
329 | namespace.system.search.paths += /product/${LIB} | ||
324 | 330 | ||
325 | namespace.system.asan.search.paths = /data/asan/system/${LIB} | 331 | namespace.system.asan.search.paths = /data/asan/system/${LIB} |
326 | namespace.system.asan.search.paths += /system/${LIB} | 332 | namespace.system.asan.search.paths += /system/${LIB} |
333 | namespace.system.asan.search.paths += /data/asan/product/${LIB} | ||
334 | namespace.system.asan.search.paths += /product/${LIB} | ||
327 | 335 | ||
328 | ############################################################################### | 336 | ############################################################################### |
329 | # Namespace config for binaries under /postinstall. | 337 | # Namespace config for binaries under /postinstall. |
@@ -335,4 +343,5 @@ namespace.system.asan.search.paths += /system/${LIB} | |||
335 | ############################################################################### | 343 | ############################################################################### |
336 | [postinstall] | 344 | [postinstall] |
337 | namespace.default.isolated = false | 345 | namespace.default.isolated = false |
338 | namespace.default.search.paths = /system/${LIB} | 346 | namespace.default.search.paths = /system/${LIB} |
347 | 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..ab0375539 100644 --- a/rootdir/etc/ld.config.vndk_lite.txt +++ b/rootdir/etc/ld.config.vndk_lite.txt | |||
@@ -40,6 +40,7 @@ namespace.default.isolated = false | |||
40 | namespace.default.search.paths = /system/${LIB} | 40 | namespace.default.search.paths = /system/${LIB} |
41 | namespace.default.search.paths += /odm/${LIB} | 41 | namespace.default.search.paths += /odm/${LIB} |
42 | namespace.default.search.paths += /vendor/${LIB} | 42 | namespace.default.search.paths += /vendor/${LIB} |
43 | namespace.default.search.paths += /product/${LIB} | ||
43 | 44 | ||
44 | namespace.default.asan.search.paths = /data/asan/system/${LIB} | 45 | namespace.default.asan.search.paths = /data/asan/system/${LIB} |
45 | namespace.default.asan.search.paths += /system/${LIB} | 46 | namespace.default.asan.search.paths += /system/${LIB} |
@@ -47,6 +48,8 @@ namespace.default.asan.search.paths += /data/asan/odm/${LIB} | |||
47 | namespace.default.asan.search.paths += /odm/${LIB} | 48 | namespace.default.asan.search.paths += /odm/${LIB} |
48 | namespace.default.asan.search.paths += /data/asan/vendor/${LIB} | 49 | namespace.default.asan.search.paths += /data/asan/vendor/${LIB} |
49 | namespace.default.asan.search.paths += /vendor/${LIB} | 50 | namespace.default.asan.search.paths += /vendor/${LIB} |
51 | namespace.default.asan.search.paths += /data/asan/product/${LIB} | ||
52 | namespace.default.asan.search.paths += /product/${LIB} | ||
50 | 53 | ||
51 | ############################################################################### | 54 | ############################################################################### |
52 | # "sphal" namespace | 55 | # "sphal" namespace |
@@ -205,6 +208,7 @@ namespace.default.search.paths += /vendor/${LIB}/vndk-sp | |||
205 | namespace.default.search.paths += /system/${LIB}/vndk%VNDK_VER% | 208 | namespace.default.search.paths += /system/${LIB}/vndk%VNDK_VER% |
206 | namespace.default.search.paths += /system/${LIB}/vndk-sp%VNDK_VER% | 209 | namespace.default.search.paths += /system/${LIB}/vndk-sp%VNDK_VER% |
207 | namespace.default.search.paths += /system/${LIB} | 210 | namespace.default.search.paths += /system/${LIB} |
211 | namespace.default.search.paths += /product/${LIB} | ||
208 | 212 | ||
209 | namespace.default.asan.search.paths = /data/asan/odm/${LIB} | 213 | namespace.default.asan.search.paths = /data/asan/odm/${LIB} |
210 | namespace.default.asan.search.paths += /odm/${LIB} | 214 | namespace.default.asan.search.paths += /odm/${LIB} |
@@ -224,6 +228,8 @@ namespace.default.asan.search.paths += /data/asan/system/${LIB}/vndk-sp%VNDK_VER | |||
224 | namespace.default.asan.search.paths += /system/${LIB}/vndk-sp%VNDK_VER% | 228 | namespace.default.asan.search.paths += /system/${LIB}/vndk-sp%VNDK_VER% |
225 | namespace.default.asan.search.paths += /data/asan/system/${LIB} | 229 | namespace.default.asan.search.paths += /data/asan/system/${LIB} |
226 | namespace.default.asan.search.paths += /system/${LIB} | 230 | namespace.default.asan.search.paths += /system/${LIB} |
231 | namespace.default.asan.search.paths += /data/asan/product/${LIB} | ||
232 | namespace.default.asan.search.paths += /product/${LIB} | ||
227 | 233 | ||
228 | ############################################################################### | 234 | ############################################################################### |
229 | # Namespace config for binaries under /postinstall. | 235 | # Namespace config for binaries under /postinstall. |
@@ -235,4 +241,5 @@ namespace.default.asan.search.paths += /system/${LIB} | |||
235 | ############################################################################### | 241 | ############################################################################### |
236 | [postinstall] | 242 | [postinstall] |
237 | namespace.default.isolated = false | 243 | namespace.default.isolated = false |
238 | namespace.default.search.paths = /system/${LIB} | 244 | namespace.default.search.paths = /system/${LIB} |
245 | namespace.default.search.paths += /product/${LIB} | ||