Android 中的 ClassLoader 摘抄笔记

Android解析ClassLoader(二)Android中的ClassLoader 相关文章 Java虚拟机系列 Android系统启动系列 Android解析ClassLoader系列 前言 在上一篇文章我们学习了Java的ClassLoader,很多同学会把Java和Android的ClassLoader搞混,甚至会认为Android中的ClassLoader和Java中的ClassLoader是一样的,这显然是不对的。这一篇文章我们就来学习Android中的C... 阅读详情

摘抄自:《Android 进阶解密》

Java 中类加载器加载的是 jar 文件和 Class 文件(本质都是加载 Class 文件),但在 Android 中不适用,因为无论是 DVM 还是 ART,它们加载的都是 dex 文件。

Android 中的 ClassLoader 分为两种类型,分别是系统类加载器和自定义加载器。

系统类加载器
1、BootClassLoader

Android 系统启动时会使用 BootClassLoader 来预加载常用类。其是由 Java 代码实现的。

class BootClassLoader extends ClassLoader {

    private static BootClassLoader instance;

    @FindBugsSuppressWarnings("DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED")
    public static synchronized BootClassLoader getInstance() {
        if (instance == null) {
            instance = new BootClassLoader();
        }

        return instance;
    }
    ...
}    

继承自 ClassLoader,并且是使用单例模式。其访问修饰符是默认的,只有在同一个包中才可以访问,在应用程序中无法直接调用。

2、DexClassLoader

用来加载 dex 文件以及包含 dex 的压缩文件(apk 和 jar 文件),但是最终都是加载 dex 文件。

public class DexClassLoader extends BaseDexClassLoader {
    /**
     *
     * @param dexPath dex 相关文件录路径集合,多个路径用文件分隔符分隔,
     * 	默认文件分隔符为 ":"
     *                
     * @param optimizedDirectory 解压的 dex 文件存储路径,必须是一个内部存储路径,
     * 	一般情况下使用当前应用程序的私有路径 /data/data/<Package Name>/...
     *                           
     * @param librarySearchPath 包含 C/C++ 库的路径几个,多个路径用文件分隔符分隔,
     * 	可以为 null
     *                          
     * @param parent 父加载器
     */   
    public DexClassLoader(String dexPath, String optimizedDirectory,
            String librarySearchPath, ClassLoader parent) {
        super(dexPath, new File(optimizedDirectory), librarySearchPath, parent);
    }
}

继承自 BaseDexClassLoader,方法都在其父类中实现。

3、PathClassLoader
public class PathClassLoader extends BaseDexClassLoader {
    /**
     *
     * @param dexPath dex 相关文件录路径集合,多个路径用文件分隔符分隔,
     * 	默认文件分隔符为 ":"
     *                           
     * @param librarySearchPath 包含 C/C++ 库的路径几个,多个路径用文件分隔符分隔,
     * 	可以为 null
     *                          
     * @param parent 父加载器
     */   
    public PathClassLoader(String dexPath, String librarySearchPath, ClassLoader parent) {
        super(dexPath, null, librarySearchPath, parent);
    }
}

同样继承自 BaseDexClassLoader,方法也都在其父类中实现。

PathClassLoader 默认设置了设置了参数 optimizedDirectory 的值为 /data/dalvik-cache,其无法定义解压的 dex 文件存储路径,因此 PathClassLoader 通常用来加载已经安装的 apk 的 dex 文件(安装的 apk 的 dex 文件会存储在 /data/dalvik-cache 中)。

ClassLoader 继承关系

下图是 Android 8.0 中 ClassLoader 的继承关系
在这里插入图片描述

  • ClassLoader 是一个抽象类,其中定义了 ClassLoader 的主要功能。BootClassLoader 是它的内部类。
  • SecureClassLoader 类和 JDK8 中的 SecureClassLoader 类的代码是一样的,它继承了抽象类ClassLoader。SecureClassLoader 并不是 ClassLoader 的实现类,而是拓展了 ClassLoader 类加入了权限方面的功能,加强了 ClassLoader 的安全性。
  • URLClassLoader 类和 JDK8 中的 URLClassLoader 类的代码是一样的,它继承自 SecureClassLoader,用来通过 URl 路径从jar文件和文件夹中加载类和资源。
  • InMemoryDexClassLoader 是 Android8.0 新增的类加载器,继承自 BaseDexClassLoader,用于加载内存中的 dex 文件。
  • BaseDexClassLoader 继承自 ClassLoader,是抽象类 ClassLoader 的具体实现类,PathClassLoader 和 DexClassLoader、InMemoryDexClassLoader 都继承自它。
唯一插件化Replugin源码及原理深度剖析--唯一Hook点原理 上一篇我们说了Replugin的整体框架的初始化,但是因为篇幅的缘故还有Hook系统的ClassLoader和插件的加载没有说,那么我们这一篇就来详解的来分析一下Hook这块,本章我们讲从Hook系统ClassLoader的思想和原理进行剖析,如果没有看过上一篇建议先看上一篇 提示:请不要忽略代码注释,由于通畅上下逻辑思维,不太重要的部分跳转代码不会全部进去一行行的看,但是会将注释写出来,所以请 阅读详情

相关推荐

实战游戏项目管理1-规划篇

1、前言 做研发管理10多年,进游戏行业8年,经验下来项目管理就是一门技术,结合不同行业不同项目加以不同管理方法,但原理基本一样,这里总结下游戏项目的管理一些实操方法 一般游戏确定立项前都需要做,项目预研产出一个游戏Demo,通过公司的立项评审,这个过程的项目管理相对简单一般由制作人或其他项目经理兼任,只有控制好总体时间与成本就好,这里按立项后开始讲。 2、游戏项目规划 ...

pengdali的专栏 2万+

Android 插件化框架 Replugin 源码解读(二)hook系统ClassLoader

在上一章节中我们讲到了Replugin初始化的时候创建了插件管理进程作为服务端。其他工作进程作为客户端,然后分别在各自的进程中初始化自己要做的事情。创建了多个Binder对象用来完成客户端和服务端的信息交互。这一章我们继续看 ...

Nate_fu 1229

GEE开发之ERA5(气温、降水、压力、风速等)数据获取和分析

前言:ERA5主要提供DAILY和MONTHLY两大类别数据,其中主要包括气温、降水、压力、风速等。

等待着冬天的风的博客 3万+

Android ClassLoader源码浅析

从源码的角度(基于Android9.0,API 28)记录一下Android类加载的机制,Android中的ClassLoader主要分为:BootClassLoader、BaseDexClassLoader、PathClassLoader、DexClassLoader、InMemoryDexClassLoader。 特点:双亲委托机制(留在下一篇介绍,本篇只介绍几个ClassLoader及常见的方法) 1.BootClassLoader:用于加载Android Framework层class文件 Bo.

qq_33539839的博客 529

激光可燃气体传感器:核心技术环节分析

激光可燃气体传感器核心技术涵盖七个维度:1)TDLAS光谱吸收与调制技术(检测下限ppm级);2)DFB激光器与双闭环温控系统(波长稳定性±0.0036nm);3)微弱信号处理技术(信噪比提升60dB);4)环境补偿算法(温压补偿误差<±1%);5)本质安全防爆设计(ExiaIICT4Ga等级);6)智能边缘计算(STM32L476芯片);7)多重性能验证(响应时间<1秒)。通过微型化、多气体检测等创新,该技术已在工业安全等领域替代传统方案,实现高精度检测。(149字)

上市公司前技术负责人,20 年软硬件深耕 + 百人研发团队管理经验,名校理工科背景加持。从技术攻坚到团队掌舵,沉淀海量项目实战与管理心得,专注分享软硬件干货、疑难问题解决方案,既是靠谱知识传播者,也盼链接优质项目共成长。 1047

手把手教你用西门子博图V18配置阿特拉斯PF6000拧紧枪PN通讯(附完整GSD文件与ToolsTalk配置文件)

本文详细介绍了如何使用西门子博图V18配置阿特拉斯PF6000拧紧枪的PN通讯,包括硬件连接、网络参数规划、ToolsTalk软件配置及博图工程设置。通过完整的GSD文件和配置文件,帮助工程师快速实现高精度拧紧设备与PLC的高效通讯,适用于汽车装配和电子制造等工业自动化场景。

weixin_42662293的博客 606

从FindBugs中学Java【一】

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33937778的博客 245

网络可视媒体的智能计算-胡事民

本文为胡事民教授在山大做报告的笔记,现场见下图: 可视媒体是承载视觉信息的媒体类型,如图像、视频等,它具有网络化、海量和无序涌现等特征。 可视媒体计算的研究意义 可视媒体作为一种信息承载的介质,是用来表达语义信息的。那么就有一种介质与信息之间相互转化的问题。转化方向正反两种,举个栗子说明一下: 1. 可视媒体→→\rightarrow语义信息:比如看到画面,理解其中发生的事件、各主题之...

gdymind的博客 2451

Replugin源码及原理深度剖析--唯一Hook点原理

Replugin源码及原理深度剖析--唯一Hook点原理

idaretobe的专栏 797

GJB设计开发各阶段的文件和记录要求

GJB设计开发各阶段的文件和记录要求

Abel的博客 4058

仅使用 Python 创建的 Web 应用程序(前端版本)第03章Streamlit-多页面

接下来,我们将解释多页面切换。Streamlit 没有“多页面”或“页面路由”等功能。另一方面,通过根据用户动作切换要执行的功能,可以使其看起来好像存在“多个页面”。注意:我认为它类似于 SinglePageApplication (SPA)。然而,根据 React、Vue 等中使用的 URL 路径来更改页面的路由很困难。还有一个用于获取查询参数的实验性 API,但如果您确实需要这种功能,我认为认真尝试编写 React 或 Vue 是个好主意。我们来看一个通过按下按钮来切换页面的示例,如下所示。

xianyinsuifeng的博客 1331

ClassLoader (一) — Android 中的 ClassLoader 体系

Android 中, DVM 或 ART虚拟机加载的是 Dex 文件,因此 Androd 中自定义了部分 ClassLoader 来实现类的加载。 Android 中的 ClassLoader 类型分为两种: 1. 系统类加载器。系统类加载器主要包括 3 种,分别是BootClassLoader 、 PathClassLoader 和 DexClassLoader。 2. 自定义加载器。

Elson的博客 2061

TVS 管击穿电压与钳位电压的工程解析

TVS二极管的核心参数击穿电压(VBR)和钳位电压(VC)常被混淆,但二者具有本质区别。VBR是

硬核科技 480

xposed实现插件代码更新同时避免重启系统方案

话说,刚开始接触xposed,就对这个频繁重启不太爽。我很少使用动态调试的方式去跟踪apk,因为处理反调试,开启调试环境(重编、或者开启系统debug开关等)特别麻烦。但是纯粹使用xposed拦截的方式去跟踪业务逻辑呢,修改一个日志打印都需要重启Android系统。所以我就想,能不能做到更新插件代码,不重启Android系统,也让系统生效呢?然后我去研究了xposed源码,和Android相关源码...

叶飘っ叶相偎 的博客 3519

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

android对象序列化Parcelable浅析

一、android序列化简介 我们已经知道在Android使用Intent/Bindler进行IPC传输数据时,需要将对象进行序列化。 JAVA原本已经提供了Serializable接口来实现序列化,使用起来非常简单,主要用于对象持久化以及对象的网络传输。Serializable开销比较大,因为序列化和反序列化的过程需要大量的I/O操作。 Android提供了Parcelable对象序列化操...

weixin_30247159的博客 152

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

[jvm]类的加载流程三

文章目录概述引入:java与android 二者使用的虚拟机不同java 与android classloader 对象间的关系android 中的classloaderBootClassLoaderPathClassLoaderDexClassLoaderInMemoryDexClassLoaderandorid 类加载器间的关系加载class 调用对象到底是谁创建 概述 本篇为讲述 andro...

xianrenli38的博客 324

FindBug使用总结

AM : Creates an empty jar file entry(AM_CREATES_EMPTY_JAR_FILE_ENTRY) 在putNextEntry()和closeEntry()之间,没有对jar文件做其他操作。这样会给jar文件生成一个空的条目。 The code calls putNextEntry(), immediately followed by a call to

流子的专栏 1万+

关于Findbugs的一些常见报错的翻译和处理方式

在Lab5中要求使用 CheckStyle 和 FindBugs 工具对经过人工走查的 Lab4 代码进行自动的静态代码分析。在使用FindBugs的过程中,出现了一些难以理解的报错,经查阅资料,了解了错误的原因以及一些大致的解决办法。下面是关于FindBugs的一些常见报错的翻译和处理方法:一、Security 关于代码安全性防护1.Dm: Hardcoded constant database...

大烤翅的博客 2万+

360开源的插件化框架Replugin深度剖析

概要: 一、关于ClassLoader 的知识回顾 和 Replugin中ClassLoader 二、Hook 系统ClassLoader 的原理分析 三、Hook 系统ClassLoader 的思想及总结 ClassLoader知识回顾 ClassLoader是什么? ClassLoader 是类加载器,它是用来形容将一个类的二进制流加载到

2592

FindBugs规则整理

FindBugs是基于Bug Patterns概念,查找javabytecode(.class文件)中的潜在bug,主要检查bytecode中的bug patterns,如NullPoint空指针检查、没有合理关闭资源、字符串相同判断错(==,而不是equals)等 一、Security 关于代码安全性防护 1.Dm: Hardcoded constant database password

我行我速 1万+

一篇文章搞懂热修复类加载方案原理

ClassLoader 类型 Java 中的 ClassLoader 可以加载 jar 文件和 Class文件(本质是加载 Class 文件),这一点在 Android 中并不适用,因为无论 DVM 还是 ART 它们加载的不再是 Class 文件,而是 dex 文件。 Android 中的 ClassLoader 类型和 Java 中的 ClassLoader 类型类似,也分为两种类型,分别是系...

weixin_33834075的博客 436

Android ClassLoader机制

什么是ClassLoader?Classloader动态的装载Class文件。标准的java sdk中有一个ClassLoader类,借助这个类可以装载想要的Class文件,每个ClassLoader对象在初始化时必须制定Class文件的路径。 写程序的时候不是有import关键字可以引用制定的类吗?为何还要使用这个类加载器呢? 原因其实是这样的,使用import关键字引用的类必须符合以下两个条

Mr_LiaBill 6894

findbugs的校验点翻译-Bad+practice(一)

如有转载,请注明出处:http://blog.csdn.net/yihui823/article/details/6866801 不是直译,加了自己的理解。有不合适的地方欢迎大家指正。 基于版本:FindBugs version 1.3.9. AM : Creates an empty jar file entry(AM_CREATES_EMPTY_JAR_FILE_ENTRY) 在p...

helpbs 578

Eclipse FindBugs插件安装与使用

前言:白盒测试中的静态检查一般是检查编码标准规范,错误列表。编码规范往往团队会根据自己的经验和风格进行设置一些规范。现在很多IDE工具都会在编辑代码的时候实时的提醒是否符合代码风格。错误列表,一般是代码潜在的bug,由于某种代码写法虽然没有语法错误,但是可能存在错误,比如会导致线程死锁。这些都是错误列表应该检查的。静态检查的可操作方式有人工代码走查和软件代码扫描。使用软件对我们的代码进行扫描,查找出

xlxxcc的专栏 3万+
上一篇: 关于 Java Integer 包装类自动装箱的问题,以及字符串常量池
下一篇: 生产者消费者模式关于 Java 的三种实现
OneDeveloper
博客等级 码龄9年 61粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值