Skip to content
Back to Blog
informational

什么是 APK 文件?安卓应用包全解析

2026-05-17 8 min read

简单来说:APK 就是安卓的应用容器

APK 文件,全称 Android Package Kit,是安卓系统用来分发和安装应用的格式。你可以把它看作是安卓版的 Windows .exe 或 macOS .dmg 文件,它把一个应用所需的一切都打包进一个压缩文件里。文件内部包含了编译后的代码、资源、资产、证书以及一个清单文件,这个清单文件会告诉操作系统该应用被允许做什么。 这个格式本质上就是一个特殊的 ZIP 文件。不开玩笑。你把任何 .apk 文件的后缀名改成 .zip,就能用 7-Zip 这类标准的压缩工具打开它。打开后,你会看到一个标准的布局:AndroidManifest.xml 相当于应用的“身份证”,classes.dex 存放着编译好的代码,res/ 文件夹包含了布局和图片,而 META-INF/ 目录则存储着证明软件包真实性的加密签名。 你从 Google Play 商店下载的每一个应用,都是以 APK 的形式下发的。你只是没看到文件本身,因为 Play 商店在后台帮你管理了下载和安装的全过程。但当你从其他地方获取应用时——这个过程叫做“侧载”——你就得亲手处理 APK 文件了。侧载是安卓系统完全合法且支持的一项功能,但它确实需要你手动开启一个开关:在安卓 8+ 系统上,路径是“设置 > 应用 > 特殊应用权限 > 安装未知应用”;在安卓 7 及更早版本上,则是“设置 > 安全”里的“未知来源”开关。

APK 文件里到底有什么?

让我们打开一个真实的 APK,看看安卓应用是如何构建的。举个例子,一个普通的天气应用,大小可能在 18-25 MB 之间,里面包含了数百个独立文件,都组织在特定的目录中。 首先是 AndroidManifest.xml。在 APK 内部,它并不是开发者编写的那种人类可读的文本文件,而是一个压缩过的二进制 XML (AXML)。这个文件是应用的灵魂。它声明了包名(比如 com.example.weatherapp)、最低和目标安卓 SDK 版本、应用使用的每一个屏幕(Activity)和后台任务(Service),以及它需要的所有权限,从 INTERNET(网络访问)到 ACCESS_FINE_LOCATION(精确定位)。 接下来是 classes.dex。这个文件——对于大型应用,有时还会有 classes2.dex 或 classes3.dex——包含了编译后的应用逻辑。DEX 代表 Dalvik Executable(Dalvik 可执行文件)。尽管现代设备已经使用 Android Runtime (ART) 而不是旧的 Dalvik 虚拟机,但这个名字还是沿用至今。 res/ 目录存放着所有非代码的资产。里面塞满了 XML 布局文件、字符串翻译、颜色值和动画。任何开发过安卓应用的人都对这个文件夹再熟悉不过了;它还存放着按多种屏幕密度分类的 drawable 图片(mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi)。一个按钮图标可能会有五种不同分辨率的版本,这样安卓系统就能为任何屏幕挑选出最合适的一个。还有一个配套文件 resources.arsc,它是一个编译好的表格,将资源 ID 映射到这些文件,让代码能在运行时找到 R.drawable.ic_launcher 这样的资源。 lib/ 目录存放着原生编译库(.so 文件),并按 CPU 架构分类:armeabi-v7a、arm64-v8a、x86 和 x86_64。虽然不是每个应用都需要它们,但在游戏和其他对性能要求高的应用中,你几乎总能看到它们的身影。

APK vs. AAB:谷歌为什么改变了分发格式?

2021 年 8 月,谷歌改变了游戏规则,要求新的 Play 商店应用必须以 Android App Bundles (.aab) 的形式提交,而不是 APK。如果你想手动安装一个应用,却发现从 GitHub 下载的 .aab 文件怎么也装不上,那么理解这个区别就至关重要了。 你需要明白的最重要的一点是:AAB 是一种*发布*格式,而不是*安装*格式。开发者将所有东西——适配所有屏幕密度、CPU 架构和语言的代码与资源——都打包进 AAB 文件。当这个 AAB 文件上传到 Google Play 后,谷歌的服务器会以它为蓝图,专门为你的设备构建并提供一个高度优化的 APK(或一组拆分的 APK)。如果你用的是一部法语版的 Pixel 7,你收到的 APK 将只包含 arm64-v8a 架构的库、xxhdpi 的资源和法语字符串。这使得下载体积比“一刀切”的通用 APK 小 15-40%。 这正是你不能直接下载一个 AAB 文件来安装的原因。你的手机不知道如何解析这个包并提取它需要的部分。在像 GitHub 这样的网站上,你要么会找到一个通用的 APK(一个更大的、哪儿都能用的文件),要么会找到一系列拆分的 APK,后者需要像 SAI (Split APKs Installer) 这样的专门工具才能拼装起来。 说到侧载,传统的 APK 仍然是王道。它才是你实际会操作的格式。像 APKMirror 这样提供 APK 手动安装的信誉良好的网站,提供的都是这种通用的 APK 版本,因为它们可由最终用户直接安装,无需额外步骤。

如何在电脑上打开、检查和转换 APK 文件

出于各种正当理由,你可能需要在桌面上处理 APK 文件。也许你想提取应用的全分辨率图标,或者在安装前检查它的权限,又或者想拿出翻译字符串,甚至将其中的一些内置资产转换成更通用的格式。 如果只是为了简单地抓取资产,把 APK 的后缀名改成 .zip 就已经足够应付大多数情况了。但要进行真正的检查,特别是要读取那些二进制 XML 文件,你就需要一个专业的工具。我一直推荐 apktool。它能将二进制的清单文件和资源文件解码回人类可读的文本。在终端运行 `apktool d myapp.apk` 会把所有东西解包到一个文件夹里,让你能轻松地查看应用请求的每一个权限,或者了解它是为哪个安卓 API 级别构建的。 当你的目标是专门提取和转换图片资产时,像 CocoConvert 这样的工具能提供更快捷的工作流。你无需手动解压并在一层层的 `res/` 文件夹里翻找,可以直接上传 APK。CocoConvert 可以让你直接提取 PNG 图标、启动屏和 UI 图形,然后按你期望的分辨率将它们转换为 SVG、WebP 或 JPEG 等格式。对于这项特定任务来说,它能节省大量时间。 不过,我们得把话说清楚。CocoConvert 是为文件格式转换而生的,不是用来做深度代码分析的。如果你的目标是把 Dalvik 字节码逆向工程回 Java 源码,那你需要像 jadx 或经典的 dex2jar/JD-GUI 组合这样的专用反编译器。那些是强大的开发者工具。同样,CocoConvert 也不会重新打包或重签一个修改过的 APK;那是一个复杂的过程,需要安卓 SDK 构建工具和你自己的签名密钥。

APK 文件的安全风险(以及如何评估)

能够自由侧载 APK 是安卓系统相比 iOS 的一个实实在在的优势。但这种自由也伴随着真实的安全风险,我们必须直面这些问题,而不是含糊其辞地警告几句。 恶意 APK 不是什么都市传说,而是一个有据可查的问题。诈骗者可以拿一个热门应用,注入间谍软件、银行木马或广告软件,然后重新打包成一个假的更新或破解版游戏。ESET 的移动威胁报告一直显示,大多数安卓恶意软件都来自第三方 APK 源,而非官方的 Play 商店。 所以,在从非官方来源安装任何 APK 之前,你必须做好功课。首先,验证加密签名。每一个合法的 APK 都由其开发者签名。你可以使用安卓 SDK 构建工具中的 `apksigner verify --print-certs myapp.apk` 命令来检查。如果证书信息与开发者公开的密钥不符,这就是一个巨大的危险信号。其次,检查清单文件中的权限。一个简单的手电筒应用不应该请求读取你的短信(READ_SMS)或录制音频(RECORD_AUDIO)。最后,一定要将包名和版本号与开发者官网上列出的信息进行核对。 如果你只是在桌面上从 APK 中提取资产,风险会低一些,因为你没有执行应用的代码。即便如此,先把文件上传到 VirusTotal 扫描一下也是个好习惯。它会在不到一分钟的时间里用 70 多种杀毒引擎扫描文件。虽然 0/72 的扫描结果不代表 100% 安全,但 15/72 的结果绝对是一个明确的信号:立即删除这个文件。

常见的 APK 操作及适用的工具

人们出于各种原因需要处理 APK 文件,而为不同的任务选择合适的工具可以节省你大量的时间。这里有一份快速指南,教你如何为任务匹配工具。 如果你想安装一个旧版应用,最好的办法是从像 APKMirror 这样值得信赖的来源下载。该网站会验证 APK 签名与 Play 商店的原始签名是否匹配。为你的文件管理器启用“安装未知应用”权限,点击下载的 APK,检查权限,然后确认安装。 要提取应用图标或图片资产,最简单的方法是使用文件转换工具。将 APK 上传到 CocoConvert,你可以在其中浏览 `res/drawable` 或 `res/mipmap` 目录的内容,抓取你需要的 PNG 图片,并将它们转换为你的目标格式。这对于制作模型的设计师或复查资产的开发者来说非常完美。 如果你想在不安装的情况下阅读清单文件或检查权限,请使用 apktool。它免费、开源且跨平台。`apktool d -s myapp.apk` 这个命令是一个很棒的快捷方式,它只解码资源文件而不处理源代码,所以如果你只需要看清单文件,速度会快得多。 要将应用反编译成 Java 源代码,请使用 jadx。它是现代的标准工具,处理新的 DEX 格式比 dex2jar 等旧工具要好得多。它的图形界面(`jadx-gui`)也非常适合浏览代码。不过要提醒你:如果应用使用了代码混淆(比如 ProGuard 或 R8),你看到的将会是像 a.b.c.d 这样毫无意义的类名,解读起来会是一场噩梦。 要修改并重新打包 APK,你需要先用 `apktool` 解码,进行修改,再用 `apktool` 重建,然后使用安卓 SDK 中的 `zipalign` 和 `apksigner` 来准备和重签软件包。这是一个复杂的工作流程,没有任何在线转换器(包括 CocoConvert)能帮你处理。

什么时候你才真正需要转换 APK 文件?

“APK 转换”这个词可以指代完全不同的事情,所以我们必须搞清楚哪些是真正可行的,哪些纯属痴人说梦。 最常见也最有用的转换类型是资产提取。例如,一个设计师可能需要从 APK 中抓取启动器图标,并将其从 PNG 转换为 SVG 用于演示。或者一个 QA 工程师可能需要从内部 XML 文件中提取所有字符串资源,并将它们转换为 CSV 文件用于翻译审查。这是一种直接的文件格式转换,也正是像 CocoConvert 这类工具的设计初衷。 另一个实际的用例是将应用现有的图片资产转换为更高效的格式,比如 WebP。自 API 级别 17(安卓 4.2)以来,谷歌就一直在安卓上推广 WebP,因为它能在保证同等质量的情况下,比 PNG 文件小 25-34%。提取旧应用的 PNG 图片并批量转换为 WebP 是一种明智的优化手段。 现在来说说你*做不到*的事情。你无法将一个安卓 APK 转换成一个 iOS IPA 文件。这是不可能的。这两个平台的根本就不同,从编译代码、UI 框架到安全模型和运行时环境,无一相同。APK 包含的是在安卓上运行的 Dalvik 字节码,这些代码在 iOS 上根本无法执行。任何声称提供一键式 APK 到 IPA 转换服务的,都是在兜售骗人的把戏。他们充其量是在描述一个从零开始重写应用的过程,那根本不叫“转换”。 同样,将 APK 转换为 Windows EXE 文件也是不现实的。像 BlueStacks 或 Windows Subsystem for Android 这样的安卓模拟器,是通过创建一个完整的安卓环境来在 Windows 上*运行* APK。它们并没有神奇地将应用代码转变为原生的 Windows 可执行文件。当你看到某些工具夸下海口时,理解这种区别至关重要。

什么是 APK 文件?安卓应用包全解析 | CocoConvert Blog