summaryrefslogtreecommitdiff
path: root/libnativeloader/library_namespaces.cpp
Commit message (Collapse)AuthorAgeFilesLines
* Fix link apex for jni libsJooyung Han2021-06-221-9/+11
| | | | | | | | | | | | When library_path is ":" splitted list of .jar files, we should iterate over each .jar file path to link a proper APEX namespace for JNI lib. Bug: 169826971 Test: libnativeloader_test Test: move libicing to appsearch apex Merged-In: I3df47203d336036d0e015f9c5421b30a0377087f Change-Id: I3df47203d336036d0e015f9c5421b30a0377087f (cherry picked from commit 1313b0cdb6ba0022dc672bb920933f1d09eb3169)
* Drop ANDROID_ADDITIONAL_PUBLIC_LIBRARIES.Martin Stjernholm2021-05-131-1/+0
| | | | | | | | | | It's not needed any more since libarttest(d).so is loaded from the ART linker namespace. Test: art/test/testrunner/testrunner.py --target --64 --optimizing Bug: 130340935 Bug: 167578583 Change-Id: I785133e921277cb25360856e9af20fa681b54a3b
* Avoid loading external libraries from ARTs internal linker namespaceMartin Stjernholm2021-05-101-4/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | (reland). dlopen() calls in ART will use its own linker namespace (com_android_art). That's appropriate for internal libraries in the APEX, but not when ART loads libraries on behalf of external requests. In those cases we should instead use android_dlopen_ext to load them from the system namespace, i.e. the one that searches /system/lib(64). The linker config has been using allow_all_shared_libs, so any loads from com_android_art fall back to the system namespace, and hence dlopen() usually works regardless which namespace it ought to use. However we want to drop allow_all_shared_libs, so we need to figure out which dlopen's should use which namespace: 1. Several ART libraries are loaded on-demand, e.g. libart-compiler and libart-disassembler. There are also those going through the runtime plugin system, like libperfetto_hprofd and heapprofd_client_api. All these are internal or at least statically known (so we can provide links for them in the linker config), and should continue to use dlopen from the ART namespace. 2. libnativeloader loads the preloadable public libraries from system/etc/public.libraries.txt, and should use the system namespace for that. 3. libnativebridge loads the native bridge implementation specified through the command line (or ultimately the system property ro.dalvik.vm.native.bridge). It's not part of the ART APEX and not known statically, so the system namespace should be used. 4. libnativeloader also loads JNI libraries from classloader namespaces, but has a fallback if no such namespace can be found based on caller location. Fall back to the system namespace to handle libraries loaded during the preload phase in the zygote. 5. JVMTI agents are loaded by dalvik.system.VMDebug.attachAgent(). Treat these too as external libraries - they are loaded in a way similar to JNI libraries through OpenNativeLibrary in libnativeloader, so are covered by #4. They are normally loaded by apps with a classloader, but a special case is adbconnection which loads libjdwp.so in the ART APEX without one and hence falls back to the system namespace. We therefore need to create a link for it (https://r.android.com/1690889, https://r.android.com/1690795). All cases #2-#5 are covered by libnativeloader and libnativebridge. Introduce OpenSystemLibrary, and since libnativeloader depends on libnativebridge, put it in the latter to be usable from both. It's only an internal dependency not exposed in the APEX stubs. (Another possibility could be to put it in the generic toolbox lib libartbase, but it's split into -d and non-d variants, and we don't want to split libnative{loader,bridge} that way.) Since libnativeloader_test no longer needs to mock dlopen we can simplify it to a more regular test that loads the tested libs dynamically. This relands https://r.android.com/1673312 without setting ANDROID_ADDITIONAL_PUBLIC_LIBRARIES in run-test-jar, because that made libnativeloader try to preload internal libraries from the system namespace. Test: mmm art Test: atest art/libnativeloader Test: atest CtsJniTestCases Test: Cuttlefish app compat test that uses NDK translation Test: Manual tests with Android Studio TI agents (http://g/art-module-team/7Jy3Tg7LCh0) Test: art/test/testrunner/testrunner.py --target --64 --optimizing in chroot on cuttlefish Bug: 130340935 Change-Id: I7fb32faacc1c214402b58125d8190e97bbbcfad2
* Revert "Avoid loading external libraries from ARTs internal linker namespace."Calin Juravle2021-05-091-6/+4
| | | | | | | | This reverts commit 582448f29f2f2529202bf868d00ba5d3d3776bb6. Reason for revert: breaks tests Change-Id: I2e0b2a28d4644b314887673d4aef4f1094aea289
* Avoid loading external libraries from ARTs internal linker namespace.Martin Stjernholm2021-05-071-4/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | dlopen() calls in ART will use its own linker namespace (com_android_art). That's appropriate for internal libraries in the APEX, but not when ART loads libraries on behalf of external requests. In those cases we should instead use android_dlopen_ext to load them from the system namespace, i.e. the one that searches /system/lib(64). The linker config has been using allow_all_shared_libs, so any loads from com_android_art fall back to the system namespace, and hence dlopen() usually works regardless which namespace it ought to use. However we want to drop allow_all_shared_libs, so we need to figure out which dlopen's should use which namespace: 1. Several ART libraries are loaded on-demand, e.g. libart-compiler and libart-disassembler. There are also those going through the runtime plugin system, like libperfetto_hprofd and heapprofd_client_api. All these are internal or at least statically known (so we can provide links for them in the linker config), and should continue to use dlopen from the ART namespace. 2. libnativeloader loads the preloadable public libraries from system/etc/public.libraries.txt, and should use the system namespace for that. 3. libnativebridge loads the native bridge implementation specified through the command line (or ultimately the system property ro.dalvik.vm.native.bridge). It's not part of the ART APEX and not known statically, so the system namespace should be used. 4. libnativeloader also loads JNI libraries from classloader namespaces, but has a fallback if no such namespace can be found based on caller location. Fall back to the system namespace to handle libraries loaded during the preload phase in the zygote. 5. JVMTI agents are loaded by dalvik.system.VMDebug.attachAgent(). Treat these too as external libraries - they are loaded in a way similar to JNI libraries through OpenNativeLibrary in libnativeloader, so are covered by #4. They are normally loaded by apps with a classloader, but a special case is adbconnection which loads libjdwp.so in the ART APEX without one and hence falls back to the system namespace. We therefore need to create a link for it (https://r.android.com/1690889, https://r.android.com/1690795). All cases #2-#5 are covered by libnativeloader and libnativebridge. Introduce OpenSystemLibrary, and since libnativeloader depends on libnativebridge, put it in the latter to be usable from both. It's only an internal dependency not exposed in the APEX stubs. (Another possibility could be to put it in the generic toolbox lib libartbase, but it's split into -d and non-d variants, and we don't want to split libnative{loader,bridge} that way.) Since libnativeloader_test no longer needs to mock dlopen we can simplify it to a more regular test that loads the tested libs dynamically. Test: mmm art Test: atest art/libnativeloader Test: atest CtsJniTestCases Test: Cuttlefish app compat test that uses NDK translation Test: Manual tests with Android Studio TI agents (http://g/art-module-team/7Jy3Tg7LCh0) Bug: 130340935 Change-Id: I2513472c4e1c44f0fcb01a6b4f6eccbb03718f1d
* Extend Link() to allow linking to the default namespace.Martin Stjernholm2021-05-051-6/+6
| | | | | | | | | | | | The code path through native bridge and NDK translation should propagate nullptr as well. This to support a later change that changes the way native test libraries are loaded in ART run tests. Test: art/test/testrunner/testrunner.py --target --64 --optimizing Bug: 130340935 Change-Id: I934d11942e41ccc6d140a7044faa160b006166f1
* clean up statsd public librariesJooyung Han2020-09-081-11/+0
| | | | | | | | | | JNI library(libstat_jni) from statsd apex is handled via the build system and linkerconfig. Bug: 150767721 Test: presubmit Test: atest libnativeloader_test Change-Id: Ia7527f053508d5992c3eef209f77260f0d210e81
* libnativeloader: clean-up hard-coded public libsJooyung Han2020-09-081-30/+10
| | | | | | | | | | | | art, nn, i18n apexes provide some of libs listed in public.libraries.txt. The list of these apexes are now read from /linkerconfig/apex.libraries.config.txt generated by /system/bin/linkerconfig. Bug: 150767721 Test: cuttlefish boots Test: atest libnativeloader_test Change-Id: Ic603b42669dff89d5d3da2f6822312e827eddd86
* Rename linker greylist to exempt-listRyan Prichard2020-08-041-1/+1
| | | | | | | | | | | | Update language to comply with Android's inclusive language guidance See https://source.android.com/setup/contribute/respectful-code for reference #inclusivefixit Bug: http://b/162536543 Test: device boots Change-Id: Ia80fb2f3be6abdadbd061570d48a4ef0fefcfebc
* libnativeloader understands uses-native-library tagJiyong Park2020-07-241-5/+57
| | | | | | | | | | | | | | | | | | | | | | | Previously, libnativeloader provided all the partner-provided public shared libraries to apps unconditionally. Starting from Android S, apps targeting S (or higher) get only the libs that are explicited listed as dependencies using the <uses-native-library> tag in the app manifest. The libs not listed there are not available to the app even if they are registered as public libraries. The changed behavior affects new (S+) apps. Existing apps are not affected; they still get all the libraries. The implementation is rather straightforward. The library accepts a new parameter soname_list from the framework, which is actually from the <uses-native-library> tags of the app manifest. The list is used to filter the partner-provided libraries when the target sdk is > 30. Bug: 142191088 Test: atest CtsUsesNativeLibraryTest Merged-In: I52e23dda58fc69f51451c5dbeffd0a77125c9bff (cherry picked from commit e741dfd18dcd15f002bc1db9bd6634322e4eeef8) Change-Id: I52e23dda58fc69f51451c5dbeffd0a77125c9bff
* "Move ICU from ART APEX to i18n APEX" Attempt 2Victor Chang2020-05-071-0/+10
| | | | | | | | | | | | The change was previously submitted in https://r.android.com/1283897 "Calling @IntraCoreApi from core-icu4j should not cause Core platform API violation" https://r.android.com/1299494 Bug: 138994281 Test: m checkbuild on aosp_x86-userdebug Test: device boots Change-Id: Idb3e2450fca5d8300aef353fc1e4e99e24f04372
* Revert "Move ICU from ART APEX to i18n APEX"vichang2020-05-051-10/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Revert "Move v8 and libpac into i18n APEX" Revert "Move core-icu4j into I18n APEX" Revert "Move ICU from ART APEX into i18n APEX" Revert "Move core-icu4j into i18n APEX" Revert "Move libpac into i18n APEX" Revert "Add shared library into i18n APEX and add the required s..." Revert "Make com_android_i18n namespace visible" Revert submission 1299494-i18nApex Reason for revert: Breaking aosp_x86-eng on aosp-master Reverted Changes: I30fc3735b:Move ICU from ART APEX to i18n APEX Icb7e98b5c:Calling @IntraCoreApi from core-icu4j should not c... Ic7de63fe3:Move core-icu4j into I18n APEX I65b97bdba:Make com_android_i18n namespace visible Ia4c83bc15:Move v8 and libpac into i18n APEX I10e6d4948:Move core-icu4j into i18n APEX I8d989cad7:Move ICU from ART APEX into i18n APEX I72216ca12:Move ICU into i18n APEX Ief9dace85:Add shared library into i18n APEX and add the requ... I7d97a10ba:Move libpac into i18n APEX I90fff9c55:Move ICU from ART APEX into i18n APEX Change-Id: I516a8d290e3a3cc2b45d71ba5400364b0478a57a
* Move ICU from ART APEX to i18n APEXVictor Chang2020-05-051-0/+10
| | | | | | | | | | | | | | It involves a change of boot class path to use core-icu4j from i18n APEX. Bug: 138994281 Test: device boots Test: m build-art-target-tests Test: CtsJniTestCases Test: atest libnativeloader_test Test: ./art/test/testrunner/run_build_test_target.py -j80 art-test Test: art/build/apex/runtests.sh Change-Id: I30fc3735be760cba48856cd102852d2a6c796374
* Use ART_TARGET_ANDROID instead of __ANDROID__Nicolas Geoffray2020-04-271-0/+5
| | | | | | | | | | | On golem, we build for ART_TARGET_LINUX, which doesn't have support for linkerconfig. Therefore, guard all linker namespace code on ART_TARGET_ANDROID instead of __ANDROID__ (which is unfortunately not under ART's control). Test: build for golem and run Bug: 154074847 Change-Id: I7a2b81918177704b42d8aafbd6d7e9d06d34e5f4
* libnativeloader: Remove hard-coded cronetJooyung Han2020-03-041-11/+0
| | | | | | | | | | Because cronet apex sets its jni_libs, its classloader-namespace is linked automatically via jni.config.txt. Bug: 143733063 Bug: 146420818 Test: atest CronetApiTest Change-Id: I7ae0f7bc60f09e7e384abd1f0a1e4f8f90f64052
* Loading JNI libraries in an APEXJooyung Han2020-03-041-17/+52
| | | | | | | | | | | | | | | | To load JNI libraries in an APEX, libnativeloader relies on jni.config.txt file which contains available JNI libraries for APEX namespaces: com_android_foo libfoo_jni.so:... com_android_bar libbar_jni.so:... This file is generated by linkerconfig. Bug: 143733063 Test: cuttlestone boots (For now, no behavioral changes because jni.config.txt is empty) Change-Id: I066de90a73875118be53972e50d076061922d762
* Use a different VNDK namespace for product appsJustin Yun2020-02-211-5/+17
| | | | | | | | | | | | As product partition may have a different VNDK version than that of vendor partition, they may not share the same VNDK namespace for their apps. Define a new vndk_product namespace in the system section for product apps that uses ro.product.vndk.version. Bug: 149063221 Test: atest libnativeloader_test Change-Id: I1bb76617104a49b0d11af13d2f116959a18390a3
* Rename APEX NamespaceKiyoung Kim2020-02-211-4/+4
| | | | | | | | | | | | | | | Current APEX Namespace is named with APEX name itself, which also uses .(dot) so linker configuration can keep the syntax safe. For example, if there are APEX modules named 'A' and 'A.link.A', then 'namespace.A.link.A.link.A = a.so' phrase can be ambiguous from the linker. To allow any additional linker syntax in the future, we should avoid dot separator from the namespace name. Bug: 148826508 Test: m -j passed Test: boot succeeded from cuttlefish and walleye Change-Id: I11b6da1b59b4ebf3016f1d783636c7e5d0f8309a
* Add libstats_jni to linkerconfig/namespaceJeffrey Huang2020-02-161-0/+11
| | | | | | | | | As part of statsd becoming a Mainline module, moving libstats_jni to the apex requires adding it to the linker namespace here. Bug: 145922701 Test: m -j Change-Id: Ifcbea47cc36604e4a86df9af711d678b23012724
* Remove old "platform" namespace name in a few remaining places.Martin Stjernholm2020-02-121-5/+5
| | | | | | | | Follow-up to https://r.android.com/1220299. Test: atest libnativeloader_test Bug: 147987608 Change-Id: Ib5849c9a9f5dbde1bf2a85aad2fe96cc2a394f31
* Use apex name for apex linker namespaceJooyung Han2020-02-111-3/+3
| | | | | | | | | Linkerconfig now uses apex_names to automatically generate linker namespaces from apexes. Bug: 148826508 Test: build / boot Change-Id: Id7fa68531033124727e618284af4fd2a61bdd85f
* Use product vndk version for product appsJustin Yun2020-02-101-2/+6
| | | | | | | | | | ro.vndk.version is only for vendor modules. Product modules use different vndk version that is set in ro.product.vndk.version. Use product vndk version for creating namespaces for product apps. Bug: 148823287 Test: atest libnativeloader_test Change-Id: Iade4b3ca846f1e47e5138f2ceda81bf188276a91
* One more missing Result::ok() call in art/libnativeloaderBernie Innocenti2020-02-091-1/+1
| | | | | | | No functionality change. Test: m Change-Id: I3056596785447c5fb7410bcfc7d037eb295affc4
* Convert art/ to Result::ok()Bernie Innocenti2020-02-071-13/+13
| | | | | | | No functionality changes, this is a mechanical cleanup. Test: m Change-Id: I10030314ad8a06d49a63f1e2f3c5aa5b484e34b6
* Update platform namespace nameKiyoung Kim2020-02-071-4/+4
| | | | | | | | | | | Platform namespace has been renamed as 'system' from linkerconfig generator. To meet this requirement, libnativeloader should search for namespace 'system' rather than namespace 'platform'. Bug: 147987608 Test: m -j passed Test: atest libnativeloader_test passed Change-Id: I23d865ac71a80619f291eb9ae0761a2cad5df352
* Update libnativeloader dependency on libnativehelperOrion Hodson2020-02-061-1/+1
| | | | | | | Only requires header library dependency. Test: m Change-Id: I84de37651f4cb01bdaaa2b354f0a71058a5772f8
* Use valid pointer for app_main_namespace_Orion Hodson2020-02-061-4/+4
| | | | | | Test: device boots Test: atest libnativeloader_test Change-Id: I5c20f7f5c65a707fbeacf644e24b95ffab370cae
* Make product libs available to unbundled product apks.Justin Yun2020-01-071-1/+2
| | | | | | | | | | | | | | Unbundling product apps must be triggerred if the target is enforcing the product interfaces. The device must have ro.product.vndk.version property if its product interface is enforced. Unbundled product apps can use product libraries. Bug: 144534640 Bug: 127738095 Bug: 128557860 Test: check boot and basic features Change-Id: I32b2a1bd3e4f62b6acdbfab6bd277ec1132478a2
* Add public lib of Cronet apex mainlineLuke Huang2019-12-171-0/+11
| | | | | | | | | | | | | This is a workaround since apex module library path is not supported in jni Bug: 139397529 Bug: 145474221 Test: Build Test: manual test with Cronet Test: atest CtsJniTestCases Test: atest libnativeloader_test Change-Id: Ifd8aa85bd78e95131b2ce3eab0ad32c2bb19cee2
* Use a different name for shared classloader namespace, to help debugging.Martin Stjernholm2019-11-131-1/+15
| | | | | | Test: atest libnativeloader_test Bug: 130388701 Change-Id: I6dbb53cac7fb7ac8fb5178611a164c83c2ab59ba
* Use art_defaults in libnative*, for consistency.Martin Stjernholm2019-10-211-4/+2
| | | | | | | | | | | | | Also change to //art:__submodules__ for consistent internal visibility, and some TODO comment corrections. Test: m WITH_TIDY=1 Test: build & boot Test: atest art/libnativeloader/test (no new errors, but existing ones on arm64 - b/142896688) Test: (atest art/libnativebridge/tests doesn't work at all, but that's not new - b/142897320) Bug: 137364733 Bug: 133140750 Change-Id: If9ddb5a597eea3606342c3625dcdb3bcf5d19041
* Move libnative{bridge,loader} to art/Orion Hodson2019-10-111-0/+319
This change moves system/core/libnative{bridge,loader} under art/. Bug: 137364733 Test: m Change-Id: I9be7333d00fcd3f36cd80520e50a30ea840187ad