wsxk / wsxk.github.io

MIT License
5 stars 0 forks source link

android 加载流程 #183

Open wsxk opened 3 months ago

wsxk commented 3 months ago

https://wsxk.github.io/android_vm/

前言

  1. Android虚拟机

    2.1 DVM虚拟机

      2.1.1 DVM与JVM的差异

    2.2 ART虚拟机

      2.2.1 ART和DVM的区别
  2. APK打包流程

前言 该文章为https://wsxk.github.io/android/ 的后续 虽然不读前面的文章也无所谓(😄)

  1. Android虚拟机 Android虚拟机指的是DVM虚拟机和ART虚拟机,都是用来在Android平台上运行java程序的虚拟机 2.1 DVM虚拟机 Dalvik虚拟机简称Dalvik VM或者DVM,是Google专门为Android平台开发的虚拟机,它运行在Android运行库中,需要注意的是DVM并不是一个Jvm虚拟机 2.1.1 DVM与JVM的差异 最显著的差异在于JVM是基于栈的虚拟机,DVM是基于寄存器的虚拟机 因为这个差异导致如下结果:

    JVM基于栈的读写数据耗费指令更多,更费时; DVM基于寄存器的读写数据耗费指令少,速度快,但是因为需要显式指定操作数,单个指令会比jvm的指令要长 虽然DVM指令比jvm长,然而jvm需要的指令数目多,因此实际上占据的空间可能差不多

另外这两个虚拟机执行的字节码也有差异 下图是JVM虚拟机中Java代码从编写到执行的过程

下图是DVM虚拟机中java代码从编写到执行的过程

可以看到,其实DVM字节码是从java字节码通过dx/d8工具转换而来

2.2 ART虚拟机 ART虚拟机是Android4.4发布的,用来替换Dalvik虚拟机,Android 4.4默认采用的还是DVM,不过系统会提供一个选项来开启ART。在Android 5.0时,默认采用ART。 2.2.1 ART和DVM的区别 DVM虚拟机中应用每次运行时,字节码都需要通过即时编译器转换成机器码,这会使应用的运行效率降低 ART与DVM最大的区别是,ART虚拟机在安装apk程序时,对.dex文件进行了一次预编译,并将编译结果保存起来,这样不用每次运行程序都重新对.dex文件编译成机器码,提高程序的运行速率

  1. APK打包流程