(一)android虚拟机Dalvik基础

1.Android层次介绍

Android系统架构采用分层思想,这样可以减少层与层之间的依赖性 
Android系统由以下几个部分组成:

  1. 应用程序(APPLICATIONS)
  2. 应用程序框架(APPLICATIONS FRAMEWORK)
  3. Android运行时(ANDROID RUNTIME) 
    • 核心库
    • DVM(Dalvik Virtual Machine)
  4. 函数库(LIBRARIES)
  5. Linux内核(LINUX KERNEL)

 

2.java虚拟机和Dalvik虚拟机的区别

(1)Dalvik 基于寄存器,而 JVM 基于栈。基于寄存器的虚拟机Dalvik对于更大的程序来说,在它们编译的时候,花费的时间更短。  

(2)Dalvik执行.dex格式的字节码,而JVM执行.class格式的字节码。

(3)Dalvik可执行文件体积更小。SDK中存在一个工具dx,其主要是将java字节码转换为Dalvik字节码,在转换过程中将java的类文件重新排列、消除类文件中出现的所有冗余信息。冗余信息主要是不同类文件中的方法签名,常量池。

3.Dalvik执行程序

Android系统运行过程: 
1.加载内核 
2.执行init进程,init进程完成设备初始化,然后读取init.rc文件并且启动外部程序Zygote。 
3.Zygote进程初始化Dalvik虚拟机,启动system_server并且进入Zygote模式,通过Socket等候命令。 
4.当执行一个Android应用程序的时候,system_server进程通过Binder IPC方式发送命令给Zygote,Zygote收到命令之后通过fork自身创建一个Dalvik虚拟机的实例来执行应用程序的入口函数,这样一个程序就启动完成了(每一个应用程序独自占据一个dalvik虚拟机实例)。

zygote创建进程的方法:

  • fork(),创建一个Zygote进程(这种方式不会被调用,因为只有一个Zygote进程)
  • forkAndSpecialize(),创建一个非Zygote进程
  • forkSystemServer(),创建一个系统服务进程

特点: 
zygote进程可以再fork出其他进程 
非zygote进程则不能fork出其他进程 
system_server进程在终止后他的子进程也必须终止

执行过程: 
当进程fork成功之后,执行的工作就交给了Dalvik虚拟机

Dalvik虚拟机首先通过loadClassFromDex()函数完成类的加载工作,每个类被成功解析后都会拥有一个ClassObject类型的的数据结构存储在运行时环境(Android Runtime)中,虚拟机使用gDvm.loadClasses全局哈希表来存储和查询所有装载进来的类

字节码验证器使用dvmVerifyCodeFlow()函数对装入的代码进行校验

接着虚拟机调用FindClass()函数查找并且装载main方法类

随后调用dvmInterpret()函数初始化解释器并且执行字节码流。

4.即时编辑方式JIT

Android运行时将字节码翻译为机器码的方式,(1)method方式、以函数和方法为单位,(2)trace方式、分为热路径和冷路径优先。

下一节讲述Dalvik指令集

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值