App性能优化(包瘦身)

2021-04-01  本文已影响0人  你好小老虎
一杯茶,一个耳机,一首动态的音乐

目录
一:摘要
二:安装包组成
三:系统优化
四:资源优化
五:可执行文件优化
六:编译器优化
七:拓展

一,摘要

众所周知苹果对iOS App大小有所限制,如果大于200MB使用蜂窝网络下载需要请求许可,对于流量和手机储存敏感的用户很不友好,包的大小甚至影响新用户的转化,所以对于安装包的瘦身是App发展和优化过程中不可避的问题。

二,安装包的组成

1,介绍

iOS安装包就是ipaipa是一个压缩包,用户下载的就是这个压缩包,下载完成就会自动解压,解压的过程也就是通常所说的安装过程,把ipa文件后缀改为zip,然后解压出来再payload中的.app显示包内容就可以查看里面的资源文件。

2,.app里面的主要内容

三,系统优化(App Thinning)

1,简介

App Thinning是App Store和操作系统在安装iOS或者watchOS的app的时候通过一系列优化似的app以最小的合适的大小被安装到你的设备上。

2,App Thinning有三种方式
3,使用
image.png image.png

四,资源优化

1,简介

资源优化主要分两部分,一是资源做无损的压缩,二是删除无用的资源,比如图片、音频、视频、配置文件等。

2,图片压缩
3,无用资源删除

五,可执行文件优化

1,简介

开头已经讲过App安装包主要由资源文件和可执行文件(Mach-O)组成,可执行文件的大小由代码量决定,所以要想对可执行文件瘦身,首先应该做的就是找到并删除无用的代码。

2,Link Map文件分析

Xcode build产生的Link Map文件能比较直观的反映出程序各部分的文件大小情况,对于减少包体积很有帮助。

  1. 获取 LinkMap :将 Build Setting 里的Write Link Map File 设置为 Yes,然后指定 Path to Link Map File 的路径就可以得到每次编译后的 LinkMap 文件了。我们只修改一下生成的 Link Map文件的路径就可以了,后缀名不要修改。
LinkMap
  1. linkMap 分为三部分
LinkMap.png linkMap.png linkMap.png

通过对LinkMap的分析不但可以统计出所有的方法和类,还能清晰的看到代码所占包大小的具体分布,从而有针对性的对代码进行优化。(对Symbols分析还可以通过方法的二进制重排来提成App冷启动速度)。

3,Mach-O文件分析

Mach-OMach Object的缩写,是Mac/iOS上用于储存程序、库的标准格式。一个简单的方法获得该文件->Xcode编译结束会生成一个可执行程序,查找方法如下图:

Mach-O.png

在这个文件夹下找到对应的项目文件名/Build/Products/Debug进入目录就可找到可执行文件了。

Mach-O.png

iOS的方法都是通过objc_msgSend来调用的,而objc——msgSend在Mach-O文件里是通过__objc_selrefs这个section来获取selector这个参数的,所以__objc_selrefs里是被调用的方法,__objc_classrefs 里是被调用过的类,__objc_superrefs是被调用过的super的类,这样就能找出使用过的类和子类,然后对比Link Map文件就可以找出没有用到的类和方法了(OC是动态语言,方法可以在运行时调用,所以该方法找出的无用代码需要我们二次确认才可删除)。

Mach-O.png
4,使用AppCode

以上可以看到,工作量还是不小的,推荐一个神器 AppCode ,AppCode通过静态分析可以快速的帮我们找到没用的类以及方法等,使用起来也特别简单,在菜单栏选择 code ->Inspect Code就可以了。

AppCode.png

分析结果包括:

看似AppCode已经把所有工作都做完了,其实不然。下面我们再来列举下AppCode静态检测的问题:

所以:AppCode检查完成之后,还是需要我们二次确认才能够删除。

6,编译器优化

Xcode 支持编译器层面的一些优化选项,这些优化选项可以在更快的编译速度、更小的二进制和更快的执行速度之间根据实际需要选择合适的方案。

7,拓展

  1. 上面这些工作做完相信App已经很"洁净"了,"瘦身"工作基本完成了,特别对于迭代很久的老项目会有很大的成效。
  2. 对项目进行Archive后会生成 .xcarchive 文件,该文件中包含了AppdsYMS以及其他信息,将 .xcarchive文件上传到 App Store Connect后,苹果会对App中的可执行文件进行DRM加密,然后将App压缩成ipa文件并发布到App Store。加密对可执行文件的大小影响不大,但是它会严重影响可执行文件的压缩效率,导致压缩后的ipa大小增加,也就是我们的安装包增大。
  3. 这种加密使用脱壳工具很容易进行解密。Mach-O文件代码的解密发生在Mach-O文件被加载的时候,由Mach Loader进行。Mach Loader 会读取 Mach-O 中的 LC_ENCRYPTION_INFO 这条Load Command来判断可执行文件是否加密。
  4. 所以可以通过 otool -l <binary-path> 的命令来查看 Mach-O 是否被加密过。
image.png

其中 cryptoff表示加密字段位于文件中偏移 16384个字节;cryptsize表示加密内容长度 16515072字节;cryptid表示加密方法为 1,如果为 0表示不加密(平时打包出来的验证可以发现都为0,那时因为加密是在上传App Store时才做的,怎么获取线上ipa呢,可以参考我另外一篇文章->ipa包获)。

查看 LC_SEGMENT_64__TEXT 段的范围:

image.png

根据上面的结果可以算出加密内容实际上都位于 __TEXT 中,也就是说苹果只会对Mach-O文件中的 __TEXT 段加密,而不会对其他段加密,也就是说,只要能把 __TEXT段中的节移到其他段,就能减少加密范围,从而使压缩效率提升,从而减小下载包大小。

一般来讲,在App中可执行文件占80%的大小,而加密部分可占执行文件的 70%左右,加密会影响 60%左右的压缩率,因此移走该加密部分会提升 34%左右的下载大小(需要注意的是,iOS13已经对下载大小做了优化,所以该方案无法再对iOS13及以上的设备下载大小再做进一步优化)。

需要注意的是,__TEXT 段中所有节都移走对于小型App没有任何问题,但在较大类型的App,还需要注意 Crash链接失效问题。

文章到这里暂告一段落,如果有什么问题或者不足欢迎指正,如果对你有帮助,记得点赞收藏,谢谢!

上一篇下一篇

猜你喜欢

热点阅读