android的安装包是个apk文件,其中包含dex、资源及签名文件。其中dex是包含程序运行的类代码,而android是运行在dalvik(5.0之前)上的。本篇我们就来看下dalvik是如何把dex载入并运行的。

  先看整体脉络(重点照顾解析步骤,优化自行查找资料):  

  

  android在安装apk时会验证dex文件是否符合规范,并优化dex生成odex;接着会将odex文件解析成易于被dalvik加载和执行的dexFile结构体。下面我们就跟随源码看下dex的心路历程吧。

  apk的安装在java层由Installer类执行,但最终通过socket由C层的installd来实现。dex的优化是由installd的do_dexopt函数调用dexopt来完成操作。dex优化后生成odex后就要被拉去解析啦。odex解析成dexFile结构体后,类加载器可以通过该结构体实现对Dex文件中各类数据的查找和获取(由此可知,dexFile和dex文件有对应关系)。看解析流程:

   

  ok,得到dexFile,至此类加载器的索引文件得到了。在dalvik代码执行中2个数据结构很重要:ClassObject、Method。总所周知java是面向对象的语言,代码是组合在类中的。故虚拟机的加载机制可以通过按代码执行流程来逐渐加载相关类(apk加壳方案?);类加载通过类描述符在dexFile(所以它叫dex在内存中的描述)结构体得到其在dex文件的地址,并对其解析和加载:

  执行流程:

  

  上面表述了类加载流程,其实质在是在内存中得到类的ClassObejct !其实这也是FindClass函数(FindClass还是调用findClassNoInit)需要去做的流程。所以说类加载和findclass都只是为了在dalvik中得到该类的ClasssObject。类说完了,但dalvik是执行代码,我怎么执行你的类方法呢?记得上面说的Method结构(ClassObject结构里指向它的指针,ClassObject里当然包括方法咯),它才是dalvik的执行单元,ClassObject只是描述,类似于odex和dexFile吧。具体可以看:android dalvik浅析一:解释器及其执行

void dvmCallMethodV(Thread* self, const Method* method, Object* obj,
bool fromJni, JValue* pResult, va_list args)

  

  下面我们来看下在dalvik在加载过程中使用到的数据结构(Method、ClassObject的结构体见源码Object.h):

  Method:    java方法在dalvik中的结构体,是dalvik的执行单位;拥有指向ClassObject的指针

  ClassObject:  java类在dalvik中的结构体,包含多个Method结构;拥有指向DvmDex的指针;拥有指向加载该类的ClassLoader指针

  DvmDex:    拥有指向dexFile的指针

  dexFile:    dex在dalvik的描述结构

  一目了然,我们可以通过Method追踪到odex文件。

ClassLoader:

  android的类加载分析了,但在android其实存在2类ClassLoader。在分析之前先看Android系统下的动态Dex加载这篇文章,ContextClassLoader就是PathClassLoader(有个重要的概念:一种向上传递,向下分发的机制,理解下)。看android开发手册就一目了然:http://developer.android.com/reference/dalvik/system/BaseDexClassLoader.html

  类DexClassLoader、PathClassLoader都属于符合双亲委派模型的类加载器且继承至BaseDexClassLoader。接下来就看看这2个类各自承担的责任:

  

  看到咯是用来系统类和app类的加载(即组件)。

  通常情若没有指定ClassLoader,loadAPK的ClassLoader就是PathClassLoader。这里再加深下ClassLoader的parent概念,这是逻辑而不是指父类!

  断断续续的有点乱,有疑问大家来交流。

  注:有些概念不清楚的话,可以看下java的ClassLoader。

资料:
  1 android虚拟机解析

   2 【原创】Dex动态加载的C语言部分

dalvik浅析三:类加载的更多相关文章

  1. InnoDB的锁机制浅析(三)—幻读

    文章总共分为五个部分: InnoDB的锁机制浅析(一)-基本概念/兼容矩阵 InnoDB的锁机制浅析(二)-探索InnoDB中的锁(Record锁/Gap锁/Next-key锁/插入意向锁) Inno ...

  2. 深入理解java虚拟机(三)-----类加载机制

    类加载机制jvm把描述类的数据从class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被jvm直接使用的java类型.在java中,类型的加载.连接和初始化都是在程序运行期间完成的 ...

  3. 以太网驱动的流程浅析(三)-ifconfig的-19错误最底层分析【原创】

    以太网驱动流程浅析(三)-ifconfig的-19错误最底层分析 Author:张昺华 Email:920052390@qq.com Time:2019年3月23日星期六 此文也在我的个人公众号以及& ...

  4. drozer浅析三:命令实现与交互

    前面走马观花的看了几个模块的源码,看到是用python(会加载自定义的java类)写的.产生2个问题:在命令行中输入command,drozer是如何去执行的:python是如何与java交互的. d ...

  5. IOS RunLoop浅析 三

    经过两篇的介绍我想对RunLoop应该有了简单的了解,至少不至于一无所知. 在这篇我想对“CFRunLoopObserverRef”做一下简单的补充. 在补充之前先说一下. 在现在的开发中已经很少见到 ...

  6. 浅析java类加载器ClassLoader

    作为一枚java猿,了解类加载器是有必要的,无论是针对面试还是自我学习. 本文从JDK提供的ClassLoader.委托模型以及如何编写自定义的ClassLoader三方面对ClassLoader做一 ...

  7. JDK8 BigDecimal API-创建BigDecimal源码浅析三

    第三篇 先介绍以BigInteger为构造参数的构造器 public BigDecimal(BigInteger val) {// 根据BigInteger创建BigDecimal对象 scale = ...

  8. iOS-静态库,动态库,framework浅析(三)

    创建framework静态库 第一步,新建项目 新建项目.png 第二步,删除系统默认创建的[FMDB.h]和[FMDB.m]文件,导入需要打包的源文件. 导入源码后的工程.png 第三步,修改项目配 ...

  9. 【Flutter学习】之动画实现原理浅析(三)

    一,概述 Flutter动画库的核心类是Animation对象,它生成指导动画的值,Animation对象指导动画的当前状态(例如,是开始.停止还是向前或者向后移动),但它不知道屏幕上显示的内容.动画 ...

随机推荐

  1. Java 集合框架 02

    集合框架· LinkedList 和 泛型 去除ArrayList中重复字符串元素 * A:案例演示 * 需求:ArrayList去除集合中字符串的重复值(相同内容的字符串) * 思路:创建新集合方式 ...

  2. 解决.NET Core Ajax请求后台传送参数过大请求失败问题

    解决.NET Core Ajax请求后台传送参数过大请求失败问题 今天在项目上遇到一个坑, 在.Net Core中通过ajax向mvc的controller传递对象时,控制器(controller)的 ...

  3. IntelliJ-IDEA 打包代码报错

    一.问题由来 使用 IntelliJ-IDEA 打包项目一直以来都没问题,可是上周的时候,突然打包就报错了,并且Maven中的pom.xml文件确定是没有改过,打包的配置文件也没有修改过. 报错信息如 ...

  4. Go Module实战:基于私有化仓库的GO模块使用实践

    新年开工近一月,2021 年第一期 Open Talk 定档 3 月 18 日晚 8 点,本期我们邀请到了又拍云资深后端开发工程师刘云鹏和我们一起聊聊 Go 最新特性 Go Module 实战. 刘云 ...

  5. 电影AI修复,让重温经典有了新的可能

    摘要:有没有一种呈现,不以追求商业为第一目的,不用花大价钱,不用翻拍,没有画蛇添足,低成本的可共赏的让经典更清晰? 本文分享自华为云社区<除了重映和翻拍,重温经典的第三种可能>,原文作者: ...

  6. golang 性能调优分析工具 pprof (上)

    一.golang 程序性能调优 在 golang 程序中,有哪些内容需要调试优化? 一般常规内容: cpu:程序对cpu的使用情况 - 使用时长,占比等 内存:程序对cpu的使用情况 - 使用时长,占 ...

  7. java例题_01 不死神兔!

    1 /*1 [程序 1 不死神兔] 2 题目:古典问题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 3 程 ...

  8. PAT (Advanced Level) Practice 1042 Shuffling Machine (20 分) 凌宸1642

    PAT (Advanced Level) Practice 1042 Shuffling Machine (20 分) 凌宸1642 题目描述: Shuffling is a procedure us ...

  9. TypeError: 'str' object does not support item assignment Python常见错误

    1.string是一种不可变的数据类型 2.尝试使用 range()创建整数列 有时你想要得到一个有序的整数列表,所以 range() 看上去是生成此列表的不错方式. 需要记住 range() 返回的 ...

  10. [Azure Devops] 使用 Azure Pipelines 实现 CI

    1. 什么是 Azure Pipelines Azure Pipelines 会自动构建和测试代码项目,以将其提供给其他人.它适用于任何语言或项目类型.Azure Pipelines 结合了持续集成 ...