我有一个非常大的apk文件,我正在尝试减小它的大小.已经使用了所有常用技术,例如Proguard和图像压缩.仍然,apk非常大 - 约25mb.
维基百科说:
APK文件是一种存档文件,特别是基于JAR文件格式的zip格式包,.apk作为文件扩展名.
我最近注意到,如果我将解压缩apk(Android Studio的神器输出),使用7-Zip重新压缩它并对其进行签名,然后大小神奇地减少2.5mb(至~22.5mb).我可以将其上传到播放,安装和运行它没有问题.
这是我的问题:
谢谢!
编辑[5/13/2015]:
压缩APK内容对我来说效果很好.但是,我必须对原始资源(通常置于res/raw下)保持谨慎.例如,使用压缩资源作为参数调用Resources#openRawResourceFd将以以下异常结束:
java.io.FileNotFoundException:此文件无法作为文件描述符打开; 它可能是压缩的
因此,请记住从压缩中排除原始资源.
假设您强制 7zip 使用其 zip 兼容模式 ( -tzip),那么这是一个完全有效的操作(尽管正如@CommonsWare 指出的那样,您极有可能在某些手机上接受 zip 解包例程的一些错误实现)。
能够减小尺寸的原因有两个:
我可以将其上传到 Play、安装并运行,没有任何问题。
仅在您尝试过的设备上。例如,我怀疑您没有尝试 API 级别 1 设备。
解压缩和重新压缩过程中是否有任何数据被擦除?
我们没有办法回答这个问题。唯一可以回答该问题的人是您,因为您是执行特定“解压缩和重新压缩过程”的人。您应该能够分析两个 ZIP 文件并查看差异所在,例如某些文件类型的压缩率较高、因运行“重新压缩过程”而丢失的文件等。
一般来说,如果您自己没有重新应用的话,唯一应该丢失的就是任何 zipalign-ing。
如果不是,为什么 aapt(Android Studio 使用的那个)以如此低效的方式打包文件?
尺寸并不是唯一的考虑因素。访问速度是另一回事,因为许多内容(例如资源、资产)都保存在 APK 文件中,并根据需要动态读取。解压缩逻辑的内存消耗是另一个考虑因素。
Android 设备,尤其是早期的设备,有很多限制,磁盘空间只是其中之一。尽管随着硬件的进步,其中一些限制已经放宽,但构建工具致力于向后兼容——例如,您今天应该能够编写一个可以在 API 级别 1 设备上运行的应用程序。这对工具如何随时间变化产生了限制。
如果我使用这种方法会出现什么问题?
您的应用程序可能无法在 Android 设备上运行,因为它们的运行时是在对 APK ZIP 压缩算法使用进行某些假设的情况下设置的。理想情况下,您的应用程序将在任何地方正常运行。至少,您需要在您支持的每个 API 级别上测试您的应用程序 - 较旧的 API 级别可能更有可能“走捷径”并假设您的方法将无效。
| 归档时间: |
|
| 查看次数: |
2762 次 |
| 最近记录: |