SOT热更补丁生成是高度自动化的,设想一下,生成差异补丁是需要两个版本的代码,一个是已上线APP的代码,一个是本地修改过的代码,更准确地说是依赖它们编译的中间结果,所以需要对编译工具和流程做一些改变,这个只需要做一次。另外对于项目,需要特殊的编译设置,没有设置的Target不会受到任何影响,也无法对它热更,对需要热更的Target,需要添加一些编译选项。以示例工程「 ShipOTDemo 」为例,该工程可从github下载,包含两个Target,一个是主Target名为ShipOTDemo,一个是Swift代码的Framework,按下面步骤修改:
「 下载SOT的SDK 」,解压至随意目录,如本例是/Users/sotsdk-1.0
安装Xcode 12,替换clang, libtool, swift编译工具,选择自动
/ 手动
的方式,对所有项目通用,只需要做一次:
自动: 在terminal运行命令:sh /Users/sotsdk-1.0/compile-script/install.sh
, 会把SDK目录compile-script下的clang, libtool, swift等脚本安装到本地编译工具链里,需要输入root密码。
如果有报错,则可能是xcrun命令错误,需要先运行一下xcode-select --install
安装xcode命令行工具,然后运行
sudo xcode-select --switch Xcode.app的路径
,把”xcode.app的路径“改成你mac上的xcode的路径,例如我的是/Applications/Xcode.app。再运行install.sh脚本即可。
可以自己检查一下是否安装成功,命令行运行:xcrun --find sot_link.sh
,例如我的会得到结果
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/sot_link.sh,进入到该目录还能看到其余安装进去的脚本:
xcrun --find clang
得到clang的路径,clang所在目录即为编译工具链目录;
sudo chmod +x clang
sudo chmod +x clang_origin
sudo chmod +x swfit
sudo chmod +x swfit_origin
sudo chmod +x libtool
sudo chmod +x libtool_origin
sudo chmod +x swift-frontend
sudo chmod +x swift-frontend_origin
修改编译工具链不会影响正常项目的编译,假如不想接入SOT SDK了,运行compile-script下的uninstall.sh就能恢复,如在命令行输入sh /Users/sotsdk-1.0/compile-script/uninstall.sh
。
将sdk里project-script/sotconfig.sh复制一份到项目根目录下:
添加热更需要的编译选项,添加SOT虚拟机静态库等,步骤如下:
-sotmodule $(PRODUCT_NAME) /Users/sotsdk-1.0/libs/libsot_free.a -sotsaved $(SRCROOT)/sotsaved/$(CONFIGURATION)/$(CURRENT_ARCH) -sotconfig $(SRCROOT)/sotconfig.sh
,每个选项的意义如下:
/Users/sotsdk-1.0/libs/libsot_free.a
是SOT虚拟机静态库的路径,例子的Debug模式下链接的是本地版的虚拟机-sotmodule $(PRODUCT_NAME) -sotconfig $(SRCROOT)/sotconfig.sh
,假如Target没有swift代码,则不需要往Other Swfit Flags添加。最终结果如下:
SDK里提供了一个便利脚本,路径在sdk目录的project-script/sot_package.sh,它会把生成的补丁拷贝到Bundle文件夹下。如果有多个Target需要生成补丁,像示例工程有两个Target,都配置了热更,则会为两个Target分别生成补丁放到sotsaved对应目录下,sot_package.sh脚本会把两个补丁合并成一个再拷贝。添加步骤如下:
脚本内容为:sh /Users/sotsdk-1.0/project-script/sot_package.sh "$SOURCE_ROOT/sotconfig.sh" "$SOURCE_ROOT/sotsaved/$CONFIGURATION" ShipOTDemo SwiftTest
sot_package.sh脚本的第一个参数是项目的sotconfig.sh的路径,第二个参数是配置的sotsaved的目录,从第三个参数开始,是前面设置的sotmodule的名字,如果有多个则空格隔开,如本例有ShipOTDemo和SwfitTest。
链接libz.tbd
和libc++.tbd
还是在这个页面下,打开Link Binary With Libraries页,加入下面这两个库
在代码里调用API:[SotWebService ApplyBundleShip]
,该代码被调用后,会去Bundle里找到补丁文件并加载补丁,实现热更。如本例子是在点击了按钮后,在ViewControler.m文件的SotUpdate函数里加载补丁,需要引用SDK头文件,本例是#import "/Users/sotsdk-1.0/libs/SotWebService.h"
,至此项目配置完成。
按上面配置完之后,还需要控制sotconfig.sh的开关,否则编译出来的APP是无法热更的,SOT热更流程分为两部分,一部分是热更注入,一部分是生成补丁。
打开sotconfig.sh,里面有两个开关,EnableSot和GenerateSotShip:
如果项目出现了BUG,那么需要生成热更补丁,步骤如下:
本地版只支持加载Bundle里的补丁,用于本地测试开发是没有问题的。启动APP,首先点击下面的Run按钮,可以看到下面文本框输出hello SOT,
回到Xcode修改RunDemoCode函数里的此处代码,例如改成别的文本,hello world:
生成补丁。启动APP,点击run按钮,还是输出hello SOT。此时点击Sot Sync按钮则会ApplyBundleShip接口,控制台会看到类似日志输出:
如图表明有1个module成功加载了补丁,是ShipOTDemo这个module,此时再点击run按钮,发现文本框输出的是hello world:
测试通过后,如果使用了网站版SDK,就是把这个补丁上传到本网站,已上线APP通过网络下载补丁,具体看「 网站版 」的接入。
不是所有新加的代码都能够生效,举个例子来说,如果调用了老代码没有调用过的函数,就可能不会生效。这个Demo工程只是用来演示的,原本的代码量很少,不用对其做过多测试。具体什么能热更生效,什么不能,参看文档「 热更能力 」。
有任何问题可以到「 github发issue 」,我们会统一解答,也方便其他人看到。