http://www.cocoachina.com/ios/20170804/20145.html
Instruments 增加了一个工具,名叫静态初始化程序跟踪器(Static Initializer Tracing),用于定为 main() 函数调用之前的启动速度瓶颈
Apple Developer Technical Support,通过这个渠道可以接触到苹果的工程师。
//点评app做法:
点评App里面本身就包含了很多复杂的业务,比如外卖、团购、到综和酒店等,同时还引入了很多第三方SDK比如微信、QQ、微博等,在App初始化的时候,很多SDK及业务也开始初始化,这就会拖慢应用的启动时间。
App的启动时间t(App总启动时间) = t1(main()之前的加载时间) + t2(main()之后的加载时间)。
t1 = 系统dylib(动态链接库)和自身App可执行文件的加载;
t2 = main方法执行之后到AppDelegate类中的- (BOOL)Application:(UIApplication *)Application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法执行结束前这段时间,主要是构建第一个界面,并完成渲染展示。
针对t1的优化,优化主要有如下:
1)减少不必要的framework,因为动态链接比较耗时;
2)检查framework应当设为optional和required,如果该framework在当前App支持的所有iOS系统版本都存在,那么就设为required,否则就设为optional,因为optional会有些额外的检查;
3)合并或者删减一些OC类,这些我会在后续的静态检查中进行详解;
针对t2的时间优化,可以采用:
1)异步初始化部分操作,比如网络,数据读取;
2)采用延迟加载或者懒加载某些视图,图片等的初始化操作;
3)对与图片展示类的App,可以将解码的图片保存到本地,下次启动时直接加载解码后的图片;
4)对实现了+load()方法的类进行分析,尽量将load里的代码延后调用。
//今日头条
1.纯代码方式而不是storyboard加载首页UI。
2.对didFinishLaunching里的函数考虑能否挖掘可以延迟加载或者懒加载,需要与各个业务方pm和rd共同check 对于一些已经下线的业务,删减冗余代码。
3.对于一些与UI展示无关的业务,如微博认证过期检查、图片最大缓存空间设置等做延迟加载
4.对实现了+load()方法的类进行分析,尽量将load里的代码延后调用。
上面统计数据显示展示feed的导航控制器页面(NewsListViewController)比较耗时,对于viewDidLoad以及viewWillAppear方法中尽量去尝试少做,晚做,不做。
5.启动之后展示闪屏广告图的同时初始化首页的列表页,当广告展示完成之后列表页也就渲染完成了