1.什么是APK

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

2.什么是DEX文件和ODEX文件

  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直接运行转化后的机器码,这会导致部分的内存和时间开销,但是整体来说,在某些情况下是会提高系统性能的。(有些动态编译器,可能根据经验或尝试编译,优化这一过程,可能运行次数越多,优化效果越好)。

3.什么是OAT文件

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

4.什么是Dalvik和ART

  Dalvik和ART都是Android运行环境,但是由于Dalvik存在一些不足,ART是在高版本手机上替换Dalvik的。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,现在市场上ART的占用率已经超过了70%。ART是Android应用的运行模式,在这种模式下,Android应用在安装后,会进行一次预编译,将应用安装包中的字节码转换成机器语言存储在本地(系统只能运行二进制程序),这样,应用在运行时,可以直接执行这些二进制程序。相比较于Dalvik来说,Dalvik的做法是在应用安装后,直接将字节码存储起来,在每次运行时,需要将代码编译成机器语言,这样在运行程序时,就比ART慢了一些。ART这样做导致了安装后应用所占的空间更大,安装时间更长,但是对于经常使用的应用,这样做是值得的。

5.APK是如何安装的?

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

总结:APK是Android安装包,Dalvik和ART都是Android运行环境,ART是在高版本手机上替换Dalvik的。dex文件是源代码编译后打包生成的文件,是APK的一个组成部分,安装时Dalvik将dex文件中可执行文件class.dex解压存储在本地的文件就是ODEX文件。ART运行生成的文件是OAT。

Dalvik与ART比较
(1)Dalvik和ART是Android平台实现的JAVA虚拟机。用于解析DEX文件、ODEX文件和OAT文件。
(2)ART解析模式是Android应用在安装后,会进行一次预编译,将应用安装包中的字节码转换成机器语言存储在本地。
(3)Dalvik解析模式是在应用安装后,直接将字节码存储起来,每次运行时,需要将代码编译成机器语言。
(4)运行程序时,Dalvik比ART慢,ART安装后应用所占的空间更大,安装时间长。

ODEX文件与OAT文件比较:
(1)Dalvik将APK中的内容转化成ODEX,ART将其转化成OAT。
(2)ODEX需要通过JIT进行优化,提高运行效率。
(3)OAT包含DEX文件和编译出的本地机器指令文件,比ODEX文件占用空间大,不需要经过处理就可以直接运行,运行速度快。

学习文章:http://mp.weixin.qq.com/s/37wjSQs1HWVfX0xL27NjBg

Android APK安装过程学习笔记的更多相关文章

  1. Android APK安装过程介绍

    课题路径:从Myfile中点击应用进行安装,到安装完成,过程分析 思想方法:在研究PreloadInstaller的时候我们直接从整个apk的文件结构入手,由整体到部分的分析:但现在整个PMS非常庞大 ...

  2. Android安装器学习笔记(一)

    Android安装器学习笔记(一) 一.Android应用的四种安装方式: 1.通过系统应用PackageInstaller.apk进行安装,安装过程中会让用户确认 2.系统程序安装:在开机的时候自动 ...

  3. Android(java)学习笔记160:Framework运行环境之 Android进程产生过程

    1.前面Android(java)学习笔记159提到Dalvik虚拟机启动初始化过程,就下来就是启动zygote进程: zygote进程是所有APK应用进程的父进程:每当执行一个Android应用程序 ...

  4. Android(java)学习笔记205:网易新闻RSS客户端应用编写逻辑过程

    1.我们的项目需求是编写一个新闻RSS浏览器,RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,是使用最广泛的XML应用.RSS目前广泛用于网上新闻频道,bl ...

  5. Android(java)学习笔记103:Framework运行环境之 Android进程产生过程

    1. 前面Android(java)学习笔记159提到Dalvik虚拟机启动初始化过程,就下来就是启动zygote进程: zygote进程是所有APK应用进程的父进程:每当执行一个Android应用程 ...

  6. Android(java)学习笔记148:网易新闻RSS客户端应用编写逻辑过程

    1.我们的项目需求是编写一个新闻RSS浏览器,RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,是使用最广泛的XML应用.RSS目前广泛用于网上新闻频道,bl ...

  7. Android Activity启动流程, app启动流程,APK打包流程, APK安装过程

    1.Activity启动流程 (7.0版本之前) 从startActivity()开始,最终都会调用startActivityForResult() 在该方法里面会调用Instrumentation. ...

  8. Android自动化测试之Monkeyrunner学习笔记(一)

    Android自动化测试之Monkeyrunner学习笔记(一) 因项目需要,开始研究Android自动化测试方法,对其中的一些工具.方法和框架做了一些简单的整理,其中包括Monkey.Monkeyr ...

  9. Android(java)学习笔记206:利用开源SmartImageView优化网易新闻RSS客户端

    1.我们自己编写的SmartImageView会有很多漏洞,但是我们幸运的可以在网上利用开源项目的,开源项目中有很多成熟的代码,比如SmartImageView都编写的很成熟的 国内我们经常用到htt ...

随机推荐

  1. 使用 python 操作 mongodb 常用的操作

    pymongo 的安装命令 pip install pymongo. import pymongo 数据库及集合查询(创建) 连接数据库 查询数据库中的数据库 查询数据库中的集合 创建数据库和集合只需 ...

  2. MyEclipse 编译错误 web项目中的 js,jsp报错 更改

    搜索   validation   语法检测 必须 选定一个  不然不编译

  3. 部落划分Group[JSOI2010]

    --BZOJ1821 Description 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常发生 ...

  4. P2158 [SDOI2008] 仪仗队(欧拉函数模板)

    题目描述 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图 ...

  5. dt常用类

    经常使用的一些datatable的操作,包括一些过滤去重的方法 using System; using System.Collections; using System.Collections.Gen ...

  6. MIUI通过xposed自动设置root权限

    在小米手机上,每次安装一个自己的插件总需要打开安全中心进行root权限授权,非常的麻烦,总共需要电5次确认,每次需要等5秒 因为插件开发的需求,希望重启计算机时候判断是否已经root,未root则自动 ...

  7. SHELL脚本学习-练习写一个脚本3

    #通过ping命令测试192.168.1段的所有主机是否在线,如果在线就显示is up并显示蓝色,如果不在线就显示is down. #!/bin/bash #Program Description: ...

  8. WCF调错方法

    1.在VS cmd里,输入wcftestclient.exe 2.添加Service服务. 3.点击要测试的方法,输入参数,点击Invoke. 4.如果错误信息很模糊,则修改WCF程序所在的Web.c ...

  9. 在 ASP.NET Core 中发送邮件遇到的坑_学习笔记

    功能需求 因为项目需要有个忘记密码验证邮箱再重新修改密码的功能,然后我选用了很简单的一个方案,通过验证登录用户的邮箱然后发送邮件,通过这个邮件发送的链接地址来最后实现密码修改的小功能. 项目环境及实现 ...

  10. 20175316 盛茂淞 Arrays和String单元测试

    Arrays和String单元测试 具体描述: 在IDEA中以TDD的方式对String类和Arrays类进行学习 测试相关方法的正常,错误和边界情况 String类 charAt split Arr ...