安卓高手之路之ClassLoader(三)

来源:互联网 发布:mac最好的视频播放器 编辑:程序博客网 时间:2024/06/06 08:30

由于看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。这很明显是一个装饰者模式。