【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。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp开发DAPP钱包应用(二) Vue + Java

上一节我们讲了如何通过vue uniapp还有web3以及需要准备的相关组件,来搭建了DAPP开发的环境。 这一节,我们来说说如何用代码来实现DAPP相关接口。 1. ethers实现类 导入组件 import { ethers , providers , utils } from "ethers"; impor…

QML 控件添加键盘事件

在QML中,可以使用Keys类型来处理键盘事件。以下是一个简单的示例,演示如何在QML控件中添加键盘事件: import QtQuick 2.12 import QtQuick.Window 2.12Window {visible: truewidth: 640height: 480title: qsTr("Hello World")Recta…

DFS算法详解及例题

DFS:往深搜索,执着,确认从底下返回后的每个人的节点都已经用完,空间占用少,爆搜。 BFS:每一层搜索,稳重,(当一个图的权重都为1时搜到的一定是最短路) 下面我们以dfs的一道经典例题来讲解 代码: #include…

Ubuntu18.04 安装搜狗输入法

一. 概述 自己的Ubuntu 18.04系统配置中文搜狗输入法,安装步骤,亲测可用 二. 安装步骤 2.1 确认系统版本和CPU架构 查看Ubuntu系统版本号,通过命令 lsb_release -a wuubuntume:~$ lsb_release -a No LSB modules are available. Distr…

基于SpringBoot的“智慧食堂”系统(源码+数据库+文档+PPT)

基于SpringBootVue的智慧食堂系统的设计与实现(源码数据库文档PPT) 开发语言:Java数据库:MySQL技术:SpringBootVUE工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统登录界面图 系统首页界面图 用户注册界面图 菜…

项目总结.

文章目录 1.DDD结构基础2. 抽奖领域3. 发奖领域4.活动领域5. 支撑领域应用层编排 1.DDD结构基础 包含: 接口层、应用层、领域层、基础层;通用包、接口层、接口定义。 接口层:实现RPC接口定义,引入应用层服务,封装具体的…

日期问题 刷题笔记

思路 枚举 19600101 到20591231这个区间的数 获得年月日 判断是否合法 如果合法 关于题目给出的日期 有三种可能 年/月/日 日/月/年 月/日/年 判断 是否和题目给出的日期符合 如果符合 输出 闰年{ 1.被4整除不被100整除 2.被400整除} 补位写法“%02d" 如果不…

【C语言步行梯】自定义函数、函数递归详谈

🎯每日努力一点点,技术进步看得见 🏠专栏介绍:【C语言步行梯】专栏用于介绍C语言相关内容,每篇文章将通过图片代码片段网络相关题目的方式编写,欢迎订阅~~ 文章目录 什么是函数库函数自定义函数函数执行示例…

STM32 ADC数模转换器

单片机学习! 目录 文章目录 前言 一、ADC简介 1.1 ADC名称 1.2 ADC功能 1.3 分辨率与转换时间 1.4 输入电压与转换范围 1.5 输入通道 1.6 增强功能 1.7 自动监测输入电压范围 1.8 STM32F103C8T6 ADC资源 二、逐次逼近型ADC 2.1 ADC内部结构原理图 2.2 输入通道选择 …

AI 驱动的医疗变革:迈向未来医疗新生态

直面呼啸而来的人工智能,医疗行业将首当其冲,发生翻天覆地的变化。美国心脏病学家兼基因学教授埃里克托普在《未来医疗》中预测,未来人类将拥有“健康小助手”——个人医疗数据和处理能力,还能轻松预防疾病。诸多评论家也持类似观…

Jade 处理XRD并计算半峰宽FWHM、峰面积、峰强度等数据

1.打开软件 2.导入测试的XRD数据 3.平滑数据 4.抠一下基底 5.分析具体数据 6.按住鼠标左键,在峰底部拉一条线,尽量和基底持平 7.结果就出来了,想要的都在里面,直接取值就行

数据分析-Pandas如何观测数据的中心趋势度

数据分析-Pandas如何观测数据的中心趋势度 数据分析和处理中,难免会遇到各种数据,那么数据呈现怎样的规律呢?不管金融数据,风控数据,营销数据等等,莫不如此。如何通过图示展示数据的规律? 数据…

Stable Diffusion 模型:从噪声中生成逼真图像

你好,我是郭震 简介 Stable Diffusion 模型是一种生成式模型,可以从噪声中生成逼真的图像。它由 Google AI 研究人员于 2022 年提出,并迅速成为图像生成领域的热门模型。 数学基础 Stable Diffusion模型基于一种称为扩散概率模型(Diffusion P…

16 OpenCV Laplance算子

文章目录 图像的二阶导数Laplance算子代码示例 图像的二阶导数 在二阶导数的时候,最大变化处的值为零即边缘是零值。通过二阶 导数计算,依据此理论我们可以计算图像二阶导数,提取边缘。 Laplance算子 void Laplacian( InputArray src, Output…

Java代码审计安全篇-SSRF(服务端请求伪造)漏洞

前言: 堕落了三个月,现在因为被找实习而困扰,着实自己能力不足,从今天开始 每天沉淀一点点 ,准备秋招 加油 注意: 本文章参考qax的网络安全java代码审计,记录自己的学习过程,还希望各…

【C++进阶】C++多态概念详解

C多态概念详解 一,多态概念二,多态的定义2.1 多态构成的条件2.2 什么是虚函数2.3 虚函数的重写2.3.1 虚函数重写的特例2.3.2 override和final 2.4 重载和重写(覆盖)和重定义(隐藏)的区别 三,抽象…

性能指标:QPS、TPS、系统吞吐量理解

一、QPS,每秒查询 QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。 互联网中,作为域名系统服务器的机器的性能经…

[leetcode~dfs]1261. 在受污染的二叉树中查找元素

给出一个满足下述规则的二叉树: root.val 0 如果 treeNode.val x 且 treeNode.left ! null,那么 treeNode.left.val 2 * x 1 如果 treeNode.val x 且 treeNode.right ! null,那么 treeNode.right.val 2 * x 2 现在这个二叉树受到「污…

02.JavaScript的运算符和语句

JavaScriptt的运算符和语句 一.运算符 算术运算符 数字是用来计算的,比如:乘法 * 、除法 / 、加法 、减法 - 等等,所以经常和算术运算符一起。 算术运算符:也叫数学运算符,主要包括加、减、乘、除、取余&#xff…

python自学7

第二章第一节面向对象 程序的格式都不一样,每个人填写的方式也有自己的习惯,比如收集个人信息,可能有人用字典字符串或者列表, 类的成员方法 类和对象 构造方法 挨个传输值太麻烦了,也没有方便点的,有&…