那么它的价值在哪里库路径参数来自?
你可以使用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"
.