写点什么

我们如何将 Pinterest 的 iOS 应用大小减少 30% 以上

  • 2021-05-12
  • 本文字数:1271 字

    阅读完需:约 4 分钟

我们如何将 Pinterest 的 iOS 应用大小减少 30% 以上

众所周知,应用程序的大小(下载大小 [1] [2])是非常重要的,并且在应用程序的大小和客户参与度之间存在关联。通常,人们会根据大小来决定是否使用软件,甚至以兆字节来支付带宽。更不用说,随着应用程序大小的增加,卸载率也会上升,这会导致用户试图释放设备上的磁盘空间。

 

近来,我们对 Pinterest 的 iOS 版 v9.1 进行了改进,使其体积大大减少:


表 1:iPhone 11 Pro 是我们的目标机型。

 

结果,自从发布以来,我们发现新版本(用户从 App Store 下载)的应用程序安装量有所增加。

问题是什么?

 

关于 Pinterest 的背景,我们使用 Bazel 进行 iOS 版本构建。加入你不熟悉 Bazel,这篇文章值得一读。

 

要创建本地化文件,我们有一个 CI 作业,它在应用程序(通过 Bazel 查询)中自动扫描所有源代码,并将其发送给 Mojito 进行翻译。这在我们添加一些扩展之前一直运行良好。

 

每个扩展都是具有自己 BUILD 文件的模块。在 Bazel 构建后,它将本地化字符串从主应用包复制到每个扩展包。但是,这会通过复制每个扩展中的 Localizable.strings 文件来扩展整个应用包。

 

因此,我们决定删除扩展中的本地化副本。

修复

 

第一,我们更新了 BUILD 文件,这样扩展程序就不会从主应用包复制本地化字符串了。

 

但是,使用这个更改,NSLocalizedString 无法正确加载本地化字符串。在进一步研究之后,我们发现这些宏都使用 +[NSBundle mainBundle],但是 [NSBundle mainBundle] 实际上会返回一个包含“当前应用程序可执行文件”的包,当从扩展中调用该包时,该包将作为你的应用程序的子文件夹。举例来说,它是 /path/to/Pinterest.app/PlugIns/SiriExtension.appex/ 而非 /path/to/Pinterest.app/。为了使 NSLocalizedStringWithDefaultValue 能够从主应用包中读取本地化字符串,我们进行了更改来对路径进行设置。

 

这些全部已保存更改((所有 Localizable.strings 的大小)*(具有这种本地化重复的扩展的数量)),大约占全部应用程序大小的 30%。

长远规划

 

接下来,我们计划将本地化资源放入各自的 SDK/ 扩展中,而非依赖于应用包,这样做有以下好处:

 

  • 每个包都将是自包含的,所以它不需要主应用程序包就能运行或测试本地化,并且可以被绑定到一个单独的应用程序中。

  • 在扩展代码中,NSLocalizedString 和本地化 API 按照自己的方式工作。

  • 让包开源。

 

此外,还可以进行其他可能的改进,例如,删除不必要的非面向消费者的代码本地化,研究更大尺寸的图像格式,以及其他编译器级的优化。

 

[1] 下载大小是指从 App Store 下载时传输的实际大小,只有当应用超出苹果确定的 200 MB 的限制,且用户没有使用 Wi-Fi 时才会显示,除非用户更改默认设置。由于它被压缩,所以比通常的安装体积要小。


[2] 本地安装大小是指实际应用在你的手机磁盘上的大小(设置应用→iPhone 存储→Pinterest→应用大小)。它是为你的手机型号瘦身的,所以通常比通用体积小。

 

作者介绍:


Liang Ma,Pinterest Engineering 团队应用基础软件工程师。

 

英文原文链接:https://medium.com/pinterest-engineering/how-we-reduced-pinterests-ios-app-size-by-30-50mb-68d7f8425882

2021-05-12 17:221848

评论

发布
暂无评论
发现更多内容

飞桨云上沙龙——智能制造专场

百度大脑

渗透测试工具一一Nmap(从初级到高级)

网络安全学海

网络安全 渗透测试 WEB安全 漏洞挖掘 nmap

技术干货| MongoDB如何查询Null或不存在的字段?

MongoDB中文社区

mongodb

去哪儿网MySQL日志分析实践,80%数据丢失都给你救回来!

Qunar技术沙龙

dba

Java中容易混淆的基础知识

工程师日月

java 5月月更

从手工测试到自动化测试进阶,需要学什么?结合自身分享我10+年的测试经验!

伤心的辣条

Python 程序人生 软件测试 自动化测试 接口测试

恒源云 (Gpushare)_Restormer:用于高分辨率图像重建的高效Transformer

恒源云

人工智能 深度学习 Transformer

在基础语法中Java与c++有哪些不同?(对于学过c++转Java必看)

工程师日月

c++ java 5月月更

LabVIEW仪器控制:智能示波器(普源DS1000E)

不脱发的程序猿

LabVIEW 串口通信 VISA LabVIEW示波器软件

用阅读和写作应对未来风险

石云升

写作 阅读 5月日更

解决方案| 阿里云数据库MongoDB版助力餐道显著提升运维效率,打造卓越餐饮/零售服务

MongoDB中文社区

mongodb

基调听云研发总监杨金全出席CSDN可观测性与APM峰会

基调听云

云原生 APM 可观测性 基调听云

Hadoop hdfs 的shell操作

Emperor_LawD

hadoop Shell 5月月更

虎符交易所Hoo研究院|币海寻珠 2022年4月下半月区块链投融事件TOP20

区块链前沿News

虎符研究院

华创视讯加入龙蜥社区,携手共建开源新生态

OpenAnolis小助手

开源 龙蜥社区 CLA 华创视讯 龙腾计划

模块一

Geek_28cf33

遇到bug怎么分析,这篇文章值得一看

伤心的辣条

Python 程序人生 软件测试 自动化测试 测试开发

观测云产品更新|优化观测云商业版升级流程;新增进程、日志、链路详情页关联网络;场景模块优化等

观测云

运维 可观测性 可观测

Flutter 组件渲染模式详解

岛上码农

flutter ios 安卓开发 跨平台应用 5月月更

在线TSV转Excel(xls/xlsx)

入门小站

工具

gRPC服务开发和接口测试初探【Go】

FunTester

信息系统的建设周期

奔向架构师

信息系统 5月月更

【愚公系列】2022年05月 二十三种设计模式(七)-桥接模式(Bridge Pattern)

愚公搬代码

5月月更

从活动能力层建设看业务架构

Qunar技术沙龙

业务架构

TiKV 缩容不掉如何解决?

TiDB 社区干货传送门

企评家|华润三九医药股份有限公司成长性评价报告摘要

企评家

塔米狗企评家 企业评价 企业成长性分析 企评家 企业投资价值评价

Mysql的事务操作问题

恒山其若陋兮

MySQL 5月月更

建木持续集成平台v2.3.1发布

Jianmu

开源 DevOps 自动化 持续集成 gitops

nginx配置系列(十)代理服务(proxy_pass)

乌龟哥哥

5月月更

linux时间格式化命令

入门小站

Linux

在线URL解码还原工具

入门小站

工具

我们如何将 Pinterest 的 iOS 应用大小减少 30% 以上_语言 & 开发_Pinterest Engineering_InfoQ精选文章