Android包体膨胀主因是贴图未平台适配压缩,应为Android设ETC2或ASTC、iOS设ASTC,禁用PVRTC;删Resources改Addressables;用ShaderVariantCollection精简变体;IL2CPP发布需勾选Strip Engine Code并设Medium/High剥离等级。

Unity 项目里 Texture 压缩格式选错,包体直接多出 30MB
Android 包体膨胀最常见源头是贴图没走平台适配压缩。默认 TextureImporter 设为 RGBA32 或 Default,在 Android 上会强制转成未压缩的 RGBA32,哪怕你导出的是 PNG。
- Android 首选
ETC2(OpenGL ES 3.0+)或ASTC(推荐,支持质量分级,ASTC_4x4和ASTC_6x6平衡较好) - iOS 必用
ASTC,别碰PVRTC—— 它对非 2 的幂尺寸贴图会自动 padding,反而增大体积 - UI 贴图(带透明通道)慎用 ETC2:它不原生支持 Alpha,Unity 会拆成两个通道存,体积翻倍;改用
ASTC_6x6+Truecolor模式更稳 - 在
Inspector → Texture Type = Default时,务必点开Override for Android/iOS单独设压缩格式,别只信Default Texture Format全局设置
Resources 文件夹还在用?删掉它,改用 Addressables
Resources.Load() 看似方便,但所有放在 Resources 文件夹里的资源,无论是否被引用,都会打进安装包 —— Unity 不做静态分析,只认路径。
- 哪怕你只
Resources.Load("dummy")一次,整个Resources/目录下所有子文件夹内容全进包 - Addressables 支持按需加载 + 自动依赖分析,构建时只打包实际引用的 Asset,且可配置远程分包(
Build Player Options → Build Addressables) - 迁移注意:旧代码里
Resources.Load("ui/prefab1")要改成Addressables.LoadAssetAsync,别漏掉("prefab1") .asset后缀或 GUID 映射 - 别把 Addressables Catalog 打包进主包:在
AddressableAssetSettings → Build Path设为独立目录(如StreamingAssets/aa),再通过热更下发
Shader 变体爆炸导致 IL2CPP 包体激增
一个带 5 个 keyword 的 shader,若全部开启,编译变体数是 2⁵ = 32 个;如果项目里有 20 个同类 UI shader,光 ShaderLab 代码体积就超 2MB,IL2CPP 还会为每个变体生成对应 C++ 代码。
- 用
ShaderVariantCollection显式声明运行时真正需要的变体,构建前在Window → Graphics → Shader Variant Collection里 Add Used Shaders,再点击Collect All - 禁用无用 Built-in Shader:在
Project Settings → Graphics → Always Included Shaders里清空,只留项目真正在用的(比如删掉Hidden/Nature/Terrain/Details/BillboardWaving) - 自定义 shader 里少用
#pragma multi_compile,改用#pragma shader_feature—— 后者在未启用 keyword 时不生成变体 - 检查
Build Report(构建后日志末尾)里的Shader variants: X total, Y stripped,Y 太小说明 stripping 没生效,回头查Graphics → Strip Engine Code是否勾选
Android APK 里 libmain.so 过大?关掉 IL2CPP 调试符号
Debug 模式下 IL2CPP 默认保留完整调试信息,libmain.so 体积常比 Release 大 40%–60%,尤其在含大量泛型、反射逻辑的项目中。
- 在
Player Settings → Publishing Settings → Strip Engine Code勾选(必须勾) - 关键一步:
Scripting Backend = IL2CPP时,Managed Stripping Level = Medium或High(Low几乎不减体积) - 绝对不要在发布构建中保留
Development Build和Script Debugging—— 这俩开关一开,libmain.so就自动嵌入 DWARF 符号表 - 验证方法:解压 APK,用
file libmain.so看是否含with debug_info;再用arm-linux-androideabi-readelf -S libmain.so | grep debug查 debug_* 段是否存在
压缩不是堆参数,是逐项确认资源生命周期、构建链路和平台特性。最容易被跳过的其实是贴图导入设置里的「Override for」和 Addressables 的 Catalog 输出路径 —— 这俩地方不动,其他全优化也白搭。











