JavaScriptCore iOS真机编译和调试

2022-11-28  本文已影响0人  俞子将

大家都知道,苹果的JSC是开源的。如果想在真机上调试JavaScriptCore运行逻辑,可以使用本文总结的方法。

下载代码

WebKit的官方开源地址是WebKit,但版本/tag和苹果那边的不一定能对应起来(可能tag创建会比较慢),所以可以使用苹果提供的源码:

当然,如果能在WebKit里能找到对应的tag,还是推荐使用Webdkit的开源库,苹果的开源库只是定期同步版本代码,没有中间git提交记录,也没有编译工具,更没有编译指引、工程文件。

编译

如果是使用的苹果提供的WebKit库,还需要以下步骤:

接下来,按官方指引,执行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:

参考

WebKit
Just-in-time Compiler in JavaScriptCore

上一篇下一篇

猜你喜欢

热点阅读