Android 软件包套件 (APK) 是用于在 Google Android 操作系统上分发和安装应用程序软件和中间件的标准软件包文件格式。APK 文件是 ZIP 格式的存档,其中包含应用程序的字节码、资源、资产、证书和清单文件。
APK 文件包含几个关键组件: - AndroidManifest.xml:以 XML 格式编写的清单文件,向 Android 构建工具、操作系统和 Google Play 描述有关应用程序的基本信息。这包括应用程序的软件包名称、版本、访问权限、引用的库文件等。 - Classes.dex:以 Android 运行时可以理解的 DEX 文件格式编译的类。这包含应用程序已编译的 Java 字节码。 - 资源:未编译到 resources.arsc 中的资源,包括图像、字符串表、XML 中的用户界面布局等。 - Resources.arsc:包含预编译资源的文件,例如值、可绘制对象、布局和其他元素的 XML 文件。 - 资产:包含应用程序资产的目录,可以通过 AssetManager 检索。 - META-INF 目录:此文件夹包含: - MANIFEST.MF:清单文件 - CERT.RSA:应用程序的证书 - CERT.SF:MANIFEST.MF 文件中相应行的资源和 SHA-1 摘要列表
典型 APK 文件的结构如下所示:
/AndroidManifest.xml /classes.dex /resources.arsc /res/ drawable/ layout/ values/ /assets/ /META-INF/ MANIFEST.MF CERT.RSA CERT.SF
在应用程序安装时,设备会从下载的 APK 文件中提取 classes.dex 文件,为 Dalvik 可执行 (DEX) 文件生成一个可执行文件。然后,Android 运行时 (ART) 使用此 DEX 文件运行应用程序。DEX 文件中的字节码是基于寄存器的,而不是 Java 的 .class 文件中的基于堆栈的字节码。DEX 字节码被设计为比标准 Java 字节码更紧凑、更省内存。
在应用程序开发期间,Android 应用程序模块被编译成中间未签名的 APK,用于调试和测试。构建过程涉及将应用程序资源转换为压缩的二进制形式,将代码转换为 DEX 格式,并使用已编译的资源、代码和 Android 清单文件构建最终 APK。为了发布,APK 必须使用密钥库进行签名,该密钥库用于建立应用程序的所有权并允许分发应用程序更新。
Google 提供了 Android 资产打包工具 (aapt) 来查看、创建和更新与 Zip 兼容的存档(zip、jar、apk)。它还可以将资源编译成二进制资产。开发人员可以使用“aapt dump”命令获取有关 APK 内容的信息,而无需提取文件。“aapt dump badging”打印应用程序包名称、版本和包含的活动,而“aapt dump permissions”显示声明的权限。
了解 APK 格式对于 Android 开发人员正确打包其应用程序以进行分发非常重要。它还可用于检查现有应用程序的内容和行为。安全研究人员经常分析 APK 文件以识别 Android 应用程序中潜在的安全漏洞或隐私问题。
总之,Android 软件包套件 (APK) 是 Android 应用程序的标准软件包格式,包含编译的字节码、资源、资产和元数据,这些内容存储在具有特定结构的基于 ZIP 的存档中。熟悉 APK 格式和工具对于 Android 开发至关重要,它允许开发人员构建、测试和发布他们的应用程序,以便通过 Google Play 等应用程序市场进行分发。
文件压缩通过减少冗余,让相同的信息占用更少的比特。可压缩的上限受信息论约束:对于无损压缩,上界是信源熵(参见香农的信源编码定理及其 1948 年的原始论文《通信的数学理论》)。对于有损压缩,码率与感知质量之间的权衡由率失真理论描述。
大多数压缩器分两步。首先,模型预测或揭示数据中的结构。然后,编码器把这些预测变成近乎最优的比特模式。一个经典的建模家族是 Lempel–Ziv:LZ77 (1977)和 LZ78 (1978) 会检测重复子串并输出引用而不是原始字节。在编码端,霍夫曼编码(见原始论文1952)会为更常见的符号分配更短的代码。算术编码和范围编码能更贴近熵极限,而现代的非对称数值系统(ANS)用查表实现获得相似的压缩率。
DEFLATE(被 gzip、zlib 与 ZIP 采用)结合了 LZ77 和霍夫曼编码。其规范完全公开:DEFLATERFC 1951、zlib 封装RFC 1950以及 gzip 文件格式RFC 1952。Gzip 面向流式传输并明确不提供随机访问。PNG 图像标准化将 DEFLATE 作为唯一的压缩方法(窗口最多 32 KiB),可见 PNG 规范“Compression method 0… deflate/inflate… at most 32768 bytes”和W3C/ISO PNG 第二版。
Zstandard (zstd): 面向高压缩率与快速解压的通用压缩器。格式记录在RFC 8878(还有HTML 镜像)以及 GitHub 上的参考规范文档。与 gzip 类似,基本帧不追求随机访问。zstd 的拿手好戏是字典:从语料中抽取的小样本能显著改善大量小文件或相似文件的压缩(参见python-zstandard 字典文档与Nigel Tao 的示例)。各实现同时支持“无结构”和“有结构”字典(讨论)。
Brotli: 为网页内容(例如 WOFF2 字体、HTTP)优化,混合静态字典与类似 DEFLATE 的 LZ+熵编码核心。规范见RFC 7932,其中也指出滑动窗口大小为 2WBITS-16,WBITS 取值 [10, 24](1 KiB-16 B 到 16 MiB-16 B),并且不尝试随机访问。Brotli 常在网页文本上优于 gzip,同时保持快速解码。
ZIP 容器: ZIP 是一种文件归档格式,可存储使用多种压缩算法(deflate、store、zstd 等)的条目。事实标准是 PKWARE 的 APPNOTE(参见APPNOTE 门户、托管副本以及美国国会图书馆的概览ZIP File Format (PKWARE)/ZIP 6.3.3)。
文件压缩是一种减小文件或文件集大小的过程,通常用于节省存储空间或加速网络传输。
文件压缩通过识别和删除数据中的冗余来工作。它使用算法在更小的空间中编码原始数据。
文件压缩的两种主要类型是无损压缩和有损压缩。无损压缩允许完美恢复原始文件,而有损压缩则以损失部分数据质量为代价,实现更大的大小减小。
文件压缩工具的一个流行例子是WinZip,它支持包括ZIP和RAR在内的多种压缩格式。
对于无损压缩,质量保持不变。然而,对于有损压缩,由于它消除了较不重要的数据以更大程度地减小文件大小,因此可能会有明显的质量下降。
是的,就数据完整性而言,文件压缩是安全的,尤其是无损压缩。然而,像任何文件一样,压缩的文件可能会被恶意软件或病毒攻击,因此总是必要的有安装可靠的安全软件。
几乎所有类型的文件都可以被压缩,包括文本文件、图像、音频、视频和软件文件。然而,可达到的压缩水平可以在文件类型之间大大变化。
ZIP文件是一种使用无损压缩来减小一个或多个文件大小的文件格式。ZIP文件中的多个文件有效地被捆绑在一起成为一个单一的文件,这也使得分享变得更容易。
技术上,是的,尽管额外的减小大小可能是微不足道的甚至适得其反。压缩一个已经压缩的文件有时可能会增加它的大小,由于压缩算法添加的元数据。
要解压文件,你通常需要一个解压或解压缩工具,如WinZip或7-Zip。这些工具可以从压缩格式提取原始文件。