Android中关于APK的一些知识

版权声明:本文为博主原创文章,转载请标明出处 https://blog.csdn.net/qq_30993595/article/details/81709962

APK

apk全称是AndroidPackage,也就是Android安装包;APK的本质是一个zip压缩包,如果将后缀名改成.zip,就可以解压,APK 文件与 Zip 文件最大的一个不同是 APK 包含签名信息,用于保证安装包安全不被修改,解压后的目录有:

  • res文件夹:用于存放Android资源文件的目录,里面有drawable图片资源,布局文件等,这里面的文件都是被编译过的(图片除外)
  • assets目录:用于存放需要打包到APK中的静态文件,文件没有进行编译
  • META-INF目录:即Metadata infomation元数据(又称中介数据、中继数据,用于描述数据的数据)信息目录,里面有MANIFEST.MF:摘要文件,列出了apk的所有文件,以及这些文件内容所对应的base64-encoded SHA1 哈希值,用于验证apk文件的完整性,判断apk是否被篡改;CERT.SF:摘要签名文件,它列出了MANIFEST.MF这个文件中每条信息的hash值,用于验证摘要文件是否被篡改;CERT.RSA:该文件保存了解密用的公钥,以及加密算法等信息等
  • AndroidManifest.xml:Android的应用配置文件,描述了应用的总体信息,需要使用的用户权限以及组件等等,已被编译
  • resources.arsc:资源配置文件,用于记录资源文件与资源id之间的映射关系,res/values中的信息大部分被编译在此处
  • lib目录:Android依赖的Native库的目录,其中会根据不同的cpu架构分为多个子目录
  • classes.dex:能用于dalvik执行的字节码,由多个.class的Java字节码文件组合而成

DEX文件

对于android应用程序,本质上使用的是java开发,使用标准的java编译器编译出Class文件,和普通的java开发不同的地方是把class文件再重新打包成dex类型的文件,这种重新打包会对Class文件内部的各种函数表、变量表等进行优化,最终产生了dex文件

ODEX文件

odex文件是dalvik虚拟机对解压出来的class.dex文件做一定程度的优化,文件大小会减少,存放在/data/dalvik-cache目录下,这样做可以加快软件的启动速度,预先提取,减少对RAM的占用

不过,这个优化过程会根据不同设备上Dalvik虚拟机的版本、Framework库的不同等因素而不同。在一台设备上被优化过的ODEX文件,拷贝到另一台设备上不一定能够运行。

ODEX 文件比 DEX 文件更难反编译,这也在一定程度上提高了安全性,因此在一些系统预装或系统级应用大多采用了 ODEX 优化。

一般 ODEX 不直接运行,在 Dalvik 运行 ODEX 时,需要通过Just-In-Time(JIT)编译器进行优化,提高运行效率。JIT 是一种在运行时同步将字节码转化成机器码的编译器,Dalvik 直接运行转化后的机器码

ODEX的内容有odex文件头-dex文件-依赖库-辅助数据,odex文件在原来的dex文件头添加了一些数据,在文件尾部添加了程序运行时需要的依赖库和辅助数据,使得程序运行速度加快。

OAT文件

OAT 文件是 ART 运行的文件,是一种二进制可运行文件,包含 DEX 文件和编译出的本地机器指令文件,其文件格式类似于网络数据报文,包含文件头和文件体,文件头的 oatdata、oatexec 和 oatlastword 字段分别描述 DEX 文件位置和本地机器指令的起止位置。因为 OAT 文件包含 DEX 文件,因此比 ODEX 文件占用空间更大

由于其在安装时打包在里面的classes.dex文件会被工具dex2oat翻译成本地机器指令,最终得到一个ELF格式的OAT文件,ART 加载 OAT 文件后不需要经过处理就可以直接运行,它没有了从字节码装换成机器码的过程,因此运行速度更快。

Dalvik 和 ART

Dalvik是Google公司自己设计用于Android平台的Java虚拟机。Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一,它可以支持已转换为.dex(即Dalvik Executable)格式的Java应用程序的运行,.dex格式是专为Dalvik应用设计的一种压缩格式,适合内存和处理器速度有限的系统。Dalvik经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik应用作为独立的Linux进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。

ART 即 Android Runtime,在Android5.0以后用来替换 Dalvik ;Dalvik 在低版本(4.4 以下)的手机上使用作为 Android 运行环境,但是由于Dalvik是依靠一个Just-In-Time(JIT)编译器去解释字节码,开发者编译后的应用代码需要通过一个解释器在用户的设备上运行,这一机制并不高效,所以在高版本的 Android 系统上 ART 用来替换 Dalvik,

在ART下,Android 应用在安装后,会进行一次预编译,将应用安装包中的字节码转换成机器语言存储在本地(系统只能运行二进制程序),这样,应用在运行时,可以直接执行这些二进制程序,运行效率更高,不过ART 这样做导致了安装后应用所占的空间更大,安装时间更长。

ART的运行原理:

  • 在Android系统启动过程中创建的Zygote进程利用ART运行时导出的Java虚拟机接口创建ART虚拟机。
  • APK在安装的时候,打包在里面的classes.dex文件会被工具dex2oat翻译成本地机器指令,最终得到一个ELF格式的oat文件。
  • APK运行时,上述生成的oat文件会被加载到内存中,并且ART虚拟机可以通过里面的

    1.oatdata和oatexec段找到任意一个类的方法对应的本地机器指令来执行。
    2.oat文件中的oatdata包含用来生成本地机器指令的dex文件内容
    3.oat文件中的oatexec包含有生成的本地机器指令。

ART优点:

  1. 系统性能的显著提升
  2. 应用启动更快、运行更快、体验更流畅、触感反馈更及时
  3. 更长的电池续航能力

ART缺点:

  1. 更大的存储空间占用,可能会增加10%-20%
  2. 更长的应用安装时间

APK安装过程

一个APK放到手机上执行安装会涉及到如下几个目录

  • /data/app:存放用户安装的apk,安装时会把apk复制到这里
  • /data/data:应用安装完成后,会在该目录下生成与apk包名一样的文件夹,用于存放应用数据
  • /data/dalvik-cache:存放apk的odex文件,便于应用启动时直接执行

首先,系统会把apk复制到/data/app下,然后通过META-INF下的文件校验apk的签名是否正确,检查apk的结构是否正常,进而解压并校验dex文件。如果dex文件没有被破坏,则会把dex文件优化为odex文件,使得程序的启动时间加快,同时,在/data/data目录下建立与apk包名相同的文件夹。如果apk中有Native库,lib目录的话,系统会判断so库的名字是否正确,并根据系统cpu架构解压对应的so库到/data/data/packagename/lib下。

猜你喜欢

转载自blog.csdn.net/qq_30993595/article/details/81709962