写点什么

我们如何将 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:221813

评论

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

Apache Doris (incubating) 1.0 Release 版本正式发布!

ApacheDoris

数据库 大数据 开源 OLAP apache doris

企业管理理念之人本善还是本恶

秋去冬来春未远

企业管理 人性本善 人性本恶 一念之差

利用 Dio 完成数据删除操作

岛上码农

ios 跨平台 移动端开发 flutter开发 安卓开发

[Day19]-[动态规划]分割等和子集

方勇(gopher)

LeetCode 动态规划 数据结构和算法

区块链如何助推著原创保护

CECBC

【ELT.ZIP】OpenHarmony啃论文俱乐部——这些小风景你不应该错过

ELT.ZIP

神经网络 OpenHarmony ELT.ZIP

linux之rpm命令

入门小站

Linux

upnp.exe进程

Sher10ck

日积月累

高效压缩位图在推荐系统中的应用

vivo互联网技术

redis 推荐 存储

【ELT.ZIP】OpenHarmony啃论文俱乐部——浅析稀疏表示医学图像

ELT.ZIP

OpenHarmony 医学影像 稀疏矩阵 ELT.ZIP

读《Software Engineering at Google》(09)

术子米德

架构师成长笔记

在线YAML转CSV工具

入门小站

工具

Camtasia Studio2022汉化版

茶色酒

Camtasia2022

读《Software Engineering at Google》(08)

术子米德

架构师成长笔记

在线CSV转Plaintext(txt)工具

入门小站

工具

OceanBase 杨传辉参与数据库技术与应用发展研讨会

OceanBase 数据库

oceanbase

关于数字货币的几点问题及回应

CECBC

基于云效Codeup一键恢复删库保护数据资源,程序员删库跑路不复存在

阿里云云效

云计算 阿里云 程序员 代码安全 删库保护

以OceanBase为例,分析事务型评测基准对分布式数据库的适用性

OceanBase 数据库

分布式数据库 oceanbase

另一视角看元宇宙:元宇宙文化正悄然改变世界

CECBC

Web3.0 时代,我们的生活将产生什么变化?

CECBC

一文论述元宇宙、NFT及不可回避的Web3 时代

CECBC

论利润中心内部核算和集团核算

秋去冬来春未远

阿米巴 利润中心 集团成本

Java 操作 Office:POI word 之文档信息提取

程序员架构进阶

内容审核 4月日更 文档识别 4月月更

安全之花如何盛开在华为云空间的每个角落?

脑极体

读《Software Engineering at Google》(10)

术子米德

架构师成长笔记

spring-cloud-kubernetes的服务发现和轮询实战(含熔断)

程序员欣宸

java 4月月更

易周金融观点:遏制NFT金融化等打下监管良基

易观分析

NFT

Go 入门很简单:Writer和Reader接口

宇宙之一粟

接口 Go 语言 4月月更

Linux驱动开发-外部中断的注册使用(按键为例)

DS小龙哥

4月月更

优秀程序员的30种思维(29/100)

hackstoic

技术思维

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