zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    程序员:不要自称为码农
    SpringBoot对静态资源配置
    LeetCode 572. Subtree of Another Tree(子树)
    LeetCode 437. Path Sum III(统计路径和等于sum的路径数量)
    LeetCode 112. Path Sum(判断路径和是否等于一个数)
    LeetCode 617. Merge Two Binary Trees(归并两棵二叉树)
    LeetCode 226. Invert Binary Tree(翻转二叉树)
    Failure to transfer org.apache.maven.plugins:maven-resources-plugin:pom:2.6 的解决办法
    linux-查询某软件的安装的目录
    WebService概念解释
  • 原文地址:https://www.cnblogs.com/zhangmiao14/p/6950561.html
Copyright © 2011-2022 走看看