安卓高手之路之ClassLoader(三)

本文详细解读了ZygoteInit初始化过程中第一个getClassLoader的实现原理,包括BootClassLoader的作用及其与普通ClassLoader的区别,以及如何通过环境变量控制类路径加载。通过实例分析,读者将了解到Android系统启动阶段的ClassLoader机制。

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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值