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

时间: 2024-12-13 05:29:29

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

Android APK安装过程介绍

课题路径:从Myfile中点击应用进行安装,到安装完成,过程分析 思想方法:在研究PreloadInstaller的时候我们直接从整个apk的文件结构入手,由整体到部分的分析:但现在整个PMS非常庞大.我们采取抓住某个功能点分析,由点到面,直到掌控全部 目录现象    1log分析    3PackageInstaller 功能的提取    4PackageInstaller/AndroidManifest.xml    4PackageInstallerActivity.java    4In

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

1.我们的项目需求是编写一个新闻RSS浏览器,RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,是使用最广泛的XML应用.RSS目前广泛用于网上新闻频道,blog和wiki,主要的版本有0.91, 1.0, 2.0.使用RSS订阅能更快地获取信息,网站提供RSS输出,有利于让用户获取网站内容的最新更新.网络用户可以在客户端借助于支持RSS的聚合工具软件,在不打开网站内容页面的情况下阅读支持RSS输出的网站内容. 例如如下的网易RSS订阅: 2.由于我们这

Android(java)学习笔记233: 远程服务的应用场景(移动支付案例)

一. 移动支付:       用户需要在移动终端提交账号.密码以及金额等数据 到 远端服务器.然后远端服务器匹配这些信息,进行逻辑判断,进而完成交易,返回交易成功或失败的信息给移动终端.用户提交账号.密码以及金额等数据都是比较敏感的数据,这些数据不能让外界获取.       阿里等等支付宝平台把支付的逻辑封装起来,只给我们提供一个方法去调用,这样提高了安全性.当我们用户提交账号.密码以及金额等数据,点击"支付"的时候,支付宝平台已经调用方法加密数据(这个支付逻辑是远程服务,为了安全,防

Android(java)学习笔记160:Framework运行环境之启动Zygote

前面Android(java)学习笔记159提到Dalvik虚拟机启动初始化过程,就下来就是启动zygote进程: zygote进程是所有APK应用进程的父进程:每当执行一个Android应用程序,Zygote就会孵化一个子线程去执行该应用程序(系统内部执行dvz指令完成的)  Å特别注意:系统提供了一个app_process进程,它会自动启动ZygoteInit.java和SystemServer.java这两个类,app_process进程本质上是使用dalvikvm启动ZygoteInit

redis 安装配置学习笔记

redis 安装配置学习笔记 //wget http://download.redis.io/releases/redis-2.8.17.tar.gz 下载最新版本 wget http://download.redis.io/redis-stable.tar.gz 首先必须要有 gcc 与 make apt-get install gcc apt-get install make 1.解压 [email protected]:~# tar -xvf redis-stable.tar.gz 2.测

Android(java)学习笔记204:自定义SmartImageView(继承自ImageView,扩展功能为自动获取网络路径图片)

1.有时候Android系统配置的UI控件,不能满足我们的需求,Android开发做到了一定程度,多少都会用到自定义控件,一方面是更加灵活,另一方面在大数据量的情况下自定义控件的效率比写布局文件更高. 2.下面我们是自定义一个SmartImageView继承自ImageView,扩展了ImageView的功能:     步骤: • 新建一个SmartImageView类,让继承自ImageView(放置特定的包下): • 实现SmartImageView类下的构造方法,最好全部实现,这个不容易出

Android(java)学习笔记179:有序广播和无序广播

之前我们在Android(java)学习笔记178中自定义的广播是无序广播,下面我们要了解一下有序广播:   1.   我们首先了解一下有序广播和无序广播区别和联系? (1) 有序广播> 接受者有优先级,接受按照先后顺序接受,类似中央向下传文件.高优先级的接受者可以把广播消息给拦截,还可以修改广播的数据.(2)无序广播> 接受者没有优先级,没有先后顺序.类似听广播,看新闻联播.不可以被拦截.> sendBroadcast(intent) (3).有序广播和无序广播没有什么本质的区别,相同

《LINUX内核设计的艺术》第一章从开机家电到执行main函数之前的过程 学习笔记之一

从开机加电到实行main函数之前的过程 分为三步,目的是实现从启动盘加载操作系统程序,完成实现main函数的准备工作 启动BLOS,准备是模式下的中断向量表和中断服务程序 从启动盘加载操作系统程序到内存.加载操作系统程序就是靠第一步实现的 为实现32位的main函数做过度工作 1.1启动blos,准备实模式下的中断向量表和中断服务程序 由blos来加载软件操作系统的任务 1.1.1         BLOS的启动原理 0XFFFF0 由硬件来启动,CPU硬件设计逻辑设计为加电瞬间就强行将CS的值

[转载]Android Bitmap和Canvas学习笔记

http://blog.chinaunix.net/uid-20771867-id-3053339.html [转载]Android Bitmap和Canvas学习笔记,布布扣,bubuko.com