模块代码大小分析

作者: Jeffery91 | 来源:发表于2017-11-25 15:20 被阅读58次

背景

app 体积越来越大,App Store 还有 100M 不能使用流量下载的限制。无论是领导或者产品经理,都希望包尽量小,而功能尽量多。

iOS 打包生成的可执行文件 ipa,其实是个压缩包。可以通过 Mac 系统的显示包内容查看其完整的成分。里面包括了资源文件和可执行文件,以及一些开发人员无法控制的如签名和权限文件等。

拿到减小包体积的工作任务时,首先是进行资源文件的压缩和无用资源的删除。接下来,是精简代码量或者通过动态化的方案来代替Native来减小可执行文件大小。这里不讨论动态化,我们使用前者来完成任务。

现状

精简代码量需要有个指标,特别是多人合作的工程里,每个人负责不同的模块。我们需要知道每个模块代码占最终包体的比例和大小。分析代码量,显然是不可以通过统计未编译的代码有多少行来进行,宏和编译选项等因素会导致编译后与编译前差别很大。采用分析最终可执行文件成份的方法。

解决方案

OC 时代,CocoaPods 的各个 pod 是通过静态库方式打包进最后的可执行文件中的,在主工程里的代码和 pods 里的代码,从最终结果看来,没有区别,都在一个可执行文件中。这里,我们借助于编译过程生成的辅助文件 LinkMap。 LinkMap 大体来看由三部分组成——
Object files, Sections, Symbols。Object files 列出了包含的所有的目标文件.o和对应的索引。Sections 从概览上列出可执行文件中代码段和数据段的大小。最后 Symbols 是我们分析的重点,从代码段的起始地址开始,按照地址顺序依次列出了代码中的函数、全局变量等所占的代码大小。每一行由四列,分别是起始地址、大小、对应的文件的索引和具体的函数名等。

统计 Symbols 的每一行,可以得出每个 .o 所占代码的多少,然后再根据 .o 所在的 pod,可以得出每个 pod 所占代码的多少。.o 具体在哪一个 pod 中,Object files可以看到,因为列出了完整的文件路径。最终,通过 CocoaPods 静态库集成的 pods,占可执行文件代码的多少,就统计出来了。

Swift 时代,使用动态库来集成 pods。最后的可执行文件里,会有内嵌的动态库可执行文件。不用 LinkMap 文件,统计动态库的可执行文件可以得出各个模块所占可执行文件代码的多少。

优化及后续

基于以上的分析结果,可以每周发布一个报告,公布各个模块代码量的大小和占比。这样有利于模块负责人及时的删除冗余和废弃代码,及时的精简代码和重构,提升代码质量,减小包体积。

相关文章

  • 模块代码大小分析

    背景 app 体积越来越大,App Store 还有 100M 不能使用流量下载的限制。无论是领导或者产品经理,都...

  • Node模块原理0926

    Node模块原理 1.node模块原理分析 js代码 2.node模块加载分析(多看几遍视频) 3.自己实现一下(...

  • leetcode1052 爱生气的书店老板

    题目 分析 窗口大小固定的滑动窗口问题。 代码

  • android HAL例子分析

    Android HAL 层框架分析以及代码示例 Android HAL层分析 (gralloc显示模块 举例) A...

  • VUE 爬坑笔记 (3)

    VUE组件 模块化 和 组件化 区别 模块化:从代码角度分析问题,把可复用的代码抽离为单独的模块 好处:方便程序员...

  • typing模块的使用

    参考博客 python模块分析之typing(三) python3.5以上版本,typing模块提高代码健壮性 一...

  • iOS-APP瘦身

    分析当前ipa的组成 源代码 通过生成linkmap文件,分析源代码生成的编译文件的大小。在Build Setti...

  • 2019-08-19 sublime运行python代码报错——

    分析原因 在sublime运行python代码报错——ImportError: No module,表示导入模块错...

  • google测试之道

    测试执行和持续集成跟踪代码缺陷 分析代码变更影响的模块,每次执行相应模块的测试用例,加速测试周期,快速反馈 推行测...

  • iApp递归之文件操作

    首先创建一个lly.myu的模块文件,然后复制下列代码就行了。 删除文件夹模块: 获取文件夹里的所有文件大小模块:...

网友评论

    本文标题:模块代码大小分析

    本文链接:https://www.haomeiwen.com/subject/xojcbxtx.html