APP下载

iOS软件安装包缩减方案与实现

2023-04-06袁宜霞

电脑知识与技术 2023年5期

袁宜霞

关键词:软件安装包;可执行文件;编译优化

0 引言

随着移动应用市场竞争越来越激烈,精细化运营显得越来越重要,手机软件安装包的大小不仅影响用户下载意愿和用户体验,也会影响渠道分发和推广成本甚至关系着研发维护成本,安装包过大会带来很多弊端。首先,用户花费流量来进行下载意愿降低;包体的下载过程越长,用户主动取消下载可能性越大,网络不畅或者空间不足带来的下载中断概率增大;在手机空间不足导致用户需要清理空间时,包体越大的软件被清理的可能性越大。其次,在软件分發渠道,有些厂商会限制用户使用蜂窝网络下载包体过大安装包,或者大幅提高安装包大的软件分发费用;买量推广的成本增大而用户转换率降低。最后,安装包越大意味着代码和资源越多,研发团队需要更高的学习和维护成本,也更容易出错。

本文以iOS安装包为例,制定了一套安装包缩减的整体方案并详细阐述了原理与具体实现。

1 iOS 软件安装包分析

iOS软件安装包为IPA格式,此格式文件本质是一种压缩包,解压缩后可以看到文件夹中含有一个Pay? load目录。此目录下包含了与IPA包同名的可执行文件,资源文件、配置文件和lproj目录。其中,可执行文件是安装包的核心部分,文件大小占据整个安装包的较大比例,是逆向工程的重要目标。资源文件主要包括图片、视频、音频等,这类文件数量较多。lproj目录包含各种本地化的字符串,为逆向工程提供重要线索[1]。

2 iOS 软件安装包缩减方案与实现

本文将从可执行文件、资源优化、产品功能优化、编译优化和符号信息设置几个方面来进行安装包缩减方案的制定与实现。

2.1 可执行文件优化与监控方案

在iOS中可执行文件的格式是Mach-O,LinkMap文件是集成开发工具Xcode生成可执行文件时同步产生的链接信息,记录了可执行文件的各个组成部分,包括代码段和数据段的分布情况。开发者需要在Xcode中打开Write Link Map File选项并编译后才能获得LinkMap文件。LinkMap文件有三个部分,分别是:Object files列举了可执行文件里所有.o文件,以及每个文件的编号;Sections是可执行文件的段表,列举了各个段在可执行文件中的偏移位置和大小,包括代码段和数据段;Symbols详细存储了每个文件中的各个字段位置和大小[2]。otool是Xcode自带的Object file 展示工具,常用于逆向工程。

1) 删除无用的类

由于iOS编程语言Objective-C的动态特性,它使用类名和方法名对这个类和方法进行调用,所以编译器将项目中全部OC源文件编译到可执行文件,不论该类和方法是否被使用。在代码中通过手动搜索al? loc、new、ClassName *等关键字代码逐个排查所有类是否被使用的方法无疑是成本巨大且难以实施的。如下将详细描述一个能自动化实现查找无用类的方案,通过下述方案获得所有无用类的类名,并删除这些无用类的代码能带来可执行文件大小的缩减。

Xcode自带的Analyze静态分析工具能查找出一些没有使用过的第三方库,通过清除这类第三方库实现压缩安装包的目的。开发时尽量减少第三方库的引入,如果避免不了优先选择精简库,在LinkMap中可以看到第三方库所占的包大小,可以作为是否引入该库的评估依据。具体方法为:通过LinkMap中Ob? ject files 部分查看某个文件编号,再通过此编号在Symbols部分查看这个文件的每个段所占用大小并进行累加,所得到的总大小就是该文件在可执行文件中所占空间大小,此过程使用自动化脚本实现。例如:libWeChatSDK 这个静态链接库文件的文件编号为1260,把Sysmbols 中1260 对应的所有段大小累加为0x00000040+0x00000040+0x000000A0=288B。

在不断迭代开发中,工程中存在较大数量的重复代码,这些代码无用的能进行删除,有用的能通过函数化、面向对象编程等方式去进行优化,从而减少安装包大小。XCode中使用PMD静态分析工具对代码进行扫描[3],在编译项目后,会有汇总文档给出重复代码提示,且在项目代码中也会明确提示当前代码与其他文件的多少行开始重复了。开发者依据提示可快捷地进行重复代码优化或者删除。

可执行文件占据安装包的大小比例高,所以在版本迭代开发中监控可执行文件增长很有必要。如3) 所述,利用自动化脚本对LinkMap文件进行分析可以获得每个代码文件在可执行文件中的大小,对比不同的两个版本能够获得各代码文件所占可执行文件大小的变化,将这些变化进行排序展示和监控分析,对于控制可执行文件的增长具有益处。表1为文件瘦身排行。

2.2 资源优化

在iOS安装包中主要包括图片、音频、视频等,下面将从这几个部分展开优化。

1) 删除未被使用的图片、音频和视频资源

逐个使用资源名称去整个工程项目代码文件中搜索是否被引用的方法非常耗时,一个项目需要几个小时,性价比极低,本文将介绍自动化实现查找未被使用图片、音频和视频的方案,耗时仅仅几分钟甚至几十秒。本方案的过程为:①获得安装包中的所有文件名,通过正则表达式r3"|w(.a+v|w?)m\.a[|sowggf||falpv|em|apc4c||rgmifv|jbp|ga|vjpi|emgp|bemg|pra|p|rnagm]|m"提ov|取wm出v|m所p有图片、音频和视频资源名称。eral s②trin在g:L(.i+n)k"M提a取p 文出件项目中代通码过中正全则部表使达用式了r的".字* l符it?串。原因在于LinkMap文件中列举出了工程代码中所有的字符串,而资源文件一般都是使用字符串在代码中被使用。如下LinkMap文件中Symbols部分的lit? eral string:后面跟随的就是代码中使用的字符串,pCnlogu,dqArlcboudme_对fou应nd安对装应包安中装的包图片中资的源音C频lou资dA源lbuqmr?. code_found.wav。

在不影响用户体验的情况下,部分不常用的视频、音频和图片资源、字体库等可以放置到云端,用户使用时实现按需下载,这在一定程度上能减少安装包大小。利用XCode中的On-Demand Resources 配置,能便捷地将资源配置为按需加载,在需要使用时请求从AppStore中下载,这对于游戏或者包含大量多媒体资源的软件安装包缩减是非常有效的手段。

2.3 产品功能优化

经过长期累月迭代开发的软件,软件里面有大量的已经失效功能或者曝光率低的功能代码,这部分功能的删减能带来安装包体大小的缩减。失效功能代码的删减相对比较容易实现,但判定某个功能是否曝光率低是需要数据支撑并通过项目团队多方确认。通常软件界面需要较多图片等资源,这里提出结合界面曝光率和界面二进制文件大小两个维度来确定是否刪减功能的方案。一方面,通过在View Controller 中加入曝光上报数据,获取客户端界面曝光率;另一方面,通过2.1 中所述自动化方法从LinkMap 获取View Controller二进制文件的大小,从而估计这个模块的大小。最后,对于提取出的曝光率低而二进制文件占比又比较大的界面,在项目团队进行讨论,有重点地进行功能优化、删减或者改为网页形式实现,例如生命周期不长的运营活动类需求就比较适合使用网页形式实现。

2.4 编译优化和符号信息设置

1) 编译优化

Xcode采用Clang编译,Optimization Level中提供了6个编译模式[5],分别是:不做代码优化的None,优化代码性能最小影响编译时间的Fast,开启不依赖时间/空间的所有优化项的Faster,开启全部优化会导致可执行文件增大的Fastest,开启除增加包体大小以外的全部优化项的Fastest Smallest,激进不太推荐的Fastest, Aggressive Optimization。在安装包的发布版本中,选择Fastest Smallest编译模式,在保证代码执行效率的同时最小限度影响包大小。

2) 符号信息设置

symbols是所有的变量、类、函数、枚举、变量和地址映射关系,以及一些在调试的时候使用到的用于定位代码在源码位置的调试符号,和断点定位以及堆栈符号化有很重要的关系。对于发布出去的版本而言,并不是所有的符号都是必要的,比如调试符号,所以这类型符号的删减也能带来包体大小的缩减。在Xcode 中将Strip Linked Product设置为yes能清除不必要的符号信息,同时把Deployment Postprocessing 设置为YES 使其生效。将Symbols Hidden by Default设置为yes把symbols申明为私有外部符号也能减少包大小。

3 结束语

随着技术发展和用户需求的增加,手机软件安装包越来越大,这提高了用户下载成本,对用户新增和软件留存率有所影响,在进行软件推广时也面临成本增加、用户转化率低和各类限制,无形中也会增加软件研发维护成本。针对iOS软件安装包,本文从多个方面制定了一套详细的自动化缩减方案,并进行自动化监控,希望能协助移动应用项目团队进一步提升用户体验,打造精品。