【Android】 ClassLoader 知识点提炼

1.Java中的 ClassLoader

1.1 、ClassLoader的类型

        Java 中的类加载器主要有两种类型,即系统类加载器和自定义类加载器。其中系统类
加载器包括3种,分别是 Bootstrap ClassLoader、Extensions ClassLoader 和 Application
ClassLoader。

1.1.1.Bootstrap ClassLoader (引导类加载器)

        C/C++代码实现的加载器,用于加载指定的JDK的核心类库,比如java.lang、java.uti.等这些系统类。它用来加载以下目录中的类库:

  • $JAVA_HOME/jre/lib目录
  • -Xbootclasspath 参数指定的目录

        Java虚拟机的启动就是通过 Bootstrap ClassLoader 创建一个初始类来完成的。由于Bootstrap ClassLoader 是使用 C/C++语言实现的,所以该加载器不能被 Java代码访问到。 

1.1.2.Extensions ClassLoader(拓展类加载器) 

        Java 中的实现类为 ExtClassLoader,因此可以简称为 ExtClassLoader,它用于加载Java的拓展类,提供除了系统类之外的额外功能。ExtClassLoader 用来加载以下目录中的类库:

  • 加载$JAVA_HOME/jre/lib/ext目录
  • 系统属性java.ext.dir 所指定的目录

1.1.3.Application ClassLoader (应用程序类加载器)

        Java 中的实现类为AppClassLoader,因此可以简称为 AppClassLoader,同时它又可以称作 System ClassLoader (系统类加载器),这是因为AppClassLoader 可以通过 ClassLoader的getSystemClassLoader 方法获取到。它用来加载以下目录中的类库:

  • 当前程序的Classpath目录。
  • 系统属性java.classpath 指定的目录。

1.1.4.Custom ClassLoader (自定义类加载器)

        除了系统提供的类加载器,还可以自定义类加载器,自定义类加载器通过继承java.lang.ClassLoader 类的方式来实现自己的类加载器,Extensions ClassLoader 和 App
ClassLoader也继承了java.lang.ClassLoader 类。

1.1.5.ClassLoader 继承关系图

2.Android中的 ClassLoader 

2.1. ClassLoader的类型

        Java 中的 ClassLoader 可以加载jar 文件和 Class 文件 (本质是加载CIass文件),这一点在Android中并不适用,因为无论是 DVM还是ART,它们加载的不再是 Class文件,而是 dex 文件。

        Android 中的 ClassLoader 类型和Java 中的ClassLoader 类型类似,也分为两种类型
分别是系统类加载器和自定义加载器。其中系统类加载器主要包括 3 种,分别是
BootClassLoader、 PathClassLoader 和 DexClassLoader。

2.1.1. BootClassLoader

        Android 系统启动时会使用 BootClassLoader 来预加载常用类,与SDK 中的 Bootstrap
ClassLoader 不同,它并不是由 C/C++代码实现的,而是由 Java 实现的。

2.1.2. DexClassLoader

        DexClassLoader 可以加载 dex 文件以及包含 dex的压缩文件(apk 和jar 文件)不管加
载哪种文件,最终都要加载 dex 文件。

2.1.3. PathClassLoader

        Android 系统使用 PathClassLoader 来加载系统类和应用程序的类。PathClassLoader
默认了参数 optimizedDirectory 的值为/data/dalvik-cache,很显然 PathClassLoader 无法
定义解压的dex文件存储路径,因此 PathClassLoader 通常用来加载已经安装的apk的dex
文件(安装的apk的dex 文件会存储在/data/dalvik-cache 中)。

2.1.4. ClassLoader 继承关系图

  • ClassLoader 是一个抽象类,其中定义了 ClassLoader 的主要功能。BootClassLoader是它的内部类。
  • SecureClassLoader 类和JDK8中的 SecureClassLoader 类的代码是一样的,它继承了抽象类 ClassLoader。SecureClassLoader 并不是 CassLoader 的实现类,而是拓展了ClassLoader类加人了权限方面的功能,加强了ClassLoader 的安全性。
  • URLClassLoader 类和JDK8中的URLCIssLoader 类的代码是一样的,它继承自SecureClassLoader,用来通过URL路径从jar 文件和文件夹中加载类和资源。
  • InMemoryDexClassLoader 是 Android 8.0新增的类加载器,继承自BaseDexClassLoader,用于加载内存中的dex 文件。
  • BaseDexClassLoader 继承自 ClassLoader,是抽象类 ClassLoader 的具体实现类PathClassLoader、DexClassLoader 和InMemoryDexClassLoader 都继承自它。

2.2 ClassLoader的加载过程

2.2.1. BootClassLoader的加载过程

         BootClassLoader 是在 Zygote进程的 ZygoteInit的入口方法(main)中被创建的,用于加载preloaded-classes 文件中存有的预加载类。预加载属于拿空间换时间的策略,Zygote 环境配置得越健全越通用,应用程序进程需要单独做的事情也就越少,预加载除了预加载类,还有预加载资源和预加载共享库。

一些预加载类如下图所示:

2.2.2. PathClassLoader的加载过程 

        PathClassLoader 是在SystemServer 进程中采用工厂模式创建的。

3.双亲委托模式

        类加载器查找 Class 所采用的是双亲委托模式,所谓双亲委托模式就是首先判断该Class 是否已经加载,如果没有则不是自身去查找而是委托给父加载器进行查找,这样依次进行递归,直到委托到最顶层的 Bootstrap ClassLoader,如果 Bootstrap ClassLoader 找到了该 Class,就会直接返回,如果没找到,则继续依次向下查找,如果还没找到则最后会交由自身去查找。

通俗的讲就是你要找一件玩具,你找不到就问你父亲有没有见过这个玩具(是否已经加载),你父亲没见过就问你父亲的父亲有没有见过,一直往上问,如果谁见过就把玩具找出来给你。如果最大的老父亲还是没见过他就帮你找,找不到他就歇下了叫儿子帮忙找,一直往下,找到就给你,没找到你就自己找。

4.Java中的ClassLoader与Android中ClassLoader的区别

  • Java的引导类加载器是由C++编写的,Android中的引导类加载器则是用Java编写的。
  • 由于Android 中加载的不再是 Class 文件,因此Android 中没有 ExtClassLoader和AppClassLoader,替代它们的是 PathClassLoader和 DexClassLoader。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/274963.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从0到1入门C++编程——12 演讲比赛流程管理系统

文章目录 一、创建类并显示菜单二、退出管理系统三、开始演讲比赛四、查看往届记录五、清空比赛记录六、案例源代码 演讲比赛流程管理系统 比赛规则:演讲比赛共有12个人参加,比赛分两轮进行,第一轮为淘汰赛,第二轮为决赛。每名选手…

Java中 final、finally、finalize 有什么区别?

1、典型回答 final、finally、finalize 是 Java 中三个不同的关键字,它们除了长得像之外,其他的(作用和含义)完全不同。 它们三个的区别就好像:雷、雷锋、雷峰塔之间的区别。(是三个完全不同的东西&#…

STM32---通用定时器(一)理论基础

写在前面:在STM32F103中有众多的定时器,其中包括两个基本定时器,基本定时器的内容已经在上节进行了介绍,基本定时器的功能、结构、使用都较为简单。而STM32F1中还含有4个通用定时器(TIM2\3\4\5),这些定时器…

【c++】特殊类的设计

💻文章目录 📄前言🌻特殊类的设计无法被继承的类只能在堆开辟空间的类无法被拷贝的类只能在栈开辟空间的类 🌺单例模式饿汉模式懒汉模式 📓总结 📄前言 你可听说过只能在堆上创建的类、无法被拷贝的类、甚至…

14双体系Java学习之数组

数组 ★小贴士 数组中保存固定数量的值,声明数组时需要制定数组中元素的类型,数组的长度在创建数组时设定。 保存数据的数据结构有很多,Java的标准函数库中就包含了许多复杂的数据结构,比如map、tree和set,以后会讲解的…

如何做代币分析:以 ARB 币为例

作者:lesleyfootprint.network 编译:mingfootprint.network 数据源:ARB 代币仪表板 (仅包括以太坊数据) 在加密货币和数字资产领域,代币分析起着至关重要的作用。代币分析指的是深入研究与代币相关的数据…

【考研】高等数学总结

文章目录 第一章 极限 函数 连续1.1 极限存在准则及两个重要极限1.1.1 夹逼定理1.1.1.1 数列夹逼定理1.1.1.2函数夹逼定理 1.1.2 两个重要极限1.1.2.1 极限公式11.1.2.1.1 证明1.1.2.1.2 数列的单调有界收敛准则1.1.2.1.2.1 二项式定理1.1.2.1.2.2 证明 1.1.2.2 极限公式21.1.2…

Linux - 进程信号

1、信号入门 1.1、生活角度的信号 你在网上买了很多件商品,再等待不同商品快递的到来。但即便快递没有到来,你也知道快递来临时, 你该怎么处理快递。也就是你能“识别快递”;当快递员到了你楼下,你也收到快递到来的通…

深圳市优质IDC服务商

深圳市南方联合科技有限公司是一家立足深圳、辐射全国的电信中立数据中心运营商,依托与电信运营商、IT 设备厂商在资源及渠道上的优势,借鉴业界成功运营经验,为用户提供持续、高速、安全的互联网数据中心服务(IDC)、企…

C#集合和数据结构,随笔记录

C#集合和数据结构 System.Collections命名空间包含接口和类,这些接口和类定义各种对象(如列表/链表、位数组、哈希表、队列和堆栈)的集合 System.Collections.Generic命名空间: 所有集合都直接或间接基于ICollection接口 列表类集…

Java项目:48 ssm008医院门诊挂号系统+jsp(含文档)

作者主页:舒克日记 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本选题则旨在通过标签分类管理等方式实现 管理员;个人中心、药房管理、护士管理、医生管理、病人信息管理、科室信息管理、挂号管理、诊断…

案例--某站视频爬取

众所周知,某站的视频是: 由视频和音频分开的。 所以我们进行获取,需要分别获得它的音频和视频数据,然后进行音视频合并。 这么多年了,某站还是老样子,只要加个防盗链就能绕过。(防止403&#xf…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的交通标志识别系统详解(深度学习模型+UI界面代码+训练数据集)

摘要:本篇博客详细介绍了利用深度学习构建交通标志识别系统的过程,并提供了完整的实现代码。该系统采用了先进的YOLOv8算法,并与YOLOv7、YOLOv6、YOLOv5等早期版本进行了性能评估对比,分析了性能指标如mAP、F1 Score等。文章深入探…

细粒度IP定位参文2(Corr-SLG):A street-level IP geolocation method (2021年)

[2]S. Ding, F. Zhao, and X. Luo, “A street-level IP geolocation method based on delay-distance correlation and multilayered common routers,” Secur. Commun. Netw., vol. 2021, no. 1, pp. 1–10, 2021. 智能设备的地理位置可以帮助提供多媒体内容提供商和5G网络中…

Apache POI 解析和处理Excel

摘要:由于开发需要批量导入Excel中的数据,使用了Apache POI库,记录下使用过程 1. 背景 Java 中操作 Excel 文件的库常用的有Apache POI 和阿里巴巴的 EasyExcel 。Apache POI 是一个功能比较全面的 Java 库,适合处理复杂的 Offi…

【算法设计】实验四回溯算法(附源代码)

这里写目录标题 一、上机目的二、上机内容与要求三、上机步骤四、上机结果1、将课本5.2节算法改为程序,并输入数据及进行测试;2、自学5.4节,并完成符号三角形问题。 一、上机目的 1、通过回溯法的示例程序理解回溯法的基本思想; …

C语言--从零开始的扫雷游戏

C语言--从零开始的扫雷游戏 1. 游戏说明2. 总体代码3. 详细讲解3.1 菜单部分3.2 游戏主体部分3.2.1 总体分析3.2.2 棋盘初始化3.2.3 棋盘展示3.2.4 设置地雷3.2.5 扫雷阶段3.2.6 统计雷个数的代码3.2.7 使用迭代的方式进行展开:3.2.8 扫雷部分主体代码 4. 总结 1. 游…

图片格式转换怎么操作?这一个方法快快收藏

图片格式转换能够改变图片的质量、大小兼容性。不同的图片格式用途也不同,当我们需要转换图片格式的时候要怎么操作呢?下面,小编给大家分享一款操作简单,小白也能轻松上手的图片转换器(https://www.yasuotu.com/geshi&…

DDD领域模型驱动

传统MVC架构 DDD架构: api层:api请求方式,透传【传递参数】,几个业务对应api 业务层:做编排,业务里要有哪些服务,执行顺序是什么,以及怎么做 领域层:负责领域内调用,然后领域怎么划分 Dao层:数据库操作【或者另外一个应用 数据源之类的】 遵守原则: ①允许跨层…

什么是架构?架构设计原则是哪些?什么是设计模式?设计模式有哪些?

什么是架构?架构设计原则是哪些?什么是设计模式?设计模式有哪些? 架构的本质 架构本身是一种抽象的、来自建筑学的体系结构,其在企业及IT系统中被广泛应用。 架构的本质是对事物复杂性的管理,是对一个企业、一个公司、一个系统复杂的内部关系进行结构化、体系化的抽象,…