iOS加快app启动速度——动态库转静态库方法

app启动速度分mian()函数之前和main()函数之后,其中main()函数之前的流程大概有以下几个:

  • dyld动态库加载
  • rebase,调整镜像内部指针,因为有“地址动态空间布局随机化”
  • binding,修复指向外部的指针,比如app调用打印NSLog,需要找到NSLog指针地址进行调用
  • objc setup:runtime初始化,class和sel注册,sel唯一性确认
  • load&constructor&initialize,调用所有load方法,初始化C&C++的静态化变量

本文主要讨论动态库优化问题

  1. 减少动态库数量,苹果官方建议使用自定义的动态库不超过6个
  2. 转静态库

在我看来,目前比较有效就是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

检查成功与否:


image.png

你可能感兴趣的:(iOS加快app启动速度——动态库转静态库方法)