在 Lyft 创建 iOS 应用扩展的挑战

在最近的一篇文章中,Lyft 工程师 Artur Stepaniuk 和 Max Husar描述了 Lyft 如何处理为其 iOS 应用程序创建应用程序扩展的复杂性,同时又不打破 Apple 设置的严格 RAM 和二进制大小限制,也不影响用户体验。

Lyft 的 iOS 应用程序包含一个扩展程序,可将其与 Apple 地图集成,并在地图应用程序中提供有关 Lyft 优惠的信息。正如 Stepaniuk 和 Husar 所解释的,高效创建 iOS 应用扩展的关键是正确管理依赖关系,以最大限度地提高应用和扩展中的代码重用,同时优化二进制大小和内存使用。

此过程中的主要复杂性因素是无法使用动态链接来避免在启动时将它们加载到内存中的成本,这将使应用程序启动时太慢。这使得静态链接成为唯一可行的选择,尽管代价是增加应用程序二进制大小及其内存占用量。然而,

较大的二进制文件可能会导致下载和安装时间更长,从而可能减少安装数量。最坏的情况是达到 200 MB 下载大小限制,这会在使用蜂窝数据时在应用下载过程中触发额外的确认对话框。

在内存方面,Lyft 工程师发现,根据 iOS 版本、设备型号和其他因素,扩展程序可能会限制使用 20 到 50MB 的 RAM。

为了减少应用程序的二进制大小和内存占用,Lyft 工程师分析了应用程序的依赖关系图,以确定对此贡献最大的模块。由于 Lyft 使用 Bazel,因此他们依靠图形可视化软件 Graphviz,根据 Bazel 使用该命令生成的数据创建图像query --output=graph

为了详细测量二进制大小的影响,可以将每个模块添加为 Apple Maps 扩展的唯一依赖项,并使用该binary-size-diff工具进行分析。

binary-size-diff是一个比较基本分支和给定拉取请求之间的二进制大小差异的工具。这使得可以衡量删除(或包含)依赖项的实际效果。

一旦该信息可用,下一步就是识别似乎不必要包含的任何依赖项。为此,Lyft 工程师使用 Bazel 的另一个功能来显示两个模块之间的传递依赖关系。

<span style="background-color:#f5f2f0"><span style="color:#000000"><code class="language-bazel">
bazel query 'allpaths(INITIAL_MODULE_PATH:INITIAL_MODULE_NAME, TARGET_MODULE_PATH:TARGET_MODULE_NAME)' --output=graph | grep -v '  node \[shape=box\];' > relations.dot
</code></span></span>

此命令显示将正在调查的模块连接到其每个较大依赖项的路径中包含哪些模块,因此您可以删除它们或使目标模块不依赖于它们。在特定情况下,Lyft 团队决定复制一项服务来创建极简依赖关系,目的是打破对更大模块的依赖关系。

使用这种方法,Lyft 工程师可以将其扩展程序的二进制大小从 45MB 减少到 15MB。虽然 30MB 的减少对于服务器端或桌面应用程序来说并不重要,但它相当于 200MB 的“安全”大小限制的 15%。

Stepaniuk 和 Husar 的文章包含与发布应用扩展的过程相关的其他详细信息,例如如何确保扩展适用于所有支持的区域、使用APPLICATION_EXTENSION_API_ONLY构建设置的效果以及 SiriKit 特性,因此如果您有兴趣,请不要错过它对这些话题感兴趣。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值