安装包体积优化思考

1,095 阅读2分钟

这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

为什么需要优化包体积

上图是Google透露的安装包体积与下载转化率的关系图(来自Google Play)

显然,包体积越大,转化率越低。包体积的影响有:

  • 下载转化率:

    • 大部分地区的网络状况并不好(不稳定),越大的安装包下载中越容易受到网络影响造成下载失败,降低用户下载意愿。
    • 网络流量费用,造成手机流量用户下载意愿降低
    • 设备空间限制等
    • 以上问题,都会造成包体积越大,下载转化率越低
  • 推广成本:

    • 应用市场等推广应用时,大体积安装包下载时占用的带宽高,也就造成推广费用高。

      • 部分厂商对包体积有限制(如苹果App Store限制超过150MB时,只能使用wifi下载等)
    • 设备预装应用,受限设备预留应用空间限制,会挤压其它应用的空间。

如何分析应用包体积

  • 针对应用的情况,一般需要分析:

    • 资源文件:图片、音频、视频
    • 库:动态库、静态库
    • 源代码:代码、函数
    • 其它:签名、证书、配置

ios 可以参考:github.com/huanxsd/Lin…

包体积分析思路

这里主要以ios作为分析,分析主要以源代码为主

资源文件

  • 减少不必要的资源文件
  • 选择更优压缩率的格式
  • 极端的,可以考虑对图片色域做限制,提高压缩效果

  • 移除不必要的库
  • 尝试设备/系统提供公共库,能共用的可以考虑兼容

    • 版本可能不符合预期,需要适配
  • 重新编译库,关闭库内不需要的功能

    • 如有,可以选择lite版本的库
  • 使用 -Oz 编译
  • 关闭异常功能

    • 异常机制会在代码中增加多个数据去维持,关闭异常可能有10%左右的包体积优化
  • 开启LTO(仅ios)

代码

  • 修改高频调用的inline接口与宏

    • 高频使用的inline接口或宏,在其展开代码量较大时,会造成成百上千倍的包体积增加。
  • 结构体内存对齐:

    • 尽可能使结构体对齐4byte或8byte(考虑到现有64位系统越来越多,只对齐8byte基本满足需求)
  • 使用合理的 enum class 范围:

    • 对大部分 enum class 来说,都不用上 4byte 的范围,可以考虑缩小到 1byte。
  • 使用时间换空间的方式:

    • 比如使用vector替换hashmap等,具体收益不好说,需要拿数据说话
  • 针对系统特性的优化:

    • 比如ios以往会对 text 端加密,这样会降低压缩率。可以考虑重命名解决