1 /*
2  * Copyright (C) 2019 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 // This namespace exposes externally accessible libraries from the ART APEX.
18 // Keep in sync with the "art" namespace in art/build/apex/ld.config.txt.
19 
20 #include "linkerconfig/namespacebuilder.h"
21 
22 using android::linkerconfig::modules::ApexInfo;
23 using android::linkerconfig::modules::AsanPath;
24 using android::linkerconfig::modules::Namespace;
25 
26 namespace android {
27 namespace linkerconfig {
28 namespace contents {
29 
30 Namespace BuildArtNamespace([[maybe_unused]] const Context& ctx,
31                             [[maybe_unused]] const ApexInfo& apex) {
32   // Make the namespace visible to allow links to be created at runtime, e.g.
33   // through android_link_namespaces in libnativeloader. That is not applicable
34   // to the vendor section.
35   Namespace ns(apex.namespace_name,
36                /*is_isolated=*/true,
37                /*is_visible=*/!ctx.IsVendorSection());
38 
39   ns.AddSearchPath("/apex/com.android.art/${LIB}", AsanPath::SAME_PATH);
40   ns.AddPermittedPath("/system/${LIB}");
41 
42   if (ctx.IsApexBinaryConfig()) {
43     // JVMTI libraries used in ART testing are located under /data; dalvikvm has
44     // to be able to dlopen them.
45     // TODO(b/129534335): Move this to the linker configuration of the Test ART
46     // APEX when it is available.
47     ns.AddPermittedPath("/data");
48 
49     // odex files are in /system/framework and /apex/com.android.art/javalib.
50     // dalvikvm has to be able to dlopen the files for CTS.
51     ns.AddPermittedPath("/system/framework");
52   }
53 
54   // Primary boot image is loaded through dlopen, so pass the primary boot image
55   // to the list of paths.
56   ns.AddPermittedPath("/apex/com.android.art/javalib", AsanPath::SAME_PATH);
57 
58   // Need allow_all_shared_libs to let libart.so dlopen oat files in
59   // /system/framework and /data.
60   // TODO(b/130340935): Use a dynamically created linker namespace similar to
61   // classloader-namespace for oat files, and tighten this up.
62   ns.GetLink(ctx.GetSystemNamespaceName()).AllowAllSharedLibs();
63 
64   ns.AddProvides(std::vector{
65       "libandroidicu.so",
66       "libandroidio.so",
67       "libdexfile_external.so",
68       "libdexfiled_external.so",
69       "libnativebridge.so",
70       "libnativehelper.so",
71       "libnativeloader.so",
72       // TODO(b/122876336): Remove libpac.so once it's migrated to Webview
73       "libpac.so",
74       // TODO(b/120786417 or b/134659294): libicuuc.so
75       // and libicui18n.so are kept for app compat.
76       "libicui18n.so",
77       "libicuuc.so",
78   });
79   ns.AddRequires(std::vector{
80       "libadbconnection_client.so",
81       "libc.so",
82       "libdl.so",
83       "libdl_android.so",
84       "liblog.so",
85       "libm.so",
86       // not listed in the manifest, but add here to preserve original configuration
87       "libneuralnetworks.so",
88   });
89 
90   return ns;
91 }
92 
93 }  // namespace contents
94 }  // namespace linkerconfig
95 }  // namespace android
96