动态库转静态库

04/22/2023 20:47 下午 posted in  Cocoapods

把动态库转静态库,减少了动态库数量,除了可以减小加载动态库阶段的耗时,还能额外减少包大小。
并不是所有的动态库都适合转成静态库。实践中发现,如果库中有Resources文件夹,最好不要转换。转换后Bundle发生了变化,有些资源就会访问不到。当然也有解决方案:把动态库的资源都拷贝到Main Bundle中,这样也会有其它方面的问题,不在这里叙说。
项目中的动态库都是Pods管理的,选择我们使用的库,然后点击Build Settings->找到Mach-O Type修改为Static Library。

目前的动态库很少,可以手动修改。如果动态库多,可以在Podfile里面添加下面的代码,然后执行pod install。
#填写不需要转换成静态库的动态库名字,这个需要我们手动排查。

dynamic_frameworks = ['AMSMB2','MJRefresh','IJKMediaFramework','UnrarKit']
post_install do |installer|
  installer.pods_project.targets.each do |target|
      if dynamic_frameworks.include?(target.name)
          next
      end
      target.build_configurations.each do |config|
        config.build_settings['MACH_O_TYPE'] = 'staticlib'
      end
  end
end

从Targets Support Files中找到Pods-NXPlayer-frameworks.sh脚本,把需要转换成静态库的行都注释掉。已经转换成静态库了,没有必要再往NXPlayer.app/Frameworks在拷贝一份。

if [[ "$CONFIGURATION" == "Debug" ]]; then
  install_framework "${BUILT_PRODUCTS_DIR}/AMSMB2/AMSMB2.framework"
#  install_framework "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework"
#  install_framework "${BUILT_PRODUCTS_DIR}/FilesProvider/FilesProvider.framework"
#  install_framework "${BUILT_PRODUCTS_DIR}/GCDWebServer/GCDWebServer.framework"
#  install_framework "${BUILT_PRODUCTS_DIR}/MBProgressHUD/MBProgressHUD.framework"
  install_framework "${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework"
#  install_framework "${BUILT_PRODUCTS_DIR}/PLzmaSDK/PLzmaSDK.framework"
#  install_framework "${BUILT_PRODUCTS_DIR}/SQLite.swift/SQLite.framework"
#  install_framework "${BUILT_PRODUCTS_DIR}/SSZipArchive/SSZipArchive.framework"
#  install_framework "${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework"
  install_framework "${BUILT_PRODUCTS_DIR}/UnrarKit/UnrarKit.framework"
fi
if [[ "$CONFIGURATION" == "Release" ]]; then
  install_framework "${BUILT_PRODUCTS_DIR}/AMSMB2/AMSMB2.framework"
#  install_framework "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework"
#  install_framework "${BUILT_PRODUCTS_DIR}/FilesProvider/FilesProvider.framework"
#  install_framework "${BUILT_PRODUCTS_DIR}/GCDWebServer/GCDWebServer.framework"
#  install_framework "${BUILT_PRODUCTS_DIR}/MBProgressHUD/MBProgressHUD.framework"
  install_framework "${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework"
#  install_framework "${BUILT_PRODUCTS_DIR}/PLzmaSDK/PLzmaSDK.framework"
#  install_framework "${BUILT_PRODUCTS_DIR}/SQLite.swift/SQLite.framework"
#  install_framework "${BUILT_PRODUCTS_DIR}/SSZipArchive/SSZipArchive.framework"
#  install_framework "${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework"
  install_framework "${BUILT_PRODUCTS_DIR}/UnrarKit/UnrarKit.framework"
fi

网络上关于冷启动和热启动的讨论很多,App要在冷启动的情况下,测试时间才是准确的。测试不能以一次时间为准,要多几次并取平均值。具体如下:
每测试完一次需要:卸载App,退出Instruments,退出Xcode。
再次测试需要:打开Xcode,按快捷键command + i,会自动安装App并启动Instruments,点击App Launch进行测试。
本文在转静态库之前进行了6次,总耗时12.35秒;转静态库之后进行了6次,总耗时9.112秒。时间虽然相差很少,但也算是优化了启动时间。