美文网首页
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