3

在研究android源码的时候,注意到app中的通用类加载器是一个实例PathClassLoader,这个类中有两个构造函数。一种是这样的:

 public PathClassLoader(String dexPath, ClassLoader parent) {
     super(dexPath, null, null, parent);
 }

另一个是:

  public PathClassLoader(String dexPath, String libraryPath,
          ClassLoader parent) {
      super(dexPath, null, libraryPath, parent);
  }

但是在启动应用程序的过程中,我在源代码中找不到第二个构造函数的调用。那么 libraryPath 参数的值从何而来呢?众所周知,libraryPath是指包含原生库的目录列表,用于初始化nativeLibraryDirectoriesDexPathList 对象的一个​​字段 的值。那么如果没有调用三参数的第二个构造函数,怎么 nativeLibraryDirectories初始化的值呢?因此,应用程序如何找到它的原生库?

实际上,我想知道谁决定了 nativeLibraryDirectories 的值?

希望有人可以指导我。非常感谢。

4

1 回答 1

1

那么libraryPath参数的值从何而来呢?

您可以使用 Android Studio 搜索来找到它。执行“Find in Path”,将“Scope”参数指定为 Android 源目录。作为文本查找粘贴以下正则表达式:

new PathClassLoader\(\w+, \w+, \w+\)\;

这将构造函数的调用与三个参数相匹配。另外,不要忘记选中“正则表达式”复选框:

在此处输入图像描述

然后在预览选项卡中,您将能够看到结果:

在此处输入图像描述

使用相同的技术,您可以找出谁在调用PathClassLoaderFactory#createClassLoader()函数:

在此处输入图像描述

ZygoneInit.java您将能够找到以下代码:


    /**
     * Creates a PathClassLoader for the system server. It also creates
     * a shared namespace associated with the classloader to let it access
     * platform-private native libraries.
     */
    private static PathClassLoader createSystemServerClassLoader(String systemServerClasspath,
                                                                 int targetSdkVersion) {
      String librarySearchPath = System.getProperty("java.library.path");

      return PathClassLoaderFactory.createClassLoader(systemServerClasspath,
                                                      librarySearchPath,
                                                      null /* libraryPermittedPath */,
                                                      ClassLoader.getSystemClassLoader(),
                                                      targetSdkVersion,
                                                      true /* isNamespaceShared */);
    }

现在,回到你的问题。

所以如果没有调用带有三个参数的第二个构造函数......

有,ZygoteInit#handleSystemServerProcess()调用createSystemServerClassLoader(),最终会调用 3 个 args 构造函数PathClassLoader

实际上,我想知道谁决定了nativeLibraryDirectories的值?

从上面的代码可以看出,它默认为 system property "java.library.path"

于 2017-10-02T07:32:22.863 回答