Android技术要点归纳(二)-Dalvik虚拟机篇

一、什么是Dalvik虚拟机

Dalvik是Google公司自己设计用于Android 平台的Java虚拟机,具有高效、简洁、节省资源的特点,从Android系统架构图知,Dalvik虚拟机运行在Android的运行时库层

Dalvik作为面向Linux、为嵌入式操作系统设计的虚拟机,主要负责完成对象生命周期管理、堆栈管理、线程管理、安全和异常管理,以及垃圾回收等

二、Dalvik虚拟机的特点

  1. 体积小,占用内存空间小
  2. 专有的dex可执行文件格式,体积更小,执行速度更快。
  3. 常量池采用32位索引值,寻址类方法名,字段名,常量更快
  4. 基于寄存器架构,并拥有一套完整的指令系统。
  5. 提供了对象生命周期管理,堆栈管理,线程管理,安全和异常管理以及垃圾回收等重要功能。
  6. 所有的Android程序都运行在Android系统进程里,每个进程对应一个Dalvik虚拟机实例。

三、Dalvik虚拟机和Java虚拟机的区别

Java虚拟机运行的是Java字节码,Dalvik虚拟机运行的Dalvik字节码

传统的Java程序经过编译,生成Java字节码保存在class文件中,Java虚拟机通过解码class文件中的内容运行程序。 而Dalvik虚拟机运行的是Dalvik字节码,所有的Dalvik字节码由Java字节码转换而来,并被打包到一个dex文件中,Dalvik虚拟机通过解析dex文件来执行这些字节码。

Dalvik可执行文件体积小,Android SDK中有一个叫dx的工具负责将Java字节码转换成Dalvik字节码。

dx工具对Java类文件重新排列,消除在文件中出现的所有的冗余信息,避免虚拟机在初始化时出现反复的文件加载和解析过程。 一般情况下,Java类文件中包含多个不同的方法签名,如果其他的类文件引用该类文件中的防范, 方法签名也会被复制到其他类文件中,也就是说, 多个不同的类会同时包含相同的方法签名,同样的,大量的字符串常量在多个类文件中也会被重复使用,这些冗余信息会直接增加文件的体积,同时也会影响虚拟机解析文件的效率。消除其中的冗余信息,重新组合成一个常量池,所有的类文件共享一个常量池,由于dx工具对常量池的压缩,使得相同的字符串,常量在dex文件中只出现一次,从而减小了文件的体积。

Java虚拟机与Dalvik虚拟机架构不同。这也是它们之间最大的区别。

  • Java虚拟机基于栈架构,程序在运行时虚拟机需要频繁的从站上读取或者写入数据,这个过程需要更多的指令分派与内存访问次数,会耗费不少CPU时间,对于像手机这种资源有限的设备来说,这是相当大的一笔开销
  • Dalvik虚拟机基于寄存器架构,数据的访问通过寄存器直接传递,这样的访问方式比基于栈方式要快很多。

四、Dalvik虚拟机结构

一个程序首先经过dx工具将class文件转换成Dalvik虚拟机可以执行的dex文件,然后由类加载器加载原生类和Java类,接着由解释器根据指令集对Dalvik字节码进行解析、执行,最后,根据dvm_arch参数选择编译的目标体系结构。

五、Android APK 编译打包流程

  1. Java编译器对工程本身的Java代码进行编译,这些java代码有三个来源:app的源代码、由资源文件生成的R文件以及有aidl文件生成的java接口文件。产出为.class 文件。 ① 用AAPT编译R.java文件 ② 编译AIDL的java文件 ③ 把java文件编译成class文件
  2. .class文件和依赖的三方库文件通过dex工具生成Dalvik虚拟机可执行的.dex文件,包含了所有的class信息,包括项目本身的class和依赖的class,产生出.dex文件。
  3. apkbuilder 工具将.dex 文件和编译后的资源文件生成未经签名对齐的apk文件,这里编译后的资源文件包括两部分,一是由aapt编译产生的编译后的资源文件,二是依赖的三方库里的资源文件,产生为未经签名的apk文件。
  4. 分别由Jarsigner和zipalign对apk文件进行签名和对齐,生成最终的apk文件。

总结:编译-> Dex -> 打包 -> 签名和对齐

转载于:https://juejin.im/post/5cf0caf7f265da1bac3ffd38

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值