前言
在移动设备日益普及的今天,Android系统已经成为全球最流行的移动操作系统。作为Android开发者或逆向工程师,了解Android系统的演进历史以及APK文件的基本结构是非常重要的。本文将详细介绍Android历史版本的演变以及APK的基本结构。
一、Android历史版本
1.1 Dalvik虚拟机(Android 4.4以前)
在Android 4.4以前,Android系统采用的是Dalvik虚拟机(Dalvik Virtual Machine,简称DVM)。Dalvik虚拟机是专门为Android平台设计的,主要特点是:
- 每个应用程序都运行在自己独立的虚拟机实例中。
- 使用寄存器而不是堆栈来执行指令。
- 通过优化的字节码和垃圾回收机制,提升应用程序的性能和效率。
在这个阶段,Android应用程序的运行时库主要是libdvm.so
。
1.2 过渡时期(Android 4.4)
Android 4.4(KitKat)是一个过渡版本,它引入了ART(Android Runtime)虚拟机,同时保留了Dalvik虚拟机。用户和开发者可以在设置中选择使用DVM或ART,这一阶段的系统库包括libdvm.so
和libart.so
。
- Dalvik(DVM):继续支持已有的应用程序。
- ART:提供了更好的性能和更高效的垃圾回收机制,逐渐取代DVM。
1.3 ART虚拟机(Android 5.0及以后)
从Android 5.0(Lollipop)开始,ART虚拟机完全取代了Dalvik虚拟机,成为Android系统的默认运行时环境。ART的优势在于:
- 提高了应用程序的启动速度和运行性能。
- 提供了更高效的垃圾回收机制。
- 支持32位和64位架构。
在这个阶段,Android系统开始分为32位和64位版本。例如:
- Nexus 5:32位,运行Android 6.0
- Nexus 6P:64位,运行Android 6.0
二、APK基本结构
APK(Android Package)文件是Android应用程序的安装文件,它包含了应用程序的所有资源和代码。一个标准的APK文件通常包括以下几个部分:
2.1 assets
assets
目录下包含了应用程序的各种资源文件,如图片、音频、数据库、网页、配置文件、动态链接库(dll)、共享库(so)等。这些资源在应用程序运行时可以通过AssetManager进行访问。
2.2 res
res
目录下存放的是编译后的资源文件,包括布局文件(layout)、程序图标(drawable)等。与assets
不同,res
目录下的资源在编译时会被处理,并在运行时通过资源ID进行访问。
2.3 lib
lib
目录包含了应用程序在不同平台下使用的本地库(so文件)。通常会根据不同的CPU架构(如armeabi、armeabi-v7a、arm64-v8a、x86、x86_64等)放置对应的so文件,以确保应用程序在各种设备上都能正常运行。
2.4 META-INF
META-INF
目录包含了APK文件的签名信息,用于验证应用程序的完整性和来源。通常包括MANIFEST.MF、CERT.RSA和CERT.SF文件。
2.5 resources.arsc
resources.arsc
文件包含了编译后的资源索引信息和资源加密信息(如语言包)。它用于快速查找和加载应用程序中的资源。
2.6 AndroidManifest.xml
AndroidManifest.xml
文件是应用程序的清单文件,包含了应用程序的基本信息(如包名、版本号)、权限声明、组件声明(如Activity、Service、Receiver、Provider)以及代码执行入口等。
2.7 classes.dex
classes.dex
文件包含了应用程序的字节码,是经过Dalvik或ART虚拟机编译后的可执行代码。DEX(Dalvik Executable)格式是Android特有的文件格式,用于在虚拟机上执行应用程序的代码。