APK Downloader
返回博客列表
APK 结构APK 解析AndroidManifestclasses.dex安卓教程

APK 文件结构解析:一个 APK 里到底装了什么?

·8 分钟阅读

你天天装 APK,但有没有拆开看过它里面是什么?APK 本质就是一个 ZIP 压缩包,只是改了后缀。把它解压开,你能看到代码、资源、签名、清单文件——看懂结构,排查“装不上”“闪退”“被报毒”就有了底气。这篇带你从外到内拆一遍。

核心观点:APK = ZIP 容器 + 目录约定。搞清楚 AndroidManifest.xml、classes.dex、lib/、res/、META-INF/ 这几块各管什么,你就能判断一个包是不是完整、是不是原版、跑不跑得起来。

一、先记住:APK 就是 ZIP

把 app.apk 改名成 app.zip 就能用解压工具打开。也可以用命令行:

unzip -l app.apk        # 列出内部文件
unzip app.apk -d out/   # 解压到 out 目录

二、核心文件逐个拆

1. AndroidManifest.xml(清单文件)

应用的“身份证”,声明了:

  • 包名(package)、版本号(versionCode / versionName)
  • minSdkVersion / targetSdkVersion(最低和目标的安卓版本)
  • 申请的权限(uses-permission)——这就是为什么安装时会弹权限请求
  • 四大组件:Activity、Service、BroadcastReceiver、ContentProvider

注意:APK 里的 AndroidManifest.xml 是编译过的二进制格式,直接打开是乱码,要用 APK Analyzer、aapt2 或 MT 管理器才能读。

# 用 aapt2 查看清单信息(需安装 Android SDK build-tools)
aapt2 dump badging app.apk

2. classes.dex(代码)

Java/Kotlin 代码编译后打包成的 DEX 文件。一个 APK 可以有多个 classes.dex、classes2.dex……

  • DEX 是安卓虚拟机(Dalvik/ART)执行的格式。
  • 想反编译看代码,用 jadx 或 dex2jar + JD-GUI。
jadx -d out_src app.apk   # 反编译出近似 Java 源码

3. lib/(原生库)

存放 C/C++ 编译出的 .so 文件,按 CPU 架构分目录:

  • lib/arm64-v8a/—— 64 位 ARM,现代手机主流
  • lib/armeabi-v7a/—— 32 位 ARM,老设备
  • lib/x86_64/—— 模拟器 / 部分平板

没有对应你设备架构的目录,应用就跑不起来——这是“装上了但闪退”的常见原因。

4. res/ 与 assets/

  • res/:编译后的资源,图片、布局、字符串等(很多也被编译成二进制)。
  • assets/:原样打包的原始资源,游戏素材、字体、配置文件常放这里。

5. META-INF/(签名信息)

存放签名文件:MANIFEST.MF、CERT.SF、CERT.RSA(或 .DSA / .EC)。

  • 安卓靠这里的签名校验应用是否被篡改、来源是否一致。
  • 用 keytool 或 apksigner 可以查看签名指纹:
apksigner verify --print-certs app.apk

签名不一致 → 覆盖安装失败;签名对不上官方 → 可能是二次打包。

三、还有几个你会遇到的东西

  • resources.arsc:字符串、样式的索引表,配合 res/ 使用。
  • split APK:App Bundle 拆出来的多个包,除 base.apk 外还有 config.arm64_v8a.apk 等,要一起装。
  • OBB 文件:大游戏的额外数据,不在 APK 内,需单独放到 Android/obb/。

四、结构看懂了能干嘛?

  1. 判断包是否完整:缺 classes.dex 或缺对应 lib/目录 → 装了也白装。
  2. 判断是否原版:比对签名指纹,跟官方对不上就是被改过。
  3. 排查兼容问题:看 minSdkVersion 和 lib/ 架构,就知道为什么装不上/闪退。
  4. 做安全初筛:清单里申请了一堆不相干权限(短信、通讯录、定位),就要警惕。

五、动手小结

记住这个结构图就够用了:

app.apk
├── AndroidManifest.xml   # 身份 + 权限 + 版本
├── classes.dex           # 代码
├── lib/<架构>/           # 原生库,决定能不能跑
├── res/ + assets/        # 资源
├── resources.arsc        # 资源索引
└── META-INF/             # 签名,决定能不能信

常见问题

APK 就是一个 ZIP 文件吗?
基本上是的。APK 是改了后缀、遵循固定目录约定的 ZIP 压缩包。把它改名成 .zip,就能用任意解压工具打开,查看清单、代码、库、资源和签名。

在安卓手机上怎么看 APK 内部?
用 MT 管理器,可以在手机上浏览 ZIP 内容、读取(二进制)清单、直接查看签名。在电脑上则用 Android Studio 的 APK Analyzer、jadx 或 apksigner。

为什么 AndroidManifest.xml 打开是乱码?
因为它在 APK 里被编译成了安卓的二进制 XML 格式。要用 aapt2、APK Analyzer 或 MT 管理器,它们会把二进制清单解码成可读的 XML。用普通文本编辑器打开就只会看到乱码。

lib/ 目录说明了什么?
它存放按 CPU 架构分组的原生 C/C++ 库(arm64-v8a、armeabi-v7a、x86_64 等)。如果没有匹配你设备 ABI 的文件夹,应用就跑不起来——这是启动即闪退的常见原因。

怎么判断 APK 是不是原版、有没有被二次打包?
用 apksigner verify --print-certs 或 keytool 查看签名指纹,与官方包对比。指纹不同就说明被重新签名(二次打包)了。用 gptoapk.com 从 Play 链接拉一份原包,可作为对照基准。

一句话总结:看懂 APK = 看懂 ZIP 里的目录约定。下次遇到“装不上、闪退、被报毒”,先解压看一眼这几块,问题往往自己就浮出来了。工具推荐起步用 MT 管理器(手机端)或 jadx + apksigner(电脑端)。想拿到干净的原包来分析,可用 gptoapk.com。