iOS组件化二进制化

8/21/2017 iOS

随着组件越来越多,壳工程打包依赖的组件每次都要重新编译,为了提高编译速度,将组件进行二进制化势在必行。而我们App是从8.0开始支持。所以我们组件二进制化采用static library和部分dynamic framework的方式。

# 组件二进制方案

  • 多仓库模式管理:源码使用一个仓库,framework、static library使用一个仓库,或者和framework、static library集中使用一个仓库,通过subspec管理。缺点:需要额外维护仓库
  • podspec宏管理:podspec部分代码如下,根据命令环境IS_SOURCE来决定是用源码还是framework、static library
if ENV['IS_SOURCE']
    s.source_files = [
      'MFSIdentifier/*.{h,m}',
      'MFSIdentifier/**/*.{h,m}'
    ]
  else
    s.source_files = 'SDK/**/*.{h}'
    s.ios.vendored_frameworks = 'SDK/*.framework'
  end
1
2
3
4
5
6
7
8
9

缺点:在切换源码和framework、static library的时候会切换算有的组件,不能单独切换某个组件

  • 单仓库、多podspec文件管理:在组件中增加一个目录存储发布framework的podspec和framework, 一个目录存储static library的podspec和.h .a文件,发布时使用不同的podspec文件。一般只发布framework、static library,源码直接用git地址做调试。(最好是发布一个源码一个framework的版本,通过Version后缀区分,但fastlane修改podspec版本命令目前不指定后缀,所以暂时没有实现)

我们采用第三种方式,未来fastlane若支持版本号可以带后缀,可以升级framework和源码的切换方法。

# 组件模板的变化

为了更好支持组件二进制化,对组件模板进行了一下修改:

  • 增加lib目录,里面增加NAME.podspec, 发布static Library时使用此podspec进行发布
  • 增加fmk目录,里面增加NAME.podspec,发布Framework组件时使用此podspec进行发布
  • fastlane目录中的Fastfile文件增加publish_fmk和publish_lib命令,用来发布framework和static library组件,用法和publish命令一样。fastlane publish_fmk version:1.1.0, fastlane publish_lib version:1.1.0
  • 其他ruby脚本修改等。

# 组件项目的变化

使用组件模板创建新组件后会在Example项目中增加FMK Podspec Metadata目录,里面为上一步组件模板中提到的发布framework组件使用的podspec,发布framework组件时根据修改进行更改。 component-project

component-lib-podspec

component-fmk-podspec

# 发布命令的变化

  1. 发布framework组件使用新的发布命令:fastalne publish_fmk version:1.1.0, 发布static library组件使用新的发布命令:fastalne publish_lib version:1.1.0, 旧的fastalne publish version:1.1.0依然可以使用,组件发布为源码。
  2. build_framework命令调整,调整为build_fmk和build_lib,目标二进制文件到fmk和lib目录。

# 发布过程的变化

framework发布过程如下: component-fmk-publish

主要增加了一下步骤:

    1. 修改fmk目录下的podspec文件,修改version
  • 13、14、15切换到build_framework命令进行archive和build,然后将二进制文件合并,最后放到fmk目录
  • 使用fmk目录下的podspec进行发布

static library发布过程类似。

# 组件使用的变化

组件framework后,若需要对组件进行调试,可以切换到源码模式,可以在Podfile中设置git路径切换到源码。

Last Updated: 1/15/2023, 2:48:14 PM