在为原工程接入SOT之后(参考「 网站版 」),通过配置sotconfig.sh来控制生成能够热更的APP或者是生成补丁,本文介绍有哪些配置,并解释热更编译输出到控制台的信息,便于开发者遇到问题时解决问题。
SDK的project-script目录下的sotconfig.sh,内容如下所示:
其中未注释的有2行变量,分别是:
强烈建议接入「 网站版 」体验一下。
SOT主要是通过比对代码生成补丁的,但也可以人为指定某些函数生成补丁。通过强制为某些函数生成补丁,让它运行在SOT虚拟机中来实现加固混淆,又或者是SOT自动比对出问题了等等,配置给了开发者手动指定的能力。
在sotconfig.sh内容里 可以看到类似xxxxxxxxxx_MODULENAME=("symbol1" "symbol2" "[\s\S]*")
,意思是这条配置是针对MODULENAME的,这个就是当时在工程里配置的sotmodule的名字,例如ForceFixFunc_Inject_ShipOTDemo
是针对ShipOTDemo的。
配置的("symbol1" "symbol2" "[\s\S]*")
意思是它的值有3个,分别是symbol1
, symbol2
, [\s\S]*
,它们需要用空格隔开,[\s\S]*
是正则匹配的规则,意思是匹配所有的字符串。正则匹配用c++的regex库做的,需要参考这个库的正则语法。
下面解释几个module配置的用途:
UnlinkSymbols_ShipOTDemo=("xxxfunc")
即可。
例如想要加固混淆ShipOTDemo下命名开头为encrypt的函数,那么配置ForceFixFunc_Inject_ShipOTDemo=("encrypt[\s\S]*")
和ForceFixFunc_Ship_ShipOTDemo=("encrypt[\s\S]*")
,那么就可以了。假如发现误伤了函数encrypt_abc,不想加固它,第一种办法是修改正则语法,第二种办法是增加配置ForceNoFixFunc_Inject_ShipOTDemo=("encrypt_abc")
和ForceNoFixFunc_Ship_ShipOTDemo=("encrypt_abc")
。
在默认情况下,SOT会把整个Target的代码文件都加入到热更编译中,但有的用户可能不想将某些文件加入热更编译,因为他知道这些文件的代码不会有Bug,并且未来也不打算修改里面的代码,所以将它们剔除也不会影响项目的热更。同时因为剔除了它们,SOT的编译速度也会变快,包体增大的程度也会减小。
从1.13版本开始,增加了白名单和黑名单的机制,用来精确控制哪些文件被加入热更编译,它们在sotconfig.sh文件中配置。
默认是注释掉的,把前面的#去掉即可启用。WhiteList_MODULENAME是白名单,BlackList_MODULENAME是黑名单,启用时把MODULENAME改成真正的Target的名字,也就是配置编译时添加的-sotmudole后的名字,例如配置的是-sotmodule Demo,那么使用白名单就改成WhiteList_Demo。
=后面就是添加文件名列表,不用包含路径,只是文件名,也不要填写后缀名,例如文件完整路径是/User/xxx/project/abc.swift,那么这里填"abc"就可以了,多个文件名用空格隔开。
启用白名单意思是只把该列表里的文件加入到SOT热更编译。黑名单意思是列表里的文件不加入SOT编译,别的都加入SOT热更编译。两种模式只能启用其中一种,同时启用的情况下,只有白名单配置是生效的。
这个配置在热更注入和生成补丁时要保持一致,否则将会生成错误的补丁。
另外需要强调的是,生成补丁时如果使用了一些类或者变量,但这些类或者变量之前没在热更编译的文件中使用过,例如被黑名单剔除了,那么补丁也是无法访问,生成会报错。
为了方便大家快速枚举某个文件夹下所有的源文件的文件名,写了一个脚本,放在SDK目录/project-script/find_all_files.sh。使用方式就是在Terminal中调用sh SDK目录/project-script/find_all_files.sh 代码目录路径,就会打印该代码目录中所有源文件名字,然后复制到白名单或者黑名单配置里就可以了。例如:
然后添加到sotconfig.sh里即可:
启用EnableSot=1时,Xcode编译时,控制台会输出额外的信息,当出现问题时,开发者可以通过这些信息定位问题。
被热更的Target的.m或者.mm文件,它们编译输出日志里会有run sot clang compile
字样,说明成功使用了SOT编译工具,对这些文件进行热更编译了。
Swift文件则有run sot swift compile for module
字样。
热更编译的信息主要出现在链接日志里,每个Target都有对应的一个链接日志,如下图的ShipOTDemo Target:
展开后有非常多的信息,首先是生成补丁(ship)的信息,如下图:
每个条目的意义如下:
然后是热更注入的信息,如下图:
每个条目的意义如下: