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特有的文件格式,用于在虚拟机上执行应用程序的代码。

相关推荐
阿巴斯甜9 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker10 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq952711 小时前
Andorid Google 登录接入文档
android
黄林晴12 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_1 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android