美文网首页
JavaScriptCore iOS真机编译和调试

JavaScriptCore iOS真机编译和调试

作者: 俞子将 | 来源:发表于2022-11-28 14:08 被阅读0次

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

下载代码

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

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

编译

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

  • 把官方WebKit下的Tools目录完整拷贝过去。
  • 建个workspace,把JavaScriptCorebmallocWTF三个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也没有优势。
  • 也是开源的,可以自己魔改。

参考

WebKit
Just-in-time Compiler in JavaScriptCore

相关文章

网友评论

      本文标题:JavaScriptCore iOS真机编译和调试

      本文链接:https://www.haomeiwen.com/subject/vkwlfdtx.html