写点什么

在 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:008094

评论

发布
暂无评论

公司一直用Mybatis的原因原来在这!不得不竖起我的大拇指

小闫

Java mybatis mybatis-config.xml mybatis缓存

道路千万条,安全只三条

石君

安全评估 安全设计

Hexo blog 创建指导手册

想飞的鱼

GitHub Hexo GitHub Pages Blog

视读——沟通的艺术,看入人里,看出人外(开篇)

废材姑娘

读书笔记 视觉笔记

面试官:为什么需要happens-before规则和什么是指令重排序

无予且行

Java 编程 程序员 面试 happens-before

GeekPwn 2020少年黑客马拉松大赛即将开启 谁将CARRY全场?

Geek_116789

JVM中的双亲委派机制你还没懂吗?

阿文

Java JVMTI JVM 深入理解JVM JVM原理

依赖倒置原则

John

极客大学架构师训练营

小白也有大厂梦,如何从零开始掌握高薪Java工程师必备技能?

无予且行

Java 架构 面试 后端 大厂

有了多线程,为什么还要有协程?

八两

线程 进程 协程 GMP 进程线程区别

碎片化学习行不行

封不羁

架构训练营第五周 - 作业

无心水

极客大学架构师训练营

架构训练营第五周 - 总结

无心水

极客大学架构师训练营

重学 Java 设计模式:实战策略模式「模拟多种营销类型优惠券,折扣金额计算策略场景」

小傅哥

Java 设计模式 小傅哥 重构 代码优化

它们为什么这么快:从多进程到多线程再到I/O复用

Ya

多线程 进程 并发

一致性哈希 -- java 实现

lei Shi

如果张东升是个程序员

程序员生活志

程序员 张东升

三十张图助你看清红黑树的前世今生

淡蓝色

Java 程序员 数据结构 算法

Git 的远端操作及解析(含思维导图)

多选参数

git GitHub gitlab

现在面试这么难,背下题就能过的时代一去不复返了

小谈

Java 面试 JVM springboot SpringCloud

【Python】 any() 和 or 区别你真的知道吗?

Leetao

Python 数据结构 Python基础知识

工业4.0|振动分析能做到预防性维护吗?

清水河路人甲

刚去面试现场聊了一个多小时的Redis ,悄悄分享给大家!

Java小咖秀

nosql redis 面试

从Servlet到Spring Boot

废材姑娘

Java Spring Boot

区块链系列教程之:比特币的问题

程序那些事

比特币 区块链 智能合约 以太坊

针对GPU单指令多数据流的编译优化算法

GPU

gpu 编译器 程序语言 if-conversion

Raft探索历程--Part2

老胡爱分享

分布式系统 raft

Java程序员的必修课之Spring理解透彻了吗?不会还咋去面试?

犬来八荒

Java spring 面试 后端 框架

架构师训练营学习总结

John

极客大学架构师训练营

[1.3万字] 玩转前端二进制

阿宝哥

Java 大前端 base64 Blob

Java线程池最细的解释,看完后彻底征服面试官

小新

Java 架构 面试 线程 线程池

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