通过重新压缩其内容来缩小APK大小

Ale*_*pov 9 android apk

我有一个非常大的apk文件,我正在尝试减小它的大小.已经使用了所有常用技术,例如Proguard和图像压缩.仍然,apk非常大 - 约25mb.

维基百科说:

APK文件是一种存档文件,特别是基于JAR文件格式的zip格式包,.apk作为文件扩展名.

我最近注意到,如果我将解压缩apk(Android Studio的神器输出),使用7-Zip重新压缩它并对其进行签名,然后大小神奇地减少2.5mb(至~22.5mb).我可以将其上传到播放,安装和运行它没有问题.

这是我的问题:

  • 在解压缩和重新压缩过程中是否有任何数据被擦除?
  • 如果不是,为什么aapt(Android Studio使用的那个)以如此低效的方式打包文件?
  • 如果是的话,正在擦除哪些数据(请发布一些我可以阅读更多相关信息的链接)?如果我使用这种方法会出现什么问题?

谢谢!


编辑[5/13/2015]:

压缩APK内容对我来说效果很好.但是,我必须对原始资源(通常置于res/raw下)保持谨慎.例如,使用压缩资源作为参数调用Resources#openRawResourceFd将以以下异常结束:

java.io.FileNotFoundException:此文件无法作为文件描述符打开; 它可能是压缩的

因此,请记住从压缩中排除原始资源.

zma*_*ies 5

假设您强制 7zip 使用其 zip 兼容模式 ( -tzip),那么这是一个完全有效的操作(尽管正如@CommonsWare 指出的那样,您极有可能在某些手机上接受 zip 解包例程的一些错误实现)。

能够减小尺寸的原因有两个:

  • 7zip 有一个更好的压缩器,它在压缩时使用更多的 CPU 来提供完全兼容但压缩程度更高的表示形式
  • aapt 传统上用于对 Android 文件进行压缩/打包,它具有一长串文件类型(例如 jpg、png、mp3),但它根本不会尝试压缩,因为这些文件类型已经具有内部压缩。即便如此,通过将它们压缩到 apk 文件中通常可以获得几个百分点的收益


Com*_*are 4

我可以将其上传到 Play、安装并运行,没有任何问题。

仅在您尝试过的设备上。例如,我怀疑您没有尝试 API 级别 1 设备。

解压缩和重新压缩过程中是否有任何数据被擦除?

我们没有办法回答这个问题。唯一可以回答该问题的人是您,因为您是执行特定“解压缩和重新压缩过程”的人。您应该能够分析两个 ZIP 文件并查看差异所在,例如某些文件类型的压缩率较高、因运行“重新压缩过程”而丢失的文件等。

一般来说,如果您自己没有重新应用的话,唯一应该丢失的就是任何 zipalign-ing。

如果不是,为什么 aapt(Android Studio 使用的那个)以如此低效的方式打包文件?

尺寸并不是唯一的考虑因素。访问速度是另一回事,因为许多内容(例如资源、资产)都保存在 APK 文件中,并根据需要动态读取。解压缩逻辑的内存消耗是另一个考虑因素。

Android 设备,尤其是早期的设备,有很多限制,磁盘空间只是其中之一。尽管随着硬件的进步,其中一些限制已经放宽,但构建工具致力于向后兼容——例如,您今天应该能够编写一个可以在 API 级别 1 设备上运行的应用程序。这对工具如何随时间变化产生了限制。

如果我使用这种方法会出现什么问题?

您的应用程序可能无法在 Android 设备上运行,因为它们的运行时是在对 APK ZIP 压缩算法使用进行某些假设的情况下设置的。理想情况下,您的应用程序将在任何地方正常运行。至少,您需要在您支持的每个 API 级别上测试您的应用程序 - 较旧的 API 级别可能更有可能“走捷径”并假设您的方法将无效。