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

public static void main(String argv[]) {

preload();

}

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

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

  1. public ClassLoader getClassLoader() {
  2. if (this.isPrimitive()) {
  3. return null;
  4. }
  5. ClassLoader loader = getClassLoaderImpl();
  6. if (loader == null) {
  7. loader = BootClassLoader.getInstance();
  8. }
  9. return loader;
  10. }

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

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

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

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

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

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

安卓高手之路之ClassLoader(三)的更多相关文章

  1. 安卓高手之路之 ClassLoader

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

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

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

  3. ClassLoader使用记录《安卓高手之路》

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

  4. 安卓高手之路之 WindowManager

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

  5. 安卓高手之路之PackageManagerservice

    源码位置:frameworks/base/core/java/android/content/pm/PackageParser.java 源文件路径:android\frameworks\base\s ...

  6. 安卓高手之路之java层Binder

    很多人一提到Binder就说代理模式,人云亦云的多,能理解精髓的少. 本篇文章就从设计角度分析一下java层BInder的设计目标,以及设计思路,设计缺陷,从而驾驭它. 对于[邦德儿]的理解, 从通信 ...

  7. [js高手之路] html5 canvas系列教程 - arcTo(弧度与二次,三次贝塞尔曲线以及在线工具)

    之前,我写了一个arc函数的用法:[js高手之路] html5 canvas系列教程 - arc绘制曲线图形(曲线,弧线,圆形). arcTo: cxt.arcTo( cx, cy, x2, y2, ...

  8. 云计算分布式大数据Hadoop实战高手之路第七讲Hadoop图文训练课程:通过HDFS的心跳来测试replication具体的工作机制和流程

    这一讲主要深入使用HDFS命令行工具操作Hadoop分布式集群,主要是通过实验的配置hdfs-site.xml文件的心跳来测试replication具体的工作和流程. 通过HDFS的心跳来测试repl ...

  9. 云计算分布式大数据Hadoop实战高手之路第八讲Hadoop图文训练课程:Hadoop文件系统的操作实战

    本讲通过实验的方式讲解Hadoop文件系统的操作. “云计算分布式大数据Hadoop实战高手之路”之完整发布目录 云计算分布式大数据实战技术Hadoop交流群:312494188,每天都会在群中发布云 ...

随机推荐

  1. GitHub最新命令使用教程

    一.创建github仓库并提交代码 1.在github创建public仓库 2.会生成一个git地址 https://github.com/ae6623/Zebra.git 3.在本地打开命令,在文件 ...

  2. OpenGL ES 3.0 图元组合和光栅化(三)

    图元是能够被OpenGL ES 绘制的几何物体,如三角形.线条或者精灵.在图元组合过程 中,对每个图元必须判断是否位于投影 截体内,如果图元不完全在平截体内部,将被视图平截体剪贴,如果完全在平截体外, ...

  3. 【Python】使用geopy由经纬度找地理信息

    from geopy.geocoders import Nominatim geolocator = Nominatim() location = geolocator.reverse("3 ...

  4. seajs 使用文档

    // seajs 的简单配置seajs.config({    base: "/scripts/",    alias: {        "jquery": ...

  5. Using a Microsoft Account to Logon and Resulting Internet Communication in Windows 8

    Using a Microsoft Account to Logon and Resulting Internet Communication in Windows 8 此主题尚未评级 - 评价此主题 ...

  6. NetCore中使用DynamicExpresso、Z.Expressions、LambdaParser进行安字符串求值

    例子如下: Z.Expressions从2.0开始支持了NetCore,但是收费的.其它两者免费.建议使用DynamicExpresso,免费而且速度快.LambdaParser目前支持太少. sta ...

  7. Maven 拾遗

    01. maven 概要 首先我把 maven 的概念快速的梳理一下,让我们快速地建立起一个比较精确的 maven 应用场景. maven 不是 ant,也不是 make,以前接触的构建工具,需要写一 ...

  8. cocos2d-js 越来越慢的定时器schedule 制作不变慢的定时器

    对于动画控制,可能一点误差,大家不会察觉,但如果多次循环累积或网络同步等,大家就会很清楚意识到schedule的误差问题. 首先做一个例子证明一下: var InaccuracyTestLayer = ...

  9. Java之创建对象>7.Avoid finalizers

    1.Finalizers are unpredictable, often dangerous, and generally unnecessary. 2.never do anything time ...

  10. 12、java5锁java.util.concurrent.locks.Lock之ReentrantLock

    JDK文档描述: public interface LockLock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作.此实现允许更灵活的结构,可以具有差别很大的属性,可 ...