iOS开发 App启动优化

499 阅读3分钟

1. App启动过程

解析Info.plist

1.加载相关信息,例如如闪屏 2.沙箱建立、权限检查

Mach-O加载

1.如果是_胖二进制文件_,寻找合适当前CPU类别的部分 (胖二进制文件大于只包含一个系统的机器代码的二进制文件;权衡方式是兼容性更广,但 体积 更大) 2.加载所有依赖的Mach-O文件(递归调用Mach-O加载的方法) 3.定位内部、外部指针引用,例如字符串、函数等 4.执行声明为__attribute__((constructor))的C函数 5.加载类扩展(Category)中的方法 6.C++静态对象加载、调用ObjC的 +load 函数

程序执行

1.调用main() 2.调用UIApplicationMain() 3.调用applicationWillFinishLaunching

2. App启动时间的计算

t(App总启动时间) = t1+ t2。

main()之前的加载时间: t1 = 系统dylib(动态链接库)和自身App可执行文件的加载;

main()之后的加载时间: t2 = main方法执行之后,到AppDelegate类中的_- (BOOL)Application:(UIApplication *)Application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法_执行结束前,这段时间,主要是构建第一个界面,并完成渲染展示。

可以参考我的另外一个帖子iOS开发-测量APP启动耗时

main()调用之前的加载过程

可以参考我的另外一个帖子APP启动main()调用之前的加载过程

优化

main()调用之前的耗时可以优化的点有:

1.减少不必要的framework,因为动态链接比较耗时 2.check framework应当设为optional和required,如果该framework在当前App支持的所有iOS系统版本都存在,那么就设为required,否则就设为optional,因为optional会有些额外的检查 3.合并或者删减一些OC类,关于清理项目中没用到的类,使用工具AppCode代码检查功能。 4.删减一些无用的静态变量 5.删减没有被调用到或者已经废弃的方法 参考方法-how-to-find-unused-code 6.将不必须在+load方法中做的事情延迟到+initialize中 7.尽量不要用C++虚函数(创建虚函数表有开销)

main()调用之后的耗时可以优化的点有:

1.不使用xib,直接视用代码加载首页视图 2.NSUserDefaults实际上是在Library文件夹下会生产一个plist文件,如果文件太大的话一次能读取到内存中可能很耗时,这个影响需要评估,如果耗时很大的话需要拆分(需考虑老版本覆盖安装兼容问题) 3.每次用NSLog方式打印会隐式的创建一个Calendar,因此需要删减启动时各业务方打的log,或者仅仅针对内测版输出log 4.梳理应用启动时发送的所有网络请求,是否可以统一在异步线程请求

如何找到拖慢启动应用时长的瓶颈

为了找到瓶颈,我们在启动之后的didFinishLauhcning方法开始执行到首页的ViewController的viewDidAppear方法,几乎每个可能比较耗时的流程进行拆分和统计,得到统计数据之后发现: 主要耗时在首页UI构造和渲染(storyboard加载,tabBar/topBar渲染,开屏广告加载/cell注册/日志模块初始化这几个步骤)。

参考文档

今日头条iOS客户端启动速度优化

iOS 程序 main 函数之前发生了什么

iOS App 启动性能优化 iOS App从点击到启动 iOS程序启动->dyld加载->runtime初始化 过程