安卓高手之路之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。这很明显是一个装饰者模式。
安卓高手之路之ClassLoader(三)相关推荐
- 安卓高手之路之 ClassLoader
我不喜欢那些泛泛而谈的去讲那些形而上学的道理,更不喜欢记那些既定的东西.靠记忆去弥补思考的人,容易陷入人云亦云的境地,最后必定被记忆所围困,而最终消亡的是创造力.希望这个高手之路系列能够记录我学习安卓 ...
- 安卓高手之路之ClassLoader(总结篇)
安卓系统对ClassLoader的设计可谓别有用心.前面分析过,赋值的地方如下: const char* envStr = getenv("CLASSPATH"); if (env ...
- [置顶] 安卓高手之路之ClassLoader(二)
因为ClassLoader一定与虚拟机的启动有关系,那么必须从Zygote的启动开始看代码.下面就分析一下这些代码,行数不多: int main(int argc, const char* const ...
- 安卓高手之路之ClassLoader(二)
因为ClassLoader一定与虚拟机的启动有关系,那么必须从Zygote的启动开始看代码.下面就分析一下这些代码,行数不多: int main(int argc, const char* const ...
- 安卓高手之路之ClassLoader(四)
显然,应用层的classLoader绝对不仅仅是一个systemclassloader那么简单.那么他一定是与PackageInfo连接起来的.而这个连接的纽带就是ContextImpl.Contex ...
- 安卓高手之路 图形系统(4 Measure的算法)
安卓高手之路 图形系统(4 Measure的算法) - 修补C++ - ITeye技术网站 Java代码 /** * Does the hard part of measureChildren: ...
- 安卓高手之路 图形系统(2)----------------基于Binder的架构思路)
在学习安卓的时候最迷惑的就是Binder.图形框架的理解与Binder的理解分不开.前面一篇 [ 安卓高手之路之java层Binder 从代码角度分析了Java层Binder的实现原理.在C++层,这 ...
- 安卓高手之路之 图形系统之 图形框架(1)
安卓图形系统理解起来并不容易.那是因为系统对于数据的封装非常多,图形模块与输入输出,应用程序管理等模块参杂在一起.让开发者很难摸清其中的脉络.下面先给出最简单的一张图. 这张图 ...
- [置顶] 安卓高手之路之 WindowManager
安卓中的画面不是纯粹由window组成.而是改成了window+view的组织模式.window是一个顶层窗口的概念.view就相当于在window内的控件.而subwindow则是依附于window ...
最新文章
- php读取文件内容不全,php读取文件内容的三种方法
- 使用 matlab 产生GK101任意波数据文件的方法
- 虚拟机Linux和宿主机传输文件
- Qt 学习之路 :Qt 线程相关类
- 超市管理系统(JavaWeb版)
- Google Java Style Guide
- android 电影放到哪个文件夹里,手机爱奇艺下载的电影保存到哪个文件夹里
- jquery 打开网页自动弹出遮罩层或点击弹出遮罩层
- 决胜B端(一)概述篇-走进B端
- 为什么所有APP都想访问你的通讯录?
- linux编译cu文件,Linux编译安装RTL8192CU芯片驱动
- 国产服务器芯片厂商排名,x86服务器国内厂家(国产服务器厂商排名)
- Docker+Ovs构建SDN网络
- JVM - 工欲善其事必先利其器之虚拟机工具(下)
- Windows 系统中添加防火墙规则
- 微信小程序 27 进度条的动态实现和搜索框、热搜榜的静态搭建
- 45种美丽、免费的字体,适用于潮流的网页设计
- eslint代码自动修复
- mstsc身份验证错误,要求的函数不受支持。
- 0型系统, I型系统, II型系统对PID的影响
热门文章
- double java 坑,Java中四则运算的那些坑
- c efcore.mysql_EF Core在mysql中调用存储过程
- code vs 把所有行拼接成一行_关于SQL Server将一列的多行内容拼接成一行的问题讨论...
- python安装旧版的opencv(3.1.0为例)
- AD域中NTP服务器的配置
- Jupyter on Kubernetes机器学习-MLflow
- Centos下运行gpg --gen-key生成key时出现卡住解决方案笔记
- 部署Awstats日志分析系统
- “N+虚拟现实行业高峰论坛”成功举办,共创VR美好未来
- Ember.js如何与后端服务交互?adapter、store、ember data关系揭秘