博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android之ClassLoader的工作机制
阅读量:4570 次
发布时间:2019-06-08

本文共 1991 字,大约阅读时间需要 6 分钟。

ClassLoader双亲代理模型加载类的特点及作用

JVM以及Dalvik均是通过ClassLoader加载类,其源码如下
protected Class
loadClass(String className, boolean resolve) throws ClassNotFoundException {
Class
clazz = findLoadedClass(className); if (clazz == null) {
ClassNotFoundException suppressed = null; try {
clazz = parent.loadClass(className, false); } catch (ClassNotFoundException e) {
suppressed = e; } if (clazz == null) {
try {
clazz = findClass(className); } catch (ClassNotFoundException e) {
e.addSuppressed(suppressed); throw e; } } } return clazz; }
从源码分析可知loadClass方法先判断是否被loaded过,没有则通过parent加载,如此递归向上,称之位双亲委托。如果继承向上的路线中均没有被加载,才由当前ClassLoader负责加载。
特点:若某个类被根节点加载过,则在以后系统的整个生命周期内不会被重新加载。
作用:
    1.共享:Framework层级的类一旦被根节点加载就缓存在内存,以后不需重新加载。
    2.隔离:不同继承路线上的classLoader加载的类肯定不是同一个类,这样做可避免冒充核心库类,从而访问核心库包可见成员。例如,用户无法通过自定义java.lang.String类,来把系统的String类给替换掉。

Android应用中的ClassLoader对象

在Activity的onCreate方法中调用
ClassLoader classLoader = getClassLoader(); if (classLoader != null) {
lg.e("当前类对应的ClassLoader:" + classLoader.toString()); while (classLoader.getParent() != null) {
classLoader = classLoader.getParent(); lg.e("上个ClassLoader的父亲:" + classLoader.toString()); } }
输出结果如下,
其中,BootClassLoader在系统启动时创建,PathClassLoader在应用启动时创建,用于加载/data/app/com.coca.androidunitylab-1.apk。因此在一个应用中至少有两个classLoader。

DexClassLoader与PathClassLoader的异同

适用场景:
  
 
DexClassLoader可以加载jar/apk/dex,可以从SD卡中加载未安装的apk;
    PathClassLoader只能加载系统中已经安装过的apk;
两者的区别在于
optimizedDirectory参数,其在
BaseDexClassLoader构造方法中用于构建
DexPathList对象。
optimizedDirectory用来缓存需要加载的dex文件,并创建一个DexFile对象;如果它为null,那么会直接使用dex文件原有的路径来创建DexFile对象。
optimizedDirectory必须是内部存储路径
DexClassLoader由于可以指定
optimizedDirectory,从而可以加载外部dex,在使用的时候被复制到内部路径
optimizedDirectory内;而
PathClassLoader没指定
optimizedDirectory,因此只能加载内部dex文件(即已经安装的apk文件)。
相关链接:

转载于:https://www.cnblogs.com/linux007/p/5782677.html

你可能感兴趣的文章
【敏捷开发】结对编程
查看>>
[Linux] 进程
查看>>
Windows命令
查看>>
VBS常用
查看>>
---Ubuntu 下安装AS的问题汇总!
查看>>
images for flutter
查看>>
前端学习-jQuery
查看>>
学生管理系统(3:添加查询界面)
查看>>
身份验证(12)
查看>>
利用a标签特性解析地址(附加属性说明)
查看>>
C++面试经典题.......好紧张哦 要面试了
查看>>
工作第四天
查看>>
深入源码分析Linux进程模型
查看>>
算法第4章实践报告
查看>>
Topcoder srm 632 div2
查看>>
【转】正确的提问方式
查看>>
table表单中的属性
查看>>
MFC增强----任务对话框CTaskDialog类
查看>>
Reids 主从同步
查看>>
git基本命令
查看>>