由于看C++和C代码看得很累,很辛苦。上一章终于解脱到java代码中来了。 第一个getClassLoader发生在main的preload方法中,

public static void main(String argv[]) {

preload();

}

    static void preload() {
preloadClasses();
preloadResources();
}
 private static void preloadClasses() {
final VMRuntime runtime = VMRuntime.getRuntime();
InputStream is = ZygoteInit.class.getClassLoader().getResourceAsStream(
PRELOADED_CLASSES);

可以看到,直接调用了getClassLoader()这个classLoader是个什么东西呢。

 public ClassLoader getClassLoader() {
if (this.isPrimitive()) {
return null;
}
ClassLoader loader = getClassLoaderImpl();
if (loader == null) {
loader = BootClassLoader.getInstance();
}
return loader;
}

由于这个类是没有classloader的,因此调用的是BootClassLoader.getInstance().

/**
* Provides an explicit representation of the boot class loader. It sits at the
* head of the class loader chain and delegates requests to the VM's internal
* class loading mechanism.
*/
class BootClassLoader extends ClassLoader {

现在明白了吧。BootClassLoader原来就是第一个class的ClassLoader。对于Zygote是com.android.internal.os.ZygoteInit,对于其他的,那就是com.android.internal.os.RuntimeInit 的classloader。也就是init.rc中指定的BOOTCLASSPATH指定的classLoader。

现在看另外一个方法也就是RuntimeInit 的加载

 const char* envStr = getenv("CLASSPATH");
if (envStr != NULL) {
gDvm.classPathStr = strdup(envStr);
} else {
gDvm.classPathStr = strdup(".");
}
handleChildProc
else {
cloader = ClassLoader.getSystemClassLoader();
}
try {
ZygoteInit.invokeStaticMain(cloader, className, mainArgs);

ClassLoader.getSystemClassLoader();这个classLoader与普通的classLoader又有不同。这个是一个PathClassLoader 这个以BootClassLoader作为父Loader。这很明显是一个装饰者模式。

安卓高手之路之ClassLoader(三)相关推荐

  1. 安卓高手之路之 ClassLoader

    我不喜欢那些泛泛而谈的去讲那些形而上学的道理,更不喜欢记那些既定的东西.靠记忆去弥补思考的人,容易陷入人云亦云的境地,最后必定被记忆所围困,而最终消亡的是创造力.希望这个高手之路系列能够记录我学习安卓 ...

  2. 安卓高手之路之ClassLoader(总结篇)

    安卓系统对ClassLoader的设计可谓别有用心.前面分析过,赋值的地方如下: const char* envStr = getenv("CLASSPATH"); if (env ...

  3. [置顶] 安卓高手之路之ClassLoader(二)

    因为ClassLoader一定与虚拟机的启动有关系,那么必须从Zygote的启动开始看代码.下面就分析一下这些代码,行数不多: int main(int argc, const char* const ...

  4. 安卓高手之路之ClassLoader(二)

    因为ClassLoader一定与虚拟机的启动有关系,那么必须从Zygote的启动开始看代码.下面就分析一下这些代码,行数不多: int main(int argc, const char* const ...

  5. 安卓高手之路之ClassLoader(四)

    显然,应用层的classLoader绝对不仅仅是一个systemclassloader那么简单.那么他一定是与PackageInfo连接起来的.而这个连接的纽带就是ContextImpl.Contex ...

  6. 安卓高手之路 图形系统(4 Measure的算法)

    安卓高手之路 图形系统(4 Measure的算法) - 修补C++ - ITeye技术网站 Java代码   /** * Does the hard part of measureChildren:  ...

  7. 安卓高手之路 图形系统(2)----------------基于Binder的架构思路)

    在学习安卓的时候最迷惑的就是Binder.图形框架的理解与Binder的理解分不开.前面一篇 [ 安卓高手之路之java层Binder 从代码角度分析了Java层Binder的实现原理.在C++层,这 ...

  8. 安卓高手之路之 图形系统之 图形框架(1)

    安卓图形系统理解起来并不容易.那是因为系统对于数据的封装非常多,图形模块与输入输出,应用程序管理等模块参杂在一起.让开发者很难摸清其中的脉络.下面先给出最简单的一张图.             这张图 ...

  9. [置顶] 安卓高手之路之 WindowManager

    安卓中的画面不是纯粹由window组成.而是改成了window+view的组织模式.window是一个顶层窗口的概念.view就相当于在window内的控件.而subwindow则是依附于window ...

最新文章

  1. php读取文件内容不全,php读取文件内容的三种方法
  2. 使用 matlab 产生GK101任意波数据文件的方法
  3. 虚拟机Linux和宿主机传输文件
  4. Qt 学习之路 :Qt 线程相关类
  5. 超市管理系统(JavaWeb版)
  6. Google Java Style Guide
  7. android 电影放到哪个文件夹里,手机爱奇艺下载的电影保存到哪个文件夹里
  8. jquery 打开网页自动弹出遮罩层或点击弹出遮罩层
  9. 决胜B端(一)概述篇-走进B端
  10. 为什么所有APP都想访问你的通讯录?
  11. linux编译cu文件,Linux编译安装RTL8192CU芯片驱动
  12. 国产服务器芯片厂商排名,x86服务器国内厂家(国产服务器厂商排名)
  13. Docker+Ovs构建SDN网络
  14. JVM - 工欲善其事必先利其器之虚拟机工具(下)
  15. Windows 系统中添加防火墙规则
  16. 微信小程序 27 进度条的动态实现和搜索框、热搜榜的静态搭建
  17. 45种美丽、免费的字体,适用于潮流的网页设计
  18. eslint代码自动修复
  19. mstsc身份验证错误,要求的函数不受支持。
  20. 0型系统, I型系统, II型系统对PID的影响

热门文章

  1. double java 坑,Java中四则运算的那些坑
  2. c efcore.mysql_EF Core在mysql中调用存储过程
  3. code vs 把所有行拼接成一行_关于SQL Server将一列的多行内容拼接成一行的问题讨论...
  4. python安装旧版的opencv(3.1.0为例)
  5. AD域中NTP服务器的配置
  6. Jupyter on Kubernetes机器学习-MLflow
  7. Centos下运行gpg --gen-key生成key时出现卡住解决方案笔记
  8. 部署Awstats日志分析系统
  9. “N+虚拟现实行业高峰论坛”成功举办,共创VR美好未来
  10. Ember.js如何与后端服务交互?adapter、store、ember data关系揭秘