大幅提升iOS编译速度的cocoapods二进制化插件介绍

这篇具有很好参考价值的文章主要介绍了大幅提升iOS编译速度的cocoapods二进制化插件介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 背景

驾校一点通iOS项目是采用是cocoapods来管理组件的,又经过多年的组件化发展,目前组件已经达到了120+的数量。在这种组件规模下,主工程的打包时间也从最开始的几分钟增加到十几分钟(M1)、二十几分钟(Intel)。而且在频繁切换分支开发的场景下,每次编译的耗时成了制约团队效率的重要问题。

基于上述原因我调研了行业内编译提速的方案,发现或多或少存在着一些问题。

所以我结合自己的业务场景,抽象出了一些需求。开发出了一款使用简单,不改变cocoapods使用习惯,适用大部分iOS开发场景的cocoapods插件(cocoapods-jxedt)。

2. cocoapods-jxedt插件介绍

我们开发的插件叫做cocoapods-jxedt。是结合作者多年的iOS一线开发经验和复杂的业务场景,总结产出的一个支持pod组件二进制化的cocoapods插件。

开发者只需要简单的在Podfile文件中做一些简单配置,就可以完成组件二进制化的操作。本质是预编译源码为二进制,hook cocoapods的执行过程,将源码依赖修改为二进制依赖,以提升编译速度。

使用本插件,只需要了解我们提供的插件配置参数,不需要你改变cocoapods的使用习惯,正常使用 pod installpod update 命令。

插件的功能和亮点

  • 支持pod使用library静态库的工程
  • 支持framework和xcframework
  • 支持clang module(支持swift、混编)
  • 同时支持Debug和Release两个环境的二进制
  • 非常简单的切换源码和二进制(不用清除pod文件夹)
  • 兼容#import "..."#import <...> 方式的头文件引用
  • 提供快速修改头文件引用的命令,pod jxedt headerfix,快速支持使用use_frameworks!
  • 支持静态库的resources中包含xib、xcdatamodeld格式文件的场景(这类文件需要编译)
  • 支持二进制pod组件版本控制,支持非tag依赖的pod组件版本控制
  • 支持组件二进制远程缓存(使用git仓库做二进制文件的缓存,不需要配置静态资源服务器)
  • 支持二进制调试的功能
  • 提供了许多提效的插件命令
  • 不改变cocoapods的使用习惯,正常使用 pod installpod update

目前,本插件还未开源,但是我们已经发布gem到rubygems.org,可以使用gem来进行安装。你现在可以使用我们的Demo工程来体验一下插件。

在插件的开发过程中,我研读了许许多多优秀的二进制化的方案,也借鉴了各位前辈的一些思想,最终完成了这个支持大部分iOS开发场景的插件。在这里感谢这些开源作者,感谢各位的辛勤付出。

这些优秀的文章或插件有:

  1. cocoapods-binary
  2. cocoapods-binary-cache
  3. 火掌柜iOS端基于CocoaPods的组件二进制化实践
  4. iOS编译速度如何稳定提高10倍以上
  5. Pod二进制化(作业部落)
  6. 从预编译的角度理解Swift与Objective-C及混编机制

3. 插件的安装和使用

安装

$ gem install cocoapods-jxedt

使用

直接在Podfile中新增下面的方法就可以开启插件

use_frameworks! :linkage => :static
# use_modular_headers!

plugin 'cocoapods-jxedt'
options = {
    'all_binary': true, # 所有组件开启binary
    'keep_source_project': true, # 保留源码pod工程,所在目录`Pods-Source`
    'excluded_pods': [], # 排除binary的组件名称
    'framework_header_search_enabled': true, # 兼容头文件引用`#import "xxx.h"`
    'configurations': ['Release'], # 支持的configurations ['Release', 'Debug']
    'device_build_enabled': true, # 真机
    'simulator_build_enabled': false # 模拟器
}
cocoapods_jxedt_config(options)

或者执行我们提供的命令

pod jxedt options

pod jxedt options --config

pod jxedt options --more-config

来获取插件的配置参数介绍和基础配置。

另外,也可以查看我们提供的Demo工程来尝试使用。

按照上面的配置参数配置好Podfile文件,就可以使用插件的功能了,现在快乐的去执行pod install就可以了。

执行之后目录是这样的:

大幅提升iOS编译速度的cocoapods二进制化插件介绍

 大幅提升iOS编译速度的cocoapods二进制化插件介绍

看到文章的这里,你应该已经可以正常使用我们提供的的插件了。

另外插件也提供了一些插件命令,是作者在实际开发中遇到问题的总结,感兴趣的话可以继续阅读,相信阅读完之后能加深对插件的认识。

4. 插件命令

我们总结了真实开发场景的一些问题,提供了一些操作的命令。主要是针对单工程而言,命令大部分都需要再Podfile所在目录执行。

4.1 options

插件的配置参数介绍。

通过此命令可以快速的了解本插件支持哪些配置参数以及每个配置参数的意义

pod jxedt options --help

大幅提升iOS编译速度的cocoapods二进制化插件介绍

获取使用插件的简单配置

pod jxedt options --config

大幅提升iOS编译速度的cocoapods二进制化插件介绍

4.2 headerfix

我们提供的快速修改头文件的命令,此命令也可以在不使用插件二进制功能的情况下使用。

具体而言:

  1. 假设你有自己的组件PodA,它依赖了AFNetworking和YYImage等三方组件
  2. 你在PodA中引用头文件的方式为 #import "AFNetworking.h"#import "YYImage.h",这种引用头文件的方式在使用library的时候cocoapods是支持的,但是如果你需要修改为use_frameworks!或支持混编的时候这样的引用就存在问题了。
  3. 使用 pod jxedt headerfix 命令可以自动分析出组件的依赖,然后修改"AFNetworking.h"或<AFNetworking.h>这种头文件引用方式为 #import <AFNetworking/AFNetworking.h>,并且我们会输出修改日志,你也可以对比日志的修改内容来查看结果

查看headerfix命令介绍

pod jxedt headerfix --help

大幅提升iOS编译速度的cocoapods二进制化插件介绍

4.3 user

这个是我们提供的快速创建用户目录的一个命令。创建的目录为/Users/cocoapods-jxedt

该命令可以根据自己的需要决定是否使用,我们提供这个命令是来做二进制和源码链接调试的。

具体而言:

  1. 二进制源码调试可以运行的条件是:编译二进制时的源码所在路径存在,二进制断点时就可以跳转到对应的源码。
  2. 基于上面这种特性,如果想在多台电脑上都能调试源码,就要求多台电脑上都存在二进制编译时的路径和源码文件
  3. 一个团队中有很多同学进行开发,每个人的user目录都不尽相同,所以回到我们的命令的功能上,我们就是要保证每个人的电脑上都存在 /Users/cocoapods-jxedt 这个目录。这样,无论哪位开发者编译了二进制,编译时的源码路径都是相同的,二进制调试才能实现。
  4. 执行命令创建目录需要权限,在执行过程中可能需要你输入电脑密码,创建好目录后会把这个目录的权限改为777(任何user都可访问和修改)。

查看user命令介绍:

pod jxedt user --help

大幅提升iOS编译速度的cocoapods二进制化插件介绍

4.4 binary

binary是一个抽象的命令,是二进制操作的命令入口,它下面有许多子命令。

binary下的命令要求配置好插件(Podfile文件中配置好),二进制相关的操作会根据插件配置来执行。

查询binary命令

pod jxedt binary --help

大幅提升iOS编译速度的cocoapods二进制化插件介绍

4.4.1 build

编译源码组件为二进制。

  1. name参数为必要参数,指定编译某个组件。
  2. push、force-push参数是把编译结果推送到二进制git仓库,需要在插件配置中配置
  3. output-path参数是二进制结果的生成路径,默认在Podfile所在目录下的 Pod-Source/.command_build 文件夹下

pod jxedt binary build --help

大幅提升iOS编译速度的cocoapods二进制化插件介绍

4.4.2 clean

清除二进制。因为某些特殊情况需要清除已编译的二进制,可以执行此命令。

  1. name参数指的是删除某个组件
  2. local参数表示只操作本地缓存的组件,对工程而言,不操作git
  3. all参数表示删除所有的已编译二进制组件

pod jxedt binary clean --help

大幅提升iOS编译速度的cocoapods二进制化插件介绍

4.4.3 code

二进制链接源码,用于二进制调试。

两个参数:

  1. link,链接源码
  2. unlink,删除源码链接

pod jxedt binary code --help

大幅提升iOS编译速度的cocoapods二进制化插件介绍

4.4.4 fetch

拉取二进制git仓库缓存的二进制到本地,本身是一个 git pull 的操作,本地路径在 ~/.cocoapods-jxedt/xxx

pod jxedt binary fetch --help

大幅提升iOS编译速度的cocoapods二进制化插件介绍

4.4.5 push

推送本地的二进制组件到二进制git仓库。查看本地已经编译好的二进制文件,压缩成zip文件,名称以checksum值命名,推送到远程仓库。

  1. force-push参数表示如果远程存在相同校验和(checksum)的文件,强制推送

pod jxedt binary push --help

大幅提升iOS编译速度的cocoapods二进制化插件介绍

4.4.6 sourceProject

这个命令是生成当前二进制环境对应的源码工程。这个工程我们在每次pod install时都会生成,但是默认是不保留这个工程的,开发场景中切换为了二进制,而又需要查看源码时,可以通过这个命令恢复源码工程。

pod jxedt binary sourceProject --help

大幅提升iOS编译速度的cocoapods二进制化插件介绍

4.4.7 statistics

二进制组件使用情况的统计。可以通过此命令查看当前工程使用二进制的组件和详细介绍,如果有校验失败的二进制,会有报错信息。

pod jxedt binary statistics --help

大幅提升iOS编译速度的cocoapods二进制化插件介绍

5. 反馈

目前插件暂未开源,我们致力于解决iOS开发编译过程中的痛点,所以我们仍然期待你的反馈。

如果你有插件使用的问题或者有其他的疑惑,可以直接在我们提供的Demo工程下提交issue,我们看到了会尽快反馈。文章来源地址https://www.toymoban.com/news/detail-472609.html

到了这里,关于大幅提升iOS编译速度的cocoapods二进制化插件介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • golang 中使用 statik 将静态资源编译进二进制文件中

    golang 中使用 statik 将静态资源编译进二进制文件中

    现在的很多程序都会提供一个 Dashboard 类似的页面用于查看程序状态并进行一些管理的功能,通常都不会很复杂,但是其中用到的图片和网页的一些静态资源,如果需要用户额外存放在一个目录,也不是很方便,如果能打包进程序发布的二进制文件中,用户下载以后可以直接

    2024年01月19日
    浏览(9)
  • 【Linux操作系统】编译过程中遇到的问题-为什么加-c?执行文件提示无法执行二进制文件?main函数参数argc和*argv[]的作用和理解?

    【Linux操作系统】编译过程中遇到的问题-为什么加-c?执行文件提示无法执行二进制文件?main函数参数argc和*argv[]的作用和理解?

    在使用GCC编译器进行程序开发时,我们经常会遇到一些编译过程中的问题, 比如为什么要加上\\\"-c\\\"选项,以及为什么生成的可执行文件无法执行等问题。 本篇博客将详细介绍这些问题,并给出相应的代码和解释,帮助读者更好地理解GCC编译过程中的\\\"-c\\\"选项和main函数的参数a

    2024年02月12日
    浏览(18)
  • 【十进制 转 二进制】【二进制 转 十进制】10进制 VS 2进制【清华大学考研机试题】

    【十进制 转 二进制】【二进制 转 十进制】10进制 VS 2进制【清华大学考研机试题】

    原题链接 本题我们先需要知道 十进制 如何转 二进制 二进制 如何转 十进制 十进制 如何转 二进制: 十进制转成二进制 例如 173 转成 二进制 就把173 短除法 除到0 然后 得到的余数, 从下往上写 二进制 转成 十进制 利用如图方法,把二进制 转成 十进制 本题是高精度,如何

    2023年04月26日
    浏览(16)
  • 将数据转二进制流文件,用PostMan发送二进制流请求

    将数据转二进制流文件,用PostMan发送二进制流请求

    一、将byte数组转二进制流文件,并保存到本地 byte [] oneshotBytes=new byte[]{78,-29,51,-125,86,-105,56,82,-94,-115,-22,-105,0,-45,-48,-114,27,13,38,45,-24,-15,-13,46,88,-90,-66,-29,52,-23,40,-2,116,2,-115,17,36,15,-84,88,-72,22,-86,41,-90,-19,-58,19,99,-4,-63,29,51,-69,117,-120,121,3,-103,-75,44,64,-58,-34,73,-22,110,-90,92,-35,-18,-128,16,-

    2024年02月15日
    浏览(18)
  • Next.js 13.5 正式发布,速度大幅提升!

    Next.js 13.5 正式发布,速度大幅提升!

    9 月 19 日,Next.js 13.5 正式发布,该版本通过以下方式提高了本地开发性能和可靠性: 本地服务器启动速度提高 22% :使用App和Pages Router可以更快地进行迭代 HMR(快速刷新)速度提高 29% :在保存更改时进行更快的迭代 内存使用量减少 40% :在运行 next start 时测量 优化的包导

    2024年02月08日
    浏览(12)
  • java图片转二进制流_java将文件转化成二进制流

    二进制流的主要编码格式是base64码。可以在网上找一些在线转base64编码的网站进行尝试转换。 例如:http://imgbase64.duoshitong.com/然后通过前端展现和下载。 前端显示二进制流图片(src中放置base64码及二进制流) 前端下载二进制流文件(herf中放置base64码及二进制流,download后面放

    2024年02月06日
    浏览(18)
  • CPU Cache:访问存储速度是如何大幅提升的?

    CPU Cache:访问存储速度是如何大幅提升的?

    我们了解到不同的物理器件,它们的访问速度是不一样的:速度快的往往代价高、容量小;代价低且容量大的,速度通常比较慢。为了充分发挥各种器件的优点,计算机存储数据的物理器件不会只选择一种,而是以 CPU 为核心,由内而外地组建了一整套的存储体系结构。它将

    2024年02月01日
    浏览(12)
  • 后端返回二进制流,前端处理二进制文件流,实现预览图片以及PDF

    后端返回二进制流,前端处理二进制文件流,实现预览图片以及PDF

    1、首先预览PDF需要 后端 将响应头 Content-Type 设置为PDF类型 application/pdf ,不能预览,会直接下载 2、 前端 定义接口:并设置相应类型 responseType 为 blob 请求数据:通过 window.URL.createObjectURL(res) 转成本地预览地址, 在通过 window.open() 方法打开转成本地预览地址即可预览PDF,如下

    2024年02月15日
    浏览(20)
  • Python中二进制十进制转换

            hello大家好,今天我想和大家分享一下在Python中进制转换加减法的方法。         比如现在我们需要求100 + 10,然后需要将结果110以二进制的形式返回,又或者我们现在有一个小需求,就是要计算二进制1010和二进制1011的和是多少,然后依旧以二进制的形式返回

    2024年02月16日
    浏览(50)
  • 【Python 千题 —— 基础篇】进制转换:十进制转二进制

    题目描述 计算机底层原理中常使用二进制来表示相关机器码,学会将十进制数转换成二进制数是一个非常重要的技能。现在编写一个程序,输入一个十进制数,将其转换成二进制数。 输入描述 输入一个十进制数。 输出描述 程序将输入的十进制数转换为二进制数,并输出其

    2024年02月07日
    浏览(18)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包