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

news2024/11/25 12:50:18

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就可以了。

执行之后目录是这样的:

 

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

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

4. 插件命令

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

4.1 options

插件的配置参数介绍。

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

pod jxedt options --help

获取使用插件的简单配置

pod jxedt options --config

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

4.3 user

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

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

具体而言:

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

查看user命令介绍:

pod jxedt user --help

4.4 binary

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

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

查询binary命令

pod jxedt binary --help

4.4.1 build

编译源码组件为二进制。

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

pod jxedt binary build --help

4.4.2 clean

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

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

pod jxedt binary clean --help

4.4.3 code

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

两个参数:

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

pod jxedt binary code --help

4.4.4 fetch

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

pod jxedt binary fetch --help

4.4.5 push

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

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

pod jxedt binary push --help

4.4.6 sourceProject

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

pod jxedt binary sourceProject --help

4.4.7 statistics

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

pod jxedt binary statistics --help

5. 反馈

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

如果你有插件使用的问题或者有其他的疑惑,可以直接在我们提供的Demo工程下提交issue,我们看到了会尽快反馈。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/613121.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

restTemplate转发Https请求

代码架构 package com.http.controller;import com.http.RestTemplateConfig; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework…

Vercel部署个人博客

vercel 部署静态资源网站极其方便简单&#xff0c;并且有可观的访问速度&#xff0c;最主要的是免费部署。 如果你还没有尝试的话&#xff0c;强烈建议去使用一下。 演示博客演示http://202271.xyz/?vercel vercel 介绍 注册账号 进入Vercel官网https://vercel.com&#x…

Android studio安装教程(图文详解,简单搞定)

一 下载 根据自己计算机选择对应版本点击下载 https://developer.android.google.cn/studio 二 安装Android Studio Android Studio 是Google提供的一个Android开发环境&#xff0c;基于IntelliJ IDEA类似 Eclipse ADT&#xff0c;他集成了Android 所需的开发工具。需要注意…

RocketMq的集群的搭建(2主2从异步复制集群模式)

一 RocketMq集群搭建 1.1 说明 本案例采用2m-2s-async的方式搭建集群。 实际项目中&#xff0c;为了达到高可用&#xff0c;一般会使用dleger。 https://blog.csdn.net/wssc63262/article/details/126003507 1.2 集群规划说明 集群规划说明&#xff1a; nameserver是一个…

机器学习——集成学习(装袋法Bagging、提升法Boosting、梯度提升决策树GBDT、随机森林RF)

集成学习 集成学习通过构建并结合多个学习器来完成学习任务 集成方法是用多种学习方法的组合来获取比原方法更优的结果 使用于组合的算法是弱学习算法 即分类正确率仅比随机猜测略高的学习算法 但是组合之后的效果仍可能高于强学习算法 即集成之后的算法准确率和效率都很高…

# 车载软件架构 —— 闲聊几句AUTOSAR OS(三)

我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕的就是把别人的眼光当成自己生活的唯一标准。到最…

程序员从0到收获心仪offer,我靠训练营实现了180度逆袭!

我相信&#xff0c;在未来的职场中&#xff0c;我也能通过这段时间养成的学习习惯和生活习惯让自己一步步成为更好的自己&#xff0c;以自己为荣 我在大学里主修计算机科学与技术&#xff0c;一个普通的院校&#xff0c;一个算是常见的专业&#xff0c;我知道我的学历和一些其他…

Tomcat的部署(贼详细)

目录 一、Tomcat服务器简介 1、Tomcat服务器 2、Tomcat三大核心组件 3、 Java Servlet 4、JSP全称Java Server Pages 5、 Tomcat 功能组件结构 6、 Container 结构分析 7、Tomcat 请求过程 二&#xff1a;Tomcat部署与安装 1.关闭防火墙&#xff0c;上传所需软件包 2.安…

前端、后端工程师学习路线

学习的平台推荐 视频平台&#xff1a; 慕课&#xff1a;http://www.imooc.com/ 腾讯课堂&#xff1a;https://ke.qq.com/ 教程平台 菜鸟&#xff1a;https://www.runoob.com/ W3&#xff1a;https://www.w3school.com.cn/ yibai&#xff1a;https://www.yiibai.com/ 前端学习路…

c++—STL(六大组件)

一、STL概述 1. STL概述 &#xff08;1&#xff09;STL定义&#xff1a;STL&#xff08;standard template library&#xff09;&#xff0c;标准模板库&#xff0c;是一个高效的c程序库&#xff0c;重在提高了代码的复用性&#xff1b;主要包含了常用的数据结构和基本算法&am…

一分钟学一个 Linux 命令 - mkdir 和 touch

前言 大家好&#xff0c;我是god23bin。欢迎来到《一分钟学一个 Linux 命令》系列&#xff0c;今天需要你花两分钟时间来学习下&#xff0c;因为今天要讲的是两个命令&#xff0c;mkdir 和 touch 命令。前一个命令是操作目录的&#xff0c;后一个命令是操作文件的。 建议学完手…

蓝桥杯STC15F2K60S2单片机 CCP/PCA/PWM模块的学习与使用

有道是“一花独放不是春&#xff0c;万紫千红春满园” 我们不能只满足于 眼前所谓的 “够用、能用” 的少量知识&#xff0c;而不去深入学习探究&#xff0c;进而不慎封锁了自己的见识 和 更多 创新开发上的可能性。 曾经仅满足于学习了蓝桥杯单片机的三个外部晶振 定时器&am…

日撸java三百行day58-59

文章目录 说明Day58 符号型数据的 NB 算法1.基础理论知识1.1 条件概率1.2 独立性假设1.3 Laplacian 平滑 2. 符号型数据的预测算法跟踪2.1 testNominal()方法2.1.1 NaiveBayes 构造函数2.1.2 calculateClassDistribution()2.1.3 calculateConditionalProbabilities()方法2.1.4 …

D*算法详解 (D星算法 / Dynamic A*算法/ Dstar算法)(死循环解决)【编辑中】

所需先验知识&#xff08;没有先验知识可能会有大碍&#xff0c;了解的话会对D*的理解有帮助&#xff09;&#xff1a;A*算法/ Dijkstra算法 何为D*算法 Dijkstra算法是无启发的寻找图中两节点的最短连接路径的算法&#xff0c;A*算法则是在Dijkstra算法的基础上加入了启发函数…

【linux下一次复制cp多个文件】

linux下一次复制cp多个文件 linux cp 参数说明 -a&#xff1a;此选项通常在复制目录时使用&#xff0c;它保留链接、文件属性&#xff0c;并复制目录下的所有内容。其作用等于dpR参数组合。 -d&#xff1a;复制时保留链接。这里所说的链接相当于Windows系统中的快捷方式。 -f&…

使用可上网的服务器作为网关,实现另一台服务器上网

文章目录 物理条件方法一&#xff1a;不使用交换机方法二&#xff1a;使用交换机 配置步骤查看网络状态设置静态IP将服务器A设置成网关重新启动各服务器网卡设置主机名 参考资料 本文的目标是利用一台可以上网的服务器作为网关&#xff0c;使在同一局域网中的所有服务器都可以上…

如何安装多个node版本(不使用nvm)

1、选择node安装的路径 例如&#xff1a;D:\Program Files\nodejs 2、下载要安装的对应版本的zip格式的node安装包 例如&#xff1a;下载16.14.2 和 13.14.0 两个版本的zip格式的node安装包&#xff0c;node版本下载地址https://nodejs.org/dist/ 3、安装包解压到对应文件夹…

遥感云大数据在灾害、水体与湿地领域典型

近年来遥感技术得到了突飞猛进的发展&#xff0c;航天、航空、临近空间等多遥感平台不断增加&#xff0c;数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量猛增&#xff0c;遥感数据已经越来越具有大数据特征。遥感大数据的出现为相关研究提供了前所未有的机遇&#xf…

路径规划算法:基于JAYA优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于JAYA优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于JAYA优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法JAYA…

深入理解深度学习——正则化(Regularization):对抗训练(Adversarial Training)

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 在许多情况下&#xff0c;神经网络在独立同分布的测试集上进行评估已经达到了人类表现。因此&#xff0c;我们自然要怀疑这些模型在这些任务上是否获得了真正的人类层次的理解。为了探索网络对底层任务的理解层次&…