Android APK安装过程学习笔记
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安装过程学习笔记的更多相关文章
- Android APK安装过程介绍
课题路径:从Myfile中点击应用进行安装,到安装完成,过程分析 思想方法:在研究PreloadInstaller的时候我们直接从整个apk的文件结构入手,由整体到部分的分析:但现在整个PMS非常庞大 ...
- Android安装器学习笔记(一)
Android安装器学习笔记(一) 一.Android应用的四种安装方式: 1.通过系统应用PackageInstaller.apk进行安装,安装过程中会让用户确认 2.系统程序安装:在开机的时候自动 ...
- Android(java)学习笔记160:Framework运行环境之 Android进程产生过程
1.前面Android(java)学习笔记159提到Dalvik虚拟机启动初始化过程,就下来就是启动zygote进程: zygote进程是所有APK应用进程的父进程:每当执行一个Android应用程序 ...
- Android(java)学习笔记205:网易新闻RSS客户端应用编写逻辑过程
1.我们的项目需求是编写一个新闻RSS浏览器,RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,是使用最广泛的XML应用.RSS目前广泛用于网上新闻频道,bl ...
- Android(java)学习笔记103:Framework运行环境之 Android进程产生过程
1. 前面Android(java)学习笔记159提到Dalvik虚拟机启动初始化过程,就下来就是启动zygote进程: zygote进程是所有APK应用进程的父进程:每当执行一个Android应用程 ...
- Android(java)学习笔记148:网易新闻RSS客户端应用编写逻辑过程
1.我们的项目需求是编写一个新闻RSS浏览器,RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,是使用最广泛的XML应用.RSS目前广泛用于网上新闻频道,bl ...
- Android Activity启动流程, app启动流程,APK打包流程, APK安装过程
1.Activity启动流程 (7.0版本之前) 从startActivity()开始,最终都会调用startActivityForResult() 在该方法里面会调用Instrumentation. ...
- Android自动化测试之Monkeyrunner学习笔记(一)
Android自动化测试之Monkeyrunner学习笔记(一) 因项目需要,开始研究Android自动化测试方法,对其中的一些工具.方法和框架做了一些简单的整理,其中包括Monkey.Monkeyr ...
- Android(java)学习笔记206:利用开源SmartImageView优化网易新闻RSS客户端
1.我们自己编写的SmartImageView会有很多漏洞,但是我们幸运的可以在网上利用开源项目的,开源项目中有很多成熟的代码,比如SmartImageView都编写的很成熟的 国内我们经常用到htt ...
随机推荐
- The web application registered the JDBC driver * but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
最近使用了最新版的tomcat9,使用jdbc链接mysql数据库.关闭tomcat过程中出现警告 13-Sep-2017 22:22:54.369 WARNING [main] org.apache ...
- Tomcat开启本地库(Apache Tomcat Native Library)支持
操作系统环境:Ubuntu 17 amd64位 软件环境:Tomcat 9 tomcat安装位置:/opt/tomcat JDK:1.8.144 64位 安装步骤: 1:编译安装 cd /opt/t ...
- 7I - 数塔
在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 已经告诉你了,这是个DP的题目 ...
- Learning to Promote Saliency Detectors
Learning to Promote Saliency Detectors 原本放在了思否上, 但是公式支持不好, csdn广告太多, 在博客园/掘金上发一下 https://github.com/ ...
- table 的部分使用,固定行,固定列等
主要是用多张table表格实现 <!DOCTYPE html> <html lang="en"> <head> <meta charset ...
- odoo8资料
官网: https://www.odoo.com/documentation/8.0/ 官方文档: http://odoo-master.readthedocs.io/en/8.0/howtos/we ...
- yarn 常用命令
1.安装 yarn npm install yarn -g 2.卸载yarn npm uninstall yarn -g
- spring事务相关
在 SPRING 中一共定义了六种事务传播属性 PROPAGATION_REQUIRED -- 支持当前事务,如果当前没有事务,就新建一个事务.这是最常见的选择. PROPAGATION_SUPPOR ...
- 解决sqlserver还原数据库失败命令
1.使用Master数据库 2.选择数据库 select * from master.sys.sysprocesses where dbid=db_id('database') 3.查出进程使用kil ...
- 初识spark的MLP模型
初识Spark的MLP模型 1. MLP介绍 Multi-layer Perceptron(MLP),即多层感知器,是一个前馈式的.具有监督的人工神经网络结构.通过多层感知器可包含多个隐藏层,实现对非 ...