优化步骤
- 移除了百度地图
SDK,收益大约5M。
碰到的问题就是,使用 UIApplication.share.openURL 的时候,如果里面要带上地址的名称,要 URLEncode 一下。
- 移除了不必要的图片,并批量压缩了一下。
| 文件大小(KB) | 个数 | 总大小(M) |
|---|---|---|
| > 50 | 36 | 8.2 |
| > 30 | 63 | 6.3 |
| > 10 | 153 | 10.6 |
| > 0 | 1232 | 12.9 |
为了减少影响,这里只压缩 50KB 的文件就能取得很高的收益了,最终从 8.2M 压缩到了 3.6M。
对一些使用到了特定大图的业务进行 review,把图片压缩上传到图片服务器,改为在线的模式。大概 5M。
最终 ipa 大小从原来的 162M 减少到了 146M,优化了约 10%。
由于很多业务改为 RN 实现,并且很多 build setting 和 cocoapods 在以前优化的时候已经修改,在深入研究的意义不大。
代码
思路:递归找到所有的 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)