菏泽软件开发 济宁软件开发
24小时客服热线:18678812288
开发技术

如何优化App的启动速度

投递人 ; 济宁软件开发  发布于2016年10月11日    有人阅读

App的启动速度不仅影响菏泽APP开发调试,也直接关系到用户体验。之前有些很久没有打开过的项目,需要花费很长的时间才完成编译;对应的 App 在点击后,许久才出现启动画面。你是否为这些问题苦恼过呢?
Mach-O 文件是如何被加载的
在 mian() 函数执行之前,操作系统为我们做了什么?
exec() -> main()
exec()执行过程:
内核随机分配一段可用的内存给应用程序。但有个规则,即不分配低地址的内存空间,该地址空间大小由处理器的位数决定,情况如下:
《 32位处理器保留 4K
《 64位处理器保留 4G
低地址保留,用于保存空指针、异常错误信息等。
加载动态库
内存分配完成后,处理器运行动态加载器(Dynamic loader)来加载动态依赖库(dylibs)。
加载过程:
映射所有的直接依赖库,递归间接调用的依赖库(Map all dependent dylibs,recurse).
重建所有的图片(Rebase all images).
绑定所有图片(Bind all images).
准备代码层面的加载(ObjC prepare images)
执行初始化方法(Run initializes).
1. 加载动态库
直接加载:
解析所有的动态库
找出需要的 mach-O 文件
打开并读取文件
认证 mach-O 文件
登记代码签名
为每个 segment 调用 mmap() 映射函数
递归加载:
当所有直接依赖库加载完毕后,还存在直接依赖库依赖于其他库的情况。递归加载间接依赖库,一般 App 需要加载 100 到 400 个动态库!其中绝大多数为系统库,苹果已经最优化了系统库的加载。
2. 重建(Rebasing)
将图片资源根据其地址进行加载,重建信息被编码在 LINKEDIT segment 中。重建的过程按照地址顺序执行,所以可以被内核预取。
3. 绑定(Binding)
应用程序对动态库的引用只是字符层(symbol)面上,绑定过程中需要加载器通过函数名来查找,相对于重建这个过程需要更多的计算。
4. ObjC 准备阶段
完成重建和绑定后的配置工作
登记定义的 ObjC 类
更新实例变量对应的内存位置
分类的方法被插入到主类
5. 初始化(Initializer)
静态分配内存的对象的初始化
调用 +load 方法
调用相关联的动态库
最后,执行 main()函数

上一篇:软件开发培训

下一篇:APP开发技术的应用