iOS 包体积优化

145 阅读1分钟

优化步骤

  1. 移除了百度地图 SDK,收益大约 5M

碰到的问题就是,使用 UIApplication.share.openURL 的时候,如果里面要带上地址的名称,要 URLEncode 一下。

  1. 移除了不必要的图片,并批量压缩了一下。
文件大小(KB)个数总大小(M)
> 50368.2
> 30636.3
> 1015310.6
> 0123212.9

为了减少影响,这里只压缩 50KB 的文件就能取得很高的收益了,最终从 8.2M 压缩到了 3.6M

对一些使用到了特定大图的业务进行 review,把图片压缩上传到图片服务器,改为在线的模式。大概 5M

最终 ipa 大小从原来的 162M 减少到了 146M,优化了约 10%

由于很多业务改为 RN 实现,并且很多 build settingcocoapods 在以前优化的时候已经修改,在深入研究的意义不大。

代码

思路:递归找到所有的 imageset 里面的 Contents.json,然后判断大小是否要压缩,压缩完成直接替换原图片即可。

const fs = require("fs")
var pngquant = require("node-pngquant-native")

let sumSize = 0
const read = res => {
  if (res.includes("imageset")) {
    const images = JSON.parse(
      fs.readFileSync(`${res}/Contents.json`, "utf-8")
    ).images
    for (const image of images) {
      if (image.filename) {
        const fileStat = fs.statSync(`${res}/${image.filename}`)
        const size = fileStat.size
        if (size > 50000) {
          sumSize += size
          console.log(image.filename, res, size)
          fs.readFile(`${res}/${image.filename}`, function (error, buffer) {
            if (error) throw error
            var resBuffer = pngquant.compress(buffer)
            fs.writeFile(
              `${res}/${image.filename}`,
              resBuffer,
              {
                flags: "wb"
              },
              function (error) {
                console.log(error)
              }
            )
          })
        }
      }
    }
  } else if (fs.statSync(`${res}`).isDirectory()) {
    fs.readdirSync(`${res}`).forEach($0 => read(`${res}/${$0}`))
  }
}

read("Assets.xcassets")
console.log(sumSize / 1024 / 1024)