Android APK安装过程学习笔记

时间:2022-09-02 07:25:26

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. NeHe OpenGL教程 第三十三课:TGA文件

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  2. oracle11g OEM无法连接到数据库实例解决办法

    我的电脑是32位的win7家庭版系统,那么这样的系统能不能装上oracle呢?能的!就是可能会出错,在装oracle时,每个人遇到的问题都不同,有的人装了双系统,有的人重做了系统,真心酸,先让电脑断网 ...

  3. CodeForces 544C (Writing Code)(dp,完全背包)

    题意:有n个程序员,要协作写完m行代码,最多出现b个bug,第i个程序员每写一行代码就会产生a[i]个bug,现在问,这n个人合作来写完这m行代码,有几种方案使得出的bug总数不超过b(题中要求总方案 ...

  4. iOS之内存管理(ARC)

    iOS的内存管理,相信大家都不陌生,之前是使用的MRC,由开发人员手动来管理内存,后来使用了ARC,来由系统管理内存.本文主要讲讲Autorelease,Core Foundation对象在内存管理方 ...

  5. Oarcle 之DML

    DML:数据操纵语言(Data Manipulation Language, DML)是SQL语言中,负责对数据库对象运行数据访问工作的指令集,以INSERT.UPDATE.DELETE三种指令为核心 ...

  6. React 实现一个时钟

    最终效果 其实主要难点在于最左边的小时钟 指针的实现方式很简单,就是通过绝对定位将指针移到中间,然后以下边中间的位置为圆心旋转即可.代码如下: <!DOCTYPE html> <ht ...

  7. Practice&vert; 数组

    /* 从键盘确定班级的组号,在从键盘输入每一组的人数,并输入每一个学员的成绩,并求出,每一组的平均分, 全部的平均分,每一组的最高分,全部的最高分,并显示结果. */ class Test3{ pub ...

  8. Ubuntu12&period;04下解决sudo apt-get update警告Duplicate sources&period;list entry

    sudo apt-get update,会提示如下警告: W: Duplicate sources.list entry http://archive.canonical.com/ubuntu/ pr ...

  9. &lbrack;Python&rsqb; Print input and output in table

    Print the input and output in a table using prettyTable. from prettytable import PrettyTable import ...

  10. python调用caffe环境配置

    背景是这样的,项目需要,必须将训练的模型通过C++进行调用,所以必须使用caffe或者mxnet,而caffe是用C++实现,所以有时候简单的加载一张图片然后再进行预测十分不方便 用caffe写pro ...