【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。
相关文章:

【Android】 ClassLoader 知识点提炼
1.Java中的 ClassLoader 1.1 、ClassLoader的类型 Java 中的类加载器主要有两种类型,即系统类加载器和自定义类加载器。其中系统类 加载器包括3种,分别是 Bootstrap ClassLoader、Extensions ClassLoader 和 Application ClassLoader。 1.1.1.Bootstra…...

16. C++标准库
C标准库兼容C语言标准函数库,可以在C标准库中直接使用C语言标准函数库文件,同时C标准库增加了自己的源代码文件,新增文件使用C编写,多数代码放在std命名空间中,所以连接C标准库文件后还需要 using namespace std;。 【…...

JVM内存结构介绍
1. 什么是JVM 我们都知道在 Windows 系统上一个软件包装包是 exe 后缀的,而这个软件包在苹果的 Mac OSX 系统上是无法安装的。类似地,Mac OSX 系统上软件安装包则是 dmg 后缀,同样无法在 Windows 系统上安装。 Java 代码为什么可以在 Windows…...

Linux常见指令总结
ls:显示当前目录下文件列表 常用的命令行参数: -l 显示更多的文件属性 -a 显示所有的文件/目录(包括隐藏的) -d 只显示目录 ps:参数可以叠加使用。 例如:ls -la 显示所有文件…...

Day35-Linux网络管理5
Day35-Linux网络管理5 1. 网卡配置2. DNS客户端域名解析配置3. 给网卡配多个IP4. ip地址查看和设置4.1 ifconfig命令4.2 ip命令4.3 ip命令:查看和设置网络配置4.4 ip命令帮助 5. 路由5.1 路由功能分类:5.2 查看路由:5.3 路由表:5.…...

9个神奇免费AI编程助手,实现高效自动代码生成!
在AIGC技术工具快速发展的时代,对高效智能编程工具的需求和关注已达到空前的高度。本文将介绍9款免费且好用的AI编程助手工具。无论你是经验丰富的开发人员还是刚开始编程旅程的新手,这些AI代码软件都能帮助你提高项目开发的生产力、创造力和准确性&…...

Python 导入Excel三维坐标数据 生成三维曲面地形图(体) 5-3、线条平滑曲面且可通过面观察柱体变化(三)
环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 scipy 1.12.0 代码: import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from scipy.interpolate import griddata fro…...

【CSP】2022–09-3 防疫大数据 100分 STL大模拟 使用map优化索引 有坑得注意
2022–09-3 防疫大数据 STL大模拟 使用map优化索引 2022–09-3 防疫大数据 STL大模拟 使用map优化索引基本思路遇到的问题(学到的东西)感悟完整代码 2022–09-3 防疫大数据 STL大模拟 使用map优化索引 这题中规中矩,不算太难也不算太简单&am…...

【Linux基础(三)】信号
学习分享 1、信号的基本概念2、查看信号列表3、常见信号名称4、signal库函数5、发送信号kill6、kill - signal (无参信号)示例6.1、kill - signal (不可靠信号)示例6.2、kill - signal (可靠信号)示例 7、信号分类7.1、信号运行原理分类7.2、信号是否携带…...

GEE图像可视化常用函数
目录 图层操作Map.addLayer()Map.centerObject() 直方图ui.Chart.image.histogram() 时间序列统计ui.Chart.image.series()ui.Chart.image.seriesByRegion() …...

c++基础语法
文章目录 前言命名空间命名空间的使用 缺省参数缺省参数的使用 函数重载函数重载的作用函数重载的使用函数重载原理 引用引用的使用引用的使用场景引用和指针 extern Cinlineauto范围fornullptr 前言 大家好我是jiantaoyab,这篇文章给大家带来的是c语言没有的一些特…...

【工作实践-07】uniapp关于单位rpx坑
问题:在浏览器页面退出登录按钮上“退出登录”字样消失,而在手机端页面正常;通过查看浏览器页面的HTML代码,发现有“退出登录”这几个字,只不过由于样式问题,这几个字被挤到看不见了。 样式代码中有一行为:…...
服务层组件
目录 连接层(Connection Pool) SQL接口(SQL Interface) 查询缓存(Caches&Buffers) Management Services&Utilities 查询分析器(Parser) 优化器(Optimizer)...

【学习笔记】VMware vSphere 6.7虚拟化入门
VMware vSphere 6.7虚拟化入门课程介绍 课程内容 1、VMware vSphere 6.7虚拟化入门课程介绍 2、ESXi6.7控制台设置 3、使用vSpkere Host client管理虚拟机 4、VMware EsXi基础操作 5、VMware Esxi存储管理 6、管理ESXi主机网络与虚拟机网络 7、安装配置vCenter Server Applia…...
如何防范企业内部安全威胁?
1 用户行为分析(UEBA) 现代化的用户行为分析产品具有多种优势功能,使企业能够有效地检测内部威胁。用户行为分析软件通过收集和分析来自各种来源的数据来分析和检测内部人员的可疑行为。这些来源包括网络日志和用户活动日志。通过检查这些数…...

内网渗透-跨域环境渗透-1
目录 smbclient工具 mimikatz工具 Kerbers协议 NTLM认证 hash传递攻击(PTH攻击) 黄金票据攻击 白银票据 MS14-068 smbclient工具 在linux里面连接远程windows共享目录,可以使用这个工具 第一种连接方式:smbclient -L 目…...

安信可IDE(AiThinker_IDE)编译ESP8266工程方法
0 工具准备 AiThinker_IDE.exe ESP8266工程源码 1 安信可IDE(AiThinker_IDE)编译ESP8266工程方法 1.1 解压ESP8266工程文件夹 我们这里使用的是NON-OS_SDK,将NON-OS_SDK中的1_UART文件夹解压到工作目录即可 我这里解压到了桌面,…...

【java数据结构】HashMap和HashSet
目录 一.认识哈希表: 1.1什么是哈希表? 1.2哈希表的表示: 1.3常见哈希函数: 二.认识HashMap和HashSet: 2.1关于Map.Entry的说明:,> 2.2Map常用方法说明: 2.3HashMap的使用案例: 2.4Set常见方法…...

基于Springboot的高校汉服租赁网站(有报告)。Javaee项目,springboot项目。
演示视频: 基于Springboot的高校汉服租赁网站(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构…...

分布式解决方案
目录 1. 分布式ID1-1. 传统方案1-2. 分布式ID特点1-3. 实现方案1-4. 开源组件 2. 分布式Session2-1. 传统Session2-2. Spring-Session2-3. Token Redis2-4. JWT2-5. 拦截器统一处理Token2-6. Oauth2 3. 分布式锁3-1. redis3-2. Zookeeper 1. 分布式ID 1-1. 传统方案 时间戳U…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...