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

时间:2014-08-21 11:27:18

标签: android apk

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

Wikipedia说:

  

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

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

这是我的问题:

  • 在解压缩过程中是否有任何数据被擦除重新压缩过程?
  • 如果 没有 ,为什么aapt(Android Studio使用的那个)打包文件 以如此低效的方式?
  • 如果 ,正在删除哪些数据(请在我发布的地方发布一些链接) 可以阅读更多关于它)?怎么可能出错呢 我会用这种方法吗?

谢谢!


修改[2015年5月13日]:

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

  

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

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

3 个答案:

答案 0 :(得分:4)

  

我可以将其上传到Play,安装并运行它而不会出现问题。

仅限您尝试过的设备。例如,我怀疑您没有尝试使用API​​ Level 1设备。

  

在解压缩期间是否有任何数据消失?重新压缩过程?

我们无法回答这个问题。唯一可以回答这个问题的人就是你,因为你就是那个完成你的特定工作的人,解压缩&amp; amp;重新压缩过程&#34;。您应该能够分析两个ZIP文件并查看差异所在,例如某些文件类型的压缩率更高,文件因运行&#34; rezip进程&#34;等而丢失。< / p>

一般来说,唯一应该丢失的东西就是任何邮政编码,如果你没有自己重新申请。

  

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

尺寸不是唯一的考虑因素。访问速度是另一种,因为许多东西(例如,资源,资产)保存在APK文件中并根据需要即时读出。解压缩逻辑的内存消耗是另一个考虑因素。

Android设备,尤其是早期设备,有许多限制,磁盘空间只是其中之一。尽管随着硬件的发展,其中一些约束已经放宽,但构建工具专门用于向后兼容 - 例如,您应该能够编写可以在API Level 1设备上运行的应用程序。这就限制了工具在它们如何随时间变化方面的限制。

  

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

您的应用可能无法在Android设备上运行,因为Android设备的运行时设置会对APK ZIP压缩算法的使用做出某些假设。理想情况下,您的应用程序将无处不在。至少,您希望在您支持的每个API级别上测试您的应用程序 - 较旧的API级别可能更有可能“削减角落”#34;并假设您的方法将失效。

答案 1 :(得分:4)

假设你强迫7zip使用它的zip兼容模式(-tzip),那么这是一个完全有效的操作(尽管@CommonsWare指出,你很可能会打开一些错误的实现一些手机上的拉链解包程序。)

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

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

答案 2 :(得分:0)

  1. 仅在创建 apk 时使用“V1(Jar 签名)”选项对 apk 进行签名。这是在 Android Studio 中生成签名的 apk 时对话框中的一个选项。阅读此处的警告,https://developer.android.com/studio/command-line/zipalign

  2. 将 apk 解压到一个文件夹,例如 app-release。

  3. 转到文件夹 app-release 中的命令提示符。

  4. 然后重新压缩:

    "C:\Program Files\7-Zip\7z.exe" a -tzip -mx9 -r app-release.zip *.*

  5. 然后对齐:

    "C:\Users\Administrator\AppData\Local\Android\Sdk\build-tools\30.0.0\zipalign.exe" -f -v 4 app-release.zip app-release.apk

  6. 然后验证对齐:

    "C:\Users\Administrator\AppData\Local\Android\Sdk\build-tools\30.0.0\zipalign.exe" -c -v 4 app-release.apk