开发 Android 应用后,一般都会安装到手机上去运行,了解应用是如何安装到手机上的,可以更好的理解应用的本质,理解应用是如何运行的,在自己开发的应用遇到一些问题时,会从更深层次去分析,快速定位找到原因。这一篇文章中我们就来详细分析一下应用是如何安装的。

背景知识

要想详细了解 APK 的安装过程,需要了解一些基础概念,包括:

  1. 什么是 APK
  2. 什么是 DEX 文件和 ODEX 文件
  3. 什么是 OAT 文件
  4. 什么是 Dalvik 和 ART

总体来说是:APK 是 Android 应用安装包,Dalvik 和 ART 都是 Android 运行环境,但是由于 Dalvik 存在一些不足,ART 是在高版本手机上替换 Dalvik 的。应用的安装过程就是将 APK 中内容解压处理的过程,Dalvik 会将 APK 中内容 DEX 转化为 ODEX,ART 会将其转化为 OAT。下面对这些问题分别进行分析。

什么是 APK

APK,即 Android Package,Android 安装包。不同平台的安装文件格式都不同,类似于 Windows 的安装包是二进制的 exe 格式,Mac 的安装包是 dmg 格式。APK 的可以在 Android 上执行安装,APK 的本质是一个 Zip 压缩包,只是后缀被修改为 apk,其中打包了源代码编译出的 class.dex、一些图片视频资源文件和一些 Native 库文件。APK 文件与 Zip 文件最大的一个不同是 APK 包含签名信息,用于保证安装包安全不被修改。

什么是 DEX 文件和 ODEX 文件

说起 DEX 文件,不得不提 class 文件。Java 跨平台是由源代码编译出的 class 文件分别运行在不同平台的虚拟机上,由虚拟机屏蔽了不同平台的差异。如图:

但是由于 Android 系统针对手持设备,对 Dalvik 虚拟机进行了优化,主要包括:

  1. 将原来 class 文件进行优化,例如将其中的常量冗余信息进行合并,提高虚拟机解析效率;
  2. 修改 JVM 运行时基于栈的数据结构修改为 Dalvik 基于寄存器的数据结构,数据访问方式更快,运行效率更高。

这种情况下,原来的 .class 文件就有些不适用了,因此,出现了 dex 文件格式,它是源代码编译后打包生成的文件。它是 APK 的一个组成部分。

ODEX 文件是 Dalvik 将 DEX 文件中可执行文件——class.dex——文件解压出来后,存储在本地后生成的。因为 Android 系统无法直接运行 APK 文件,需要将其解压后找到 class.dex 文件后才可以运行,因此在安装时就将其取出放在本地,可以提高应用启动速度。除了这个原因,其实在将 class.dex 转换成 ODEX 文件过程中,还根据当前系统进行了优化(直接复制到其他系统不一定可以运行),文件大小会减少,ODEX 文件比 DEX 文件更难反编译,这也在一定程度上提高了安全性,因此在一些系统预装或系统级应用大多采用了 ODEX 优化。

一般 ODEX 不直接运行,在 Dalvik 运行 ODEX 时,需要通过 JIT 进行优化,提高运行效率。JIT 是一种在运行时同步将字节码转化成机器码的过程,Dalvik 直接运行转化后的机器码,这会导致部分的内存和时间开销,但是整体来说,在某些情况下是会提高系统性能的。(有些动态编译器,可能根据经验或尝试编译,优化这一过程,可能运行次数越多,优化效果越好)

什么是 OAT 文件

OAT 文件是 ART 运行的文件,是一种二进制可运行文件,包含 DEX 文件和编译出的本地机器指令文件,其文件格式类似于网络数据报文,包含文件头和文件体,文件头的 oatdata、oatexec 和 oatlastword 字段分别描述 DEX 文件位置和本地机器指令的起止位置。因为 OAT 文件包含 DEX 文件,因此比 ODEX 文件占用空间更大,由于其在安装时经过了 ART 的处理,ART 加载 OAT 文件后不需要经过处理就可以直接运行,它没有了从字节码装换成机器码的过程,因此运行速度更快。可以理解为 JIT 从运行时才解析提前到了安装时解析,安装变慢,运行变快。

什么是 Dalvik 和 ART

上面提到了 Dalvik 和 ART,Dalvik 和 ART 是 Android 平台实现的 JAVA 虚拟机。用于解析 DEX 文件、ODEX 文件和OAT 文件。

ART 即 Android Runtime,Android 运行时,由于 Android 系统会运行在不同的设备上,底层硬件不同,Linux 系统屏蔽了一些这些系统的细节,但是直接在 Linux 上开发应用太难,实现成本太高,为了屏蔽 Linux 的细节,Google 创建出了 Dalvik 和 ART,对 Linux 进行了再一次封装,这样,使用 Google 提供的集成开发环境 SDK,就可以轻松开发应用了,Dalvik 与 ART 的关系是 ART 用来替换 Dalvik 的。Dalvik 在低版本(4.4 以下)的手机上使用作为 Android 运行环境,但是由于其有一些不足,在高版本的 Android 系统上 ART 用来替换 Dalvik,现在市场上 ART 的占有率已经超过了 70%。

ART 是 Android 应用的运行模式,在这种模式下,Android 应用在安装后,会进行一次预编译,将应用安装包中的字节码转换成机器语言存储在本地(系统只能运行二进制程序),这样,应用在运行时,可以直接执行这些二进制程序。相比较于 Dalvik 来说,Dalvik 的做法是在应用安装后,直接将字节码存储起来,在每次运行时,需要将代码编译成机器语言,这样在运行程序时,就比 ART 慢了一些。ART 这样做导致了安装后应用所占的空间更大,安装时间更长,但是对于经常使用的应用,这样做是值得的。

APK 是如何安装的呢?

了解了以上的知识,理解应用安装就简单了,我们整体看一下应用是如何安装的。

程序的源代码,首先经过 SDK 编译成 DEX 文件,DEX 文件和一些资源文件(图片、视频等)、Native Code(C 语言等编译出的 .so 文件)会直接打包进 APK。安装 APK 的过程,其实是安装包解压过程。资源文件、二进制库等解压后直接存储在本地,DEX 文件不仅仅解压,会根据系统的运行环境,采用不同的处理方式,被处理成不同格式的文件存储在本地,等待程序启动调用,这样就完成了应用的安装过程。

总结

这一篇文章中,我们详细介绍了 Android APK 的安装过程,分析了 Dalvik 和 ART 的不同以及安装过程的不同。

注:本文部分图片来自网络。

知其然,更要知其所以然,SealDEV 倾情出品。

【SealDEV 倾情奉献】Android APK 安装过程详解相关推荐

  1. Android APK文件结构 完整打包编译的流程 APK安装过程 详解

    Android apk文件结构 打包编译的流程 Android官网 配置构建 流程 Configure your build The build process APK文件结构 assets res ...

  2. android-studio安装过程详解

    android-studio安装过程详解 转载 2018年01月18日 13:53:32 标签: android-studio / android-studio安装 / Gradle / androi ...

  3. Linux下Nginx编译安装过程详解

    Linux下Nginx编译安装过程详解 一.Nginx介绍 二.Nginx源码下载 1.打开Nginx官网 2.下载官网的源码包 三.Nginx源码安装 1.解压源码包 2.安装开发包组及环境 3.编 ...

  4. ASP.NET MVC 的安装过程详解

    ASP.NET MVC 的安装过程详解 如果你的机器上没有任何开发软件,你需要准备的工具有: (1)    Visual_studio_team_system_2008(vs2008) (2)    ...

  5. 手机连接投影机的步骤_投影机安装过程详解

    投影机安装过程详解 一 投影机的安装方式 1.桌面摆放 桌面投影虽然看起来不是很美观,但可以省去那些繁琐的步骤,只需要准备一张桌子,还可以购买一些专门用来摆放投影机的可移动小车架,把投影机往上一放,连 ...

  6. python os模块安装方法_基于python中pygame模块的Linux下安装过程(详解)

    一.使用pip安装Python包 大多数较新的Python版本都自带pip,因此首先可检查系统是否已经安装了pip.在Python3中,pip有时被称为pip3. 1.在Linux和OS X系统中检查 ...

  7. CentOS下DB2数据库安装过程详解

    这篇文章主要介绍了CentOS下DB2数据库安装过程详解,本文步骤详细,操作的命令也比较全 安装前请查看DB2版本和许可证说明来增加了解,先弄明白改安装什么版本,这里我用的是最新的Express-C版 ...

  8. android 按键用户点击事件,Android按键事件处理过程详解

    Android按键事件处理过程详解 (2013-09-26 14:05:19) 标签: it 在Android系统中,存在多种界面事件,如点击事件.触摸事件.焦点事件和菜单事件等,在这些界面事件发生时 ...

  9. SQL Server 2008 R2 安装过程详解

    SQL Server 是Microsoft 公司推出的关系型数据库管理系统.Microsoft SQL Server 是一个全面的数据库平台,使用集成的商业智能 (BI)工具提供了企业级的数据管理.M ...

最新文章

  1. ngrok linux开机自启动,CentOS 搭建ngrok服务器
  2. 虚机和实体服务器性能,虚机的性能主要与以下几方面有关
  3. JSP-05- JSP总结
  4. mysql explain分析
  5. 详解Redis的架构演化之路(附16张图解)
  6. Zookeeper(一)——简介
  7. java中的命名空间_XPath与Java中的命名空间
  8. 【王道计组笔记】输入/输出设备磁盘
  9. python编写自动化脚本工具_Python自动化构建工具scons使用入门笔记
  10. sql lab 爆库 心得
  11. Redis应用(一)——Windows系统中搭建并启动redis环境
  12. 计算机打字练习程序,指法练习打字软件
  13. Unity技术手册-UGUI零基础详细教程-Image图片
  14. Android影音播放器需求分析,321影音全能影音播放器源码
  15. winform抓取淘宝宝贝详细页的上下架时间等信息
  16. 大数据分析的四个关键环节
  17. Java实现线性回归模型算法
  18. 【前端 H5】网页H5 调用微信支付和支付宝支付 流程
  19. 大型技术组织 DevOps 转型经验总结
  20. 查询网站的谷歌PR权重复杂吗?查询谷歌PR权重最简单的方法

热门文章

  1. 编程爱好者网站试题中心
  2. 基于python的电商网站建设_基于Django的电子商务网站开发
  3. 阿里云邮箱短信验证和阿里云手机短信发送
  4. 铁路及工程相关专业术语自动查询
  5. 365值得吗 office_你可能是正版受害者?吐槽Office 365坑爹之处
  6. 三元运算符案例(两只老虎、三个和尚)问题、分析、代码
  7. 苹果频率测试软件gen,【技术干货】进行精准的PCIe 4.0时钟抖动测量
  8. 无法挣脱的命运——《巴黎圣母院》读后感4000字
  9. 线性代数 --- 如何求解不可逆的mxn长方形矩阵Ax=0的通解Null(A)和Ax=b的通解
  10. 前端需要了解的颜色模型,RGB、HSL和HSV