1、APP的启动
冷启动:从0开始启动APP
热启动:后台切换到前台
主要对冷启动优化(真机调试,模拟器无打印)
1.添加环境变量打印APP启动时间(Edit scheme -> Run -> Arguments)
DYLD_PRINT_STATISTICS设置为1
2、APP冷启动的3大阶段
1.dyld
2.runtime
3.main
1.dyld
dyld(dynamic link editor),Apple的动态链接器,可以用来装在Mach-O文件(可执行文件、动态库等)
启动APP时,dyld所做的事情有:
1.装载APP的可执行文件,同时会递归加载所有依赖的动态库
2.当dyld把可执行文件、动态库都装载完毕后,会通知runtime进行下一步处理
2.runtime
启动APP时,runtime所做的事情有:
1.调用map_images进行可执行文件内容的解析和处理
2.在load_images中调用call_load_methods,调用所有Class和Category的+load方法
3.进行各种objc结构的初始化(注册Objc类、初始化类对象等等)
4.调用C++静态初始化器和_attribute_((constructor))修饰的函数
到此为止,可执行文件和动态库中所有的符号(Class,Protocol,Selector,IMP…)都已经按格式成功加载到内存中,被runtime所管理
3.main
总结一下:
1.APP的启动有dyld主导,将可执行文件加载到内存,顺便加载所有依赖的动态库
2.并有runtime负责加载成objc定义的结构
3.所有初始化工作结束后,dyld就会调用main函数
4.接下来就是UIApplicationMain函数,AppDelegate的application:didFinishLaunchingWithOptions:方法
2、优化
1.dyld阶段
减少动态库、合并一些动态库(定期清理不必要的动态库)
减少Objc类、分类的数量、减少Selector数量(定期清理不必要的类、分类)
减少C++虚函数的数量
Swift尽量使用struct
2.runtime阶段
用+initialize方法和dispatch_once取代所有的_attribute__((constructor))、C++静态构造器、ObjC的+load
3.main
在不影响用户体验的前提下,尽可能将一些操作延迟,不要全部都放在finishLaunching方法中
3、安装包瘦身
1.资源采取压缩
2.资源配置在云端
3.去除没有用到的资源:https://github.com/tinymind/LSUnusedResources
4.对编译器优化,设置Strip Linked Product、Make Strings Read-Only、Symbols Hidden by Defaulsts设置为YES,去掉C++的异常支持,设置Enable C++ Exceptions为NO
5、付费软件AppCode