大家都知道,苹果的JSC是开源的。如果想在真机上调试JavaScriptCore
运行逻辑,可以使用本文总结的方法。
下载代码
WebKit
的官方开源地址是WebKit,但版本/tag和苹果那边的不一定能对应起来(可能tag创建会比较慢),所以可以使用苹果提供的源码:
当然,如果能在WebKit
里能找到对应的tag,还是推荐使用Webdkit
的开源库,苹果的开源库只是定期同步版本代码,没有中间git提交记录,也没有编译工具,更没有编译指引、工程文件。
编译
如果是使用的苹果提供的WebKit
库,还需要以下步骤:
- 把官方
WebKit
下的Tools
目录完整拷贝过去。 - 建个workspace,把
JavaScriptCore
、bmalloc
、WTF
三个project拉进去。
接下来,按官方指引,执行Embedded设置:
sudo Tools/Scripts/configure-xcode-for-embedded-development
然后连接真机或选对应的arm64架构,直接编译JavaScriptCore
即可:
替换
我们的目标是替换掉原来的系统的JavaScriptCore
。
先在App的工程里,把编好的JavaScriptCore
库直接拖入,设置好Embed&Sign:
这里还有个问题是,默认framework的搜索路径会先搜索到系统的JavaScriptCore
。我们可以简单用install_name_tool
工具修改下动态库的路径,方法如下:
给工程的Build Phases
里加个Run Script
:
完整脚本如下:
xcrun install_name_tool -change "/System/Library/Frameworks/JavaScriptCore.framework/JavaScriptCore" "@rpath/JavaScriptCore.framework/JavaScriptCore" ${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app/${PRODUCT_NAME}
再次编译,用otool查看编译后的Product,应该可以看到JavaScriptCore
已经是使用的Embed framework
了,而不是使用的/System/Library/Frameworks
系统路径下的库:
调试
调试就简单了,我们有JavaScriptCore
和应用工程这两个工程,使用跨工程调试就行。在JavaScriptCore
工程里设置断点,并把断点移到User空间即可。
其他
编译JavaScriptCore
的初衷是,项目用了些RN的东西,想在端上做些JS层的性能监控,可以用来做些App准出的规范。
但后面想想,基于RN的Hermes JS引擎来搞可能更合适。iOS上也可以直接使用Hermes引擎来替换JavaScriptCore
:
- Hermes可以使用预编译的JS,加载JS更快。
- 动态库压缩后也才1.2m左右,对包大小影响不大。
-
JavaScriptCore
的JIT在我们的App里目前也是开不了的,这点对比Hermes也没有优势。 - 也是开源的,可以自己魔改。