当前位置: 首页 > 科技观察

携程火车票iOS项目开发经验优化实践

时间:2023-03-21 12:53:35 科技观察

作者|东海,携程移动开发专家,专注于移动端框架和移动端性能。Marshal,携程高级软件工程师,致力于平台基础设施开发。一、背景目前各大公司的APP都采用组件架构。组件架构带来高内聚、低耦合、平台化等诸多优势,使得项目结构更加清晰,项目管理更加容易。大多数iOS项目使用CocoaPod进行组件管理。一些大型项目需要一个打包平台来完成组件打包和APP测试的任务。在开发方面,将使用二进制和源代码切换来提高编译速度。组件化虽然给APP项目的工程管理带来了很大的好处,但是对于开发者来说也存在一些比较麻烦的问题:在开发过程中,如果需要调试没有解锁的组件,需要重新执行命令解包,调试只能通过打开相应组件的源代码来完成。每次切换一个组件的源码,都需要在终端输入一系列带有各种参数的命令来执行podinstall。手动输入速度慢且容易出错。组件化使得组件粒度越来越细,每个人管理的组件数量会增加。每个组件更新都需要打包到打包平台上。componentbundle包打包完成后,测试包进行验证。这些虽然可以让工作正常进行,但是繁琐重复的操作影响了开发人员的开发效率。2、现状携程火车票APP一直采用组件化管理。去年,它转而使用CocoaPod进行组件管理。随着业务的迭代和基础设施的不断完善,pod组件也越来越精细。目前,pod组件数量已经超过60+。Pod组件数量越多,开发者的维护成本就越高。不仅要管理和维护每个pod组件的更新,还有捆绑pod组件和测试包打包时间长的问题。上述繁琐、重复、耗时的操作一直困扰着我们的iOS开发者。如果能够尽可能优化这些开发体验问题,必然会带来开发效率的提升。3.优化方案为了让开发者更容易调试代码,更好的打包测试体验,更专注于开发过程,我们做了很多方面的运行优化和技术实践,主要有:3.1通过技术手段,在开发过程中实现二进制调试,难免要调试的组件没有解锁源码。程序在运行过程中崩溃,但在没有解锁源代码的组件上崩溃。你看到的只是一堆未知的汇编代码(图1),你无法看到足够的源代码调试等调试信息。图13.1.1二进制文件分析如何在不解压源代码的情况下调试二进制文件,即使在二进制组件上崩溃也能定位到具体行,成为我们的新问题。我们查找了各种资料,发现美团有一个zsourceCocoaPod插件,可以进行二进制调试。虽然不是开源的,但是大概的逻辑在文章里已经说的很清楚了。总体原则:以libXXXX.a二进制文件为例,使用MachOView查看二进制文件,获取更加友好的二进制信息。我们可以看到二进制文件中存放了“debug_str”Section的信息。debug_str编译时会内部记录源地址:图2使用命令在终端输入:dwarfdump./libXXXX.a|grep'XXXX'注意到AT_name字段名,去DWARF1.1.0Reference文档,我们可以得到Known:ADW_AT_nameattributewhosevalueisanull-terminatedstringcontainingthefullorrelativepathnameofprimarysourcefilefromwhichthe编译单元导出。一个DW_AT_comp_dir属性,其值是一个以空字符结尾的字符串,其中包含编译命令的当前工作目录,该命令以某种方式将Forelax视为生成此编译单元的主机系统。XXXX.swift源文件存在于这个地址:/Users/marshal/Desktop/XXXX/XXXX/XXXX.swift这个地址是编译时源代码所在的位置。调试时,编译器会先从这里的源代码文件中加载对应的映射地址。如果对应地址有源码文件,则可以进入源码调试。3.1.2脚本开发了解基本原理后,接下来就是解决各种问题和障碍:1)获取静态库的源代码。2)编译静态库时获取静态库存放的源代码文件的路径。3)在本地创建以上