Android源代码中PathClassLoader的实例是在何时何地创建的?

2024-05-07

当我研究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参数的值从哪里来呢?据了解库路径指包含本机库的目录列表,用于初始化值nativeLibraryDirectories,它是 DexPathList 对象的一个​​字段。因此,如果没有调用具有三个参数的第二个构造函数,则值如何nativeLibraryDirectories被初始化?那么应用程序如何找到其本机库呢?

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

希望有人能在这方面指导我。多谢。


那么它的价值在哪里库路径参数来自?

你可以使用Android Studio搜索来查找。履行“在路径中查找”,指定"Scope"参数到 Android 源目录。作为文本查找粘贴以下正则表达式:

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

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

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

使用相同的技术,您可以找出谁在打电话PathClassLoaderFactory#createClassLoader()功能:

In 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() calls createSystemServerClassLoader(),最终会调用 3 个 args 构造函数PathClassLoader.

其实我想知道谁决定了本地库目录?

从上面的代码可以看出,它默认为系统属性"java.library.path".

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android源代码中PathClassLoader的实例是在何时何地创建的? 的相关文章

随机推荐