编程进阶网编程进阶网
  • 基础组成体系
  • 程序编程原理
  • 异常和IO系统
  • 六大设计原则
  • 设计模式导读
  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式
  • 设计模式案例
  • 面向对象思想
  • 基础入门
  • 高级进阶
  • JVM虚拟机
  • 数据集合
  • Java面试题
  • C语言入门
  • C综合案例
  • C标准库
  • C语言专栏
  • C++入门
  • C++综合案例
  • C++专栏
  • HTML
  • CSS
  • JavaScript
  • 前端专栏
  • Swift
  • iOS入门
  • 基础入门
  • 开源库解读
  • 性能优化
  • Framework
  • 方案设计
  • 媒体音视频
  • 硬件开发
  • Groovy
  • 常用工具
  • 大厂面试题
  • 综合案例
  • 网络底层
  • Https
  • 网络请求
  • 故障排查
  • 专栏
  • 数组
  • 链表
  • 栈
  • 队列
  • 树
  • 递归
  • 哈希
  • 排序
  • 查找
  • 字符串
  • 其他
  • Bash脚本
  • Linux入门
  • 嵌入式开发
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 职场提升
  • 技术模版
  • 关于我
  • 目标清单
  • 学习框架
  • 育儿经验
  • 我的专栏
  • 底层能力
  • 读书心得
  • 随笔笔记
  • 职场思考
  • 中华历史
  • 经济学故事
  • 基础组成体系
  • 程序编程原理
  • 异常和IO系统
  • 六大设计原则
  • 设计模式导读
  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式
  • 设计模式案例
  • 面向对象思想
  • 基础入门
  • 高级进阶
  • JVM虚拟机
  • 数据集合
  • Java面试题
  • C语言入门
  • C综合案例
  • C标准库
  • C语言专栏
  • C++入门
  • C++综合案例
  • C++专栏
  • HTML
  • CSS
  • JavaScript
  • 前端专栏
  • Swift
  • iOS入门
  • 基础入门
  • 开源库解读
  • 性能优化
  • Framework
  • 方案设计
  • 媒体音视频
  • 硬件开发
  • Groovy
  • 常用工具
  • 大厂面试题
  • 综合案例
  • 网络底层
  • Https
  • 网络请求
  • 故障排查
  • 专栏
  • 数组
  • 链表
  • 栈
  • 队列
  • 树
  • 递归
  • 哈希
  • 排序
  • 查找
  • 字符串
  • 其他
  • Bash脚本
  • Linux入门
  • 嵌入式开发
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 职场提升
  • 技术模版
  • 关于我
  • 目标清单
  • 学习框架
  • 育儿经验
  • 我的专栏
  • 底层能力
  • 读书心得
  • 随笔笔记
  • 职场思考
  • 中华历史
  • 经济学故事
  • 02.Android虚拟机知识
  • 03.App核心概念分析
  • 04.Android消息机制
  • 05.Android程序UI框架
  • 06.Android应用窗口
  • 07.WMS机制深入分析
  • 08.PMS机制深入分析
  • 09.AMS机制深入分析
  • 11.四大组件原理分析
  • 12.四大组件原理分析
  • 13.View绘制流程分析
  • 14.View渲染流程分析
  • 16.Android绘制原理
  • 17.Android事件传输
  • 18.Android事件拦截
  • 21.View自定义控件反思
  • 22.ViewGroup自定义控件
  • 25.IPC跨进程通信实践
  • 29.Binder机制的理解

02.Android虚拟机知识

目录介绍

  • 01.Android虚拟机介绍

01.Android虚拟机介绍

1.1 什么是虚拟机

  • 虚拟机(JVM)的作用是什么
    • 将Java源码编译成字节码文件.class文件,并且运行这些字节码文件,为什么可以运行呢,因为它可以将这些字节码解读(翻译)成不同平台(系统)对应的机器码,从而能运行。而Dalvik和Art是安卓中使用的虚拟机。

1.2 Android虚拟机区别

  • Jvm虚拟机与Android虚拟机的区别
    • 一个Java文件通过JVM虚拟机调用javac编译成.class文件,然后虚拟机运行该字节码文件时,就是将里面的字节码翻译成机器指令供硬件去运行。
    • 在安卓体系里,一个Java文件通过虚拟机调用javac编译成.class文件后,会用dex工具去将该.class文件编译成.dex文件,然后这些.dex文件又会被打包成apk文件,当安装apk文件时,安卓虚拟机就会运行里面的.dex文件,将.dex里面的字节码翻译成机器指令供硬件去运行。
  • Java虚拟机和Android虚拟机区别图
    • image
      image

1.3 Art虚拟机与Dalvik虚拟机

  • 安卓5.0之前的虚拟机是Dalvik虚拟机,使用的是JIT编译
    • 即每次运行程序,都实时地进行将部分dex字节码编译成机器指令供手机去运行,这样整个apk包占用系统内存会很小,但因为每次运行都需要编译,所以CPU的消耗则变大。
  • 5.0之后安卓虚拟机就变成ART虚拟机,使用AOT编译
    • 即在应用安装期间,就将全部dex文件编译成机器指令存储在手机上。这样手机运行app时就可以直接运行这些机器指令,不需要像以前Dalvik虚拟机那样还要再去编译,这样就可以使得整个app运行过程速度要快很多。
    • 当然与此同时app可能会比以前要占用的内存要大,但现在的安卓手机的内存已经发展的越来越大了,所以这个缺点是可以忽略不计的。

1.4 class文件与dex文件区别

  • class文件与dex文件区别是什么
    • 一个class文件就是一个类文件,有多少个类则生成多少个文件,而一个dex文件是包含了很多文件。
    • 查看classes.dex里面是包含很多文件的,对比class文件来说,使用dex方式可以减少文件数,从而减少很多冗余数据,减少占用的内存大小。
  • class文件和dex文件的结构也是不一样:
    • image
      image
贡献者: yangchong211
下一篇
03.App核心概念分析