写点什么

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

作者:Sergio De Simone

  • 2024-12-30
    北京
  • 本文字数:1153 字

    阅读完需:约 4 分钟

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

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


Lyft 的 iOS 应用包含一个扩展,可将其与 Apple Maps 集成,并在 Maps 应用内提供有关 Lyft 优惠的信息。正如 Stepaniuk 和 Husar 所解释的那样,以有效方式创建 iOS 应用扩展的关键是正确管理依赖项,以尽可能提高应用和扩展中的代码重用率,同时优化二进制大小和内存使用率。


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


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


在内存方面,Lyft 工程师发现扩展可能只能使用 20 到 50MB 的 RAM,具体取决于 iOS 版本、设备型号和其他因素。


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


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


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


获得该信息后,下一步就是识别所有看起来没必要加入的依赖项。为此,Lyft 工程师使用了 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
复制代码


此命令会显示将所调查模块与其每个较大依赖项连接起来的路径中包含哪些模块,这样你就可以删除它们或使目标模块不依赖它们。在某个场景下,Lyft 团队决定复制一项服务以创建最小依赖项,目的是打破对较大模块的依赖。


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


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


原文链接:

Challenges of Creating iOS App Extensions at Lyft


2024-12-30 09:006502

评论

发布
暂无评论

千万级学生管理系统考试试卷存储方案设计

tom

架构实战营:模块四作业

刘璐

工作想法小计(4):2/28 - 3/4

非晓为骁

个人成长 工作 细节 工作想法

[架构实战营]-千万级学生管理系统的考试试卷存储方案

邹玉麒

「架构实战营」

千万学生管理系统之考试模块存储架构设计

随欣所遇

架构训练营5期

千万级学生管理系统的考试试卷存储方案

smile

架构实战营

千万级学生管理系统的考试试卷存储方案

风中奇缘

架构实战课 「架构实战营」

在阿里巴巴,我们如何先于用户发现和定位 Kubernetes 集群问题?

阿里巴巴云原生

阿里云 云原生 分享 KubeProbe

千万级学生管理系统的考试试卷存储方案

凌波微步

「架构实战营」

节省 58% IT 成本,调用函数计算超过 30 亿次,石墨文档的 Serverless 实践

阿里巴巴云原生

阿里云 云原生 函数计算 石墨文档 资源伸缩

【模块四】千万级学生管理系统考试试卷存储方案设计

yhjhero

#架构训练营

构建 Go 应用 docker 镜像的十八种姿势

万俊峰Kevin

微服务 web开发 go-zero docker image Go 语言

【BBC learningenglish】with Tango

IT蜗壳-Tango

3月月更

感受当下-人生意义的思索

李印

自我感悟 生活的意义

峰会报名|从金融行业技术选型,看 RocketMQ 如何应对严苛挑战

阿里巴巴云原生

阿里云 RocketMQ 云原生 消息队列 峰会报名

千万级学生管理系统考试试卷存储方案

Geek_36cc7c

模块四

blazar

「架构实战营」

模块八-作业二

hunk

云原生训练营

最佳实践:Kubernetes 集群中 DNS 故障的可观测性与根因诊断

阿里巴巴云原生

阿里云 Kubernetes 云原生 服务器 DNS

Python二分查找,字符串模板,textwrap模块,每天写写Python自然就会了,每日Python第2天

梦想橡皮擦

3月月更

全链路压测(五):生产全链路压测实施全流程

老张

性能测试 全链路压测 稳定性保障

千万级学生管理系统Redis存储架构

IT屠狗辈

redis 架构实战营

架构师训练营模块四作业

刘帅

强大的JSON.stringify,你真的会使用吗?

战场小包

JavaScript 前端 3月月更

关于千万级学生系统考试的思考

Geek_1b4338

#架构训练营

模块四作业

Mr小公熊

第四课作业

浪飞

MySQL 15条常用的SQL知识(18/100)

hackstoic

MySQL

网络工程师必知:三种防火墙链路检测技术:BFD、NQA、IP-link

Ethereal

DDD实战(3):整体工作框架和全局需求分析

深清秋

DDD 软件架构 生鲜电商系统 3月月更

PHP 遇见 Serverless,帮你解决这些痛点!

阿里巴巴云原生

php 阿里云 Serverless 云原生

在 Lyft 创建 iOS 应用扩展的挑战_软件工程_InfoQ精选文章