Framework and system_server classes can access public vendor libraries

This CL fixes a regression caused by [1] which introduced
<uses-native-library> tag [2]. With the change, public vendor libraries
[3] became accessible only when they are listed in the caller's
AndroidManifest.xml using the new tag. However, this caused a problem to
the places where AndroidManifest.xml doesn't exist: framework and
system_server classes. For those cases, [1] incorrectly used a null list
as the requested native libraries, and as a result, no public vendor
libraries were accessible.

This CL fixes the issue by not doing the filtering for the class loaders
created for non-app contexts like zygote or system_server. Specifically,
it uses the magic keyword "ALL" which let libnativeloader.so
accept all public vendor libraries.

[1] 6a5b8b1f6d
[2] https://developer.android.com/guide/topics/manifest/uses-native-library-element
[3] https://source.android.com/devices/tech/config/namespaces_libraries#adding-additional-native-libraries

Bug: 205164833
Test: libcuttlefish_fs.so is loaded when built with the other CLs in the
same topic

Change-Id: Id92c59642773851d70d05a05f43eb5873e9de86b
This commit is contained in:
Jiyong Park
2021-11-10 21:57:46 +09:00
parent 04f4216496
commit 24c57c33ea

View File

@@ -24,6 +24,7 @@ import dalvik.system.DelegateLastClassLoader;
import dalvik.system.DexClassLoader;
import dalvik.system.PathClassLoader;
import java.util.ArrayList;
import java.util.List;
/**
@@ -100,14 +101,25 @@ public class ClassLoaderFactory {
}
/**
* Same as {@code createClassLoader} below, but passes a null list of shared
* libraries.
* Same as {@code createClassLoader} below, but passes a null list of shared libraries. This
* method is used only to load platform classes (i.e. those in framework.jar or services.jar),
* and MUST NOT be used for loading untrusted classes, especially the app classes. For the
* latter case, use the below method which accepts list of shared libraries so that the classes
* don't have unlimited access to all shared libraries.
*/
public static ClassLoader createClassLoader(String dexPath,
String librarySearchPath, String libraryPermittedPath, ClassLoader parent,
int targetSdkVersion, boolean isNamespaceShared, String classLoaderName) {
// b/205164833: allow framework classes to have access to all public vendor libraries.
// This is because those classes are part of the platform and don't have an app manifest
// where required libraries can be specified using the <uses-native-library> tag.
// Note that this still does not give access to "private" vendor libraries.
List<String> nativeSharedLibraries = new ArrayList<>();
nativeSharedLibraries.add("ALL");
return createClassLoader(dexPath, librarySearchPath, libraryPermittedPath,
parent, targetSdkVersion, isNamespaceShared, classLoaderName, null, null, null);
parent, targetSdkVersion, isNamespaceShared, classLoaderName, null,
nativeSharedLibraries, null);
}
/**