594 字
2 分钟
📦 安卓 APK 打包超过 4GB 或超过 65535 个文件无法打包的坑
把一个体量庞大的 H5 游戏(7G 资源、25 万个文件)打成安卓 APK 时,撞上了两条很多人没听过、却绕不过去的硬限制——根本打不出包。记录一下这个坑。
现象
打包时直接报错,两种死法:
Zip32 cannot place CD entry ... (MAX=4294967295)Too many zip entries 250000 (MAX=65535)坑:APK 是 ZIP32,有两条硬死线
APK 本质就是一个 ZIP 包(ZIP32 格式),有两条硬上限,而且必须同时满足,缺一条都打不出来:
| 限制 | 上限 | 原因 |
|---|---|---|
| 总大小 | ≤ 4 GB | ZIP32 用 32 位记录中央目录偏移,最大 2^32-1 |
| 文件条目数 | ≤ 65535 | 中央目录里”总条目数”字段只有 16 位,2^16-1 |
体积好理解;真正阴的是文件数——现代游戏的散图集、地图切片动辄十几万个小文件,往往体积还没到 4G,先撞的就是 65535 这条。

为什么硬扛不行
撞线后第一反应是绕过去,但常见的几条路都堵死:
- ZIP64:能破两条限制,但 apksigner v2/v3 签名、安卓安装器、国产 ROM 都不认 ZIP64 的 APK,签不了、装不上。
- AAB + Play Asset Delivery:官方大资源方案,但强绑 Google Play,不上架用不了。
- 热更新插件:是为几十 MB 的 web bundle 设计的,扛不动几个 G 的游戏资源。
解决方向
既然塞不进包,唯一可行的就是大头资源不进 APK,靠热更新/开局下载:把占大头的资源目录从首包移出去走 CDN,APP 启动时下载到本地,之后纯本地读。首包瘦身到 1.4 万文件 / 0.6G——两条死线同时过关。

注意:两条线得一起看。只把体积最大的目录移出去,体积是降了,但剩下的小文件目录可能仍然超 65535,照样打不出来。
结论
APK = ZIP32,4GB 和 65535 文件两条硬线必须同时满足,撞线时常常是文件数先爆。ZIP64 / AAB / 热更插件在”大体量游戏 + 国内分发”下都不可行,只能走大资源不进包、热更新下载到本地这条路。
部分信息可能已经过时