Android历史版本与APK文件结构

前言

在移动设备日益普及的今天,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.solibart.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特有的文件格式,用于在虚拟机上执行应用程序的代码。

相关推荐
晨曦_子画31 分钟前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
孤客网络科技工作室1 小时前
AJAX 全面教程:从基础到高级
android·ajax·okhttp
Mr Lee_2 小时前
android 配置鼠标右键快捷对apk进行反编译
android
顾北川_野3 小时前
Android CALL关于电话音频和紧急电话设置和获取
android·音视频
&岁月不待人&3 小时前
Kotlin by lazy和lateinit的使用及区别
android·开发语言·kotlin
Winston Wood5 小时前
Android Parcelable和Serializable的区别与联系
android·序列化
清风徐来辽5 小时前
Android 项目模型配置管理
android
帅得不敢出门5 小时前
Gradle命令编译Android Studio工程项目并签名
android·ide·android studio·gradlew
problc6 小时前
Flutter中文字体设置指南:打造个性化的应用体验
android·javascript·flutter
帅得不敢出门16 小时前
安卓设备adb执行AT指令控制电话卡
android·adb·sim卡·at指令·电话卡