app启动速度分
mian()
函数之前和main()
函数之后,其中main()
函数之前的流程大概有以下几个:
- dyld动态库加载
- rebase,调整镜像内部指针,因为有“地址动态空间布局随机化”
- binding,修复指向外部的指针,比如app调用打印NSLog,需要找到NSLog指针地址进行调用
- objc setup:runtime初始化,class和sel注册,sel唯一性确认
- load&constructor&initialize,调用所有load方法,初始化C&C++的静态化变量
本文主要讨论动态库优化问题
- 减少动态库数量,苹果官方建议使用自定义的动态库不超过6个
- 转静态库
在我看来,目前比较有效就是profile文件去掉user_framework
,可以达到pod进来的第三方库全部为静态库,对于个别需要动态库编译的,可以特殊处理,代码如下:
#创建需要进行处理的动态库的数组
needStaticAry = Array['AFNetworking', 'AppOrderFiles', 'BeeHive', 'CTMediator', 'DateTools', 'EasyNavigation','FSCalendar','IQKeyboardManager','JDStatusBarNotification','JKCategories','JXCategoryView','JXPagingView','MBProgressHUD','MJExtension','MJRefresh','Masonry','PlatformJSBridgeManager','RSAEncryptor','ReactiveObjC','SDAutoLayout','SDCycleScrollView','SDWebImage','TYCyclePagerView','TZImagePickerController','UITableView+FDTemplateLayoutCell','WebViewJavascriptBridge','XQYContractSDK','YYKit','dsBridge']
#这个hooks允许,你在生成xcode project写入硬盘前做最后的改动
post_install do |installer|
#获取所有的target,包括静态库h和动态库
installer.pods_project.targets.each do |target|
#打印所有的target,这里的target是一个对象,获取名字需要用target.name
puts " ||-#{target}"
needStaticAry.each do |staticTarget|
if target.name == staticTarget
target.build_configurations.each do |config|
#将mach-o改为静态库
config.build_settings['MACH_O_TYPE'] = "staticlib"
end
end
end
end
end
检查成功与否: