专栏首页极客猴详解安卓的ClassLoader

详解安卓的ClassLoader

众所周知,Java程序运行过程是这样的。首先,Java源码编译器将java文件编译成二进制的字节码class文件。然后,Java虚拟机再运行class文件。class文件是怎么加载到JVM里面的呢?答案是通过 ClassLoader 的加载机制。安卓虚拟机也有类似这样的机制,为了能编写出更高效的代码,我们有必要了解下ClassLoader 的加载机制。本文先会分别详解安卓的 ClassLoader。

01

Java 的 ClassLoader

大多数安卓应用程序是由Java语言开发的。所以有必要先了解Java 的 ClassLoader。Java加载类的过程主要由系统自带的三个类加载器依次被执行来加载类的。有图有真相,下图能让人一目了然:

1)Bootstrap ClassLoader: 最顶层的加载类。负责从引导类路径中加载核心类。主要加载 %JRE_HOME%\lib 下的 rt.jar、resources.jar、charsets.jar 和 class等

2)Extention ClassLoader: 扩展的类加载器。负责加载目录 %JRE_HOME%\lib\ext 目录下的jar包和class文件

3)App ClassLoader: 系统类加载器。负责加载应用程序级类路径以及环境变量(classpath)的所有类

这三个类加载器Boot StrapExtensionApplication 是位于类加载器子系统(Class Loader Subsystem)中。类加载器子系统主要是将class文件进行加载、链接、初始化。其是JVM架构的第一层。

02

Android 的 ClassLoader

了解了Java的ClassLoader, 接下来了解Android 的 ClassLoader 就易如反掌。Java有虚拟机,Android系统中也是有两种虚拟机的。Android系统在5.0以前的虚拟机是采用Dalvik虚拟机。从系统5.0以后,Android Runtime虚拟机取代Dalvik成为系统内默认虚拟机。安卓虚拟机运行加载的不是class文件,而是dex文件。dex文件是编译工具把所有的class文件进行合并,优化,然后生成的。

Android中类加载器有BootClassLoader, URLClassLoader, PathClassLoader, DexClassLoader, BaseDexClassLoader等。 同样一张图让你明白类加载的过程:

1)ClassLoader ClassLoader 是一个抽象类。它是所有类加载器的父类。我们一般是使用其具体的子类DexClassLoader、PathClassLoader。

2)BootClassLoader 在Android虚拟机中,BootClassLoader是ClassLoader内部类。同时,也是Android平台上所有ClassLoader的最终parent。 这个内部类是包内可见, 所以我们没法使用。

3)URLClassLoader 只能用于加载jar文件,但是由于 dalvik 不能直接识别jar,所以在 Android 中无法使用这个加载器。

4)BaseDexClassLoader PathClassLoader和DexClassLoader都继承自BaseDexClassLoader。但是其中的主要逻辑都是在BaseDexClassLoader完成的。 BaseDexClassLoader类的部分源码如下:

从源码中,我们得知BaseDexClassLoader的构造方法包含四个参数,这四个参数代表的意思如下:

  • dexPath: 需要装载的APK或者Jar文件的路径。包含多个路径用File.pathSeparator间隔开,在Android上默认是 “:”
  • optimizedDirectory: 优化后的dex文件存放目录,不能为null
  • libraryPath: 目标类中使用的C/C++库so文件的路径,每个目录用File.pathSeparator间隔开; 可以为null
  • parent: 指该装载器的父装载器,一般为当前执行类的装载器。

5)DexClassLoader 我们不妨先看看该类的构造方法。因为平时开发中,可能会使用到。

DexClassLoader可以加载jar/apk/dex,可以从SD卡中加载未安装的apk;

6)PathClassLoader 同样先看看其构造方法。

PathClassLoader只能加载系统中已经安装过的apk;

作者:猴哥,公众号:极客猴。爱好读书,喜欢钻研技术,梦想成为文艺青年的IT Boy。

- END -

本文分享自微信公众号 - 极客猴(Geek_monkey),作者:猴哥

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-04-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 高效利用Bitmap

    上面的代码经常在我们的项目中出现。你可知其背后的处理逻辑? 根据源码可知,上面的代码中两个方法setBackgroundResource()和setImage...

    猴哥yuri
  • 分享一个爬取网站的小技巧

    有时候,我们很想爬取一个网站的数据。如果 PC 端的网页的反爬机制太强,我们可以换个思路。现在很多网站为了满足手机浏览器能正常访问的需求,都会推出手机版的网页。...

    猴哥yuri
  • pustil - 获取系统信息库

    运维工程师经常使用 Python 编写脚本程序来做监控系统运行的状态。如果自己手动使用 Python 的标准库执行系统命令来获取信息,会显得非常麻烦。既要兼容不...

    猴哥yuri
  • ClassLoader 类加载器

      C/C++代码实现的加载器,用于加载指定的JDK的核心类库,比如java.lang.、java.uti.等这些系统类。Java虚拟机的启动就是通过Boots...

    用户3112896
  • Java 类加载机制详解

    Java 虚拟机一般使用 Java 类的流程为:首先将开发者编写的 Java 源代码(.java文件)编译成 Java 字节码(.class文件),然后类加载器...

    Java团长
  • 深入理解和探究Java类加载机制

    java.lang.ClassLoader类的基本职责就是根据一个指定的类的名称,找到或者生成其对应的字节代码,然后从这些字节代码中定义出一个Java 类,即 ...

    lyb-geek
  • Java 类加载机制详解

    Java 虚拟机一般使用 Java 类的流程为:首先将开发者编写的 Java 源代码(.java文件)编译成 Java 字节码(.class文件),然后类加载器...

    哲洛不闹
  • 页面性能优化

    可以看到,六个绿色条并发请求,四个灰色条等待请求,最下面三个绿色条3.4s后才触发请求

    柳醉梦声
  • java类加载器加载机制

      Java的安全模型是的Java成为适于网络环境的技术——《深入Java虚拟机》

    the5fire
  • android classloader双亲委托模式

    概述 ClassLoader的双亲委托模式:classloader 按级别分为三个级别:最上级 : bootstrap classLoader(根类加载器) ;...

    xiangzhihong

扫码关注云+社区

领取腾讯云代金券