简单介绍4种在Android上存在的Class Loader的用途和SUN JVM实现的差异。
Bootstrap Class Loader
Android有个环境变量$BOOTCLASSPATH用来指定需要Zygote加载的JAR。
VM内部的Boostrap Class Loader负责根据$BOOTCLASSPATH指定的JAR清单加载启动类。
相比SUN JVM的Bootstrap Class Loader,Android能够加载的JAR和类要多的多,无疑增加了安全风险。不过Dalvik都没有SecurityManager,who care?
BootClassLoader
单例方式存在。
Bootstrap Class Loader存在于VM内部,在用户空间需要有个ClassLoader对象来表示——这就是BootClassLoader的存在价值。
System Class Loader
单例方式存在。
该ClassLoader在Android Runtime上较少使用,个人觉得System Class Loader仅为了便于legacy code的porting。
Application Class Loader
每个Application都有一个对应得Application ClassLoader。多个Applicaton共进程的话,那么进程中会存在多个Application Class Loader。
与我们通常认知不同的是,Application Class Loader的parent不是System Class Loader而是Bootstrap Class Loader。Google如此做应该是为了性能考虑,但这样会使我们在两个Application Class Loader间共享数据变得困难很多。