源码下载
https://github.com/WebKit/WebKit
源码编译
- 打开
WebKit.xcworkspace
工程,然后 File->Workspace Settings 点击 Advanced 按钮选择 Custom, "Relative to Workspace" 并在输入框输入WebKitBuild
- 在下载的 WebKit 目录里面有一个
Tools
目录,这里面有各种脚本,包括使用命令行编译 WebKit 的脚本,其中一个重要的脚本就是 configure-Xcode-for-embedded-development,在 Mac 终端控制台运行如下命令:
sudo Tools/s/configure-Xcode-for-embedded-development
之所以需要执行这个脚本,是因为 iOS 属于嵌入式平台,编译嵌入式平台的 WebKit 需要用到一些命令行工具,Xcode 正是利用该脚本构建这些命令行工具。否则,在编译诸如 JavaCore 等工程的时候,就会报如下错误:‘com.apple.product-type.tool’, but there’s no such product type for the embedded platform,找不到对应的架构。
- 先使用命令行把XCode编译需要的文件同步到
WebKitBuild
目录下,否则使用XCode编译会报错。在命令行执行如下代码
Tools/Scripts/build-webkit --debug --<platform>-simulator
这里platfor
为ios,tvos 或 watchos。 真机使用如下命令
Tools/Scripts/build-webkit --debug --<platform>-device
上面命令行执行可能失败,不过没关系, 这里主要是利用这个命令来同步相关文件,帮助后续使用XCode编译。
编译问题
-
编译
WebKit
报错-
'pthread_jit_write_protect_np' is unavailable: not available on iOS
由于该方法在iOS不支持,直接注释掉错误行。 -
PaymentAuthorizationPresenter
编译出错, 找到USE_PASSKIT 定义注释掉该行,Clean Build 重新编译。
-
-
编译
WebKitLegacy
报错-
'objc/objc-class.h' file not found
与'objc/objc-runtime.h' file not found
直接注释该行
-
-
编译
WebCore
报错-
'objc/objc-runtime.h' file not found
直接注销该行 -
'libxslt/transform.h' file not found
使用brew install libxslt
安装, 然后在targets -> build settings -> header search paths 增加相应头文件路径/opt/homebrew/opt/libxslt/include
-
No member named 'ApplePayLater' in 'WebCore::ApplePayFeature'
在PlatformEnableCocoa 文件中查找ENABLE_APPLE_PAY_
相关的定义全部注释掉,在Platform中查询HAVE_PASSKIT
相关定义全部注释掉 ,Clean Build 后重新编译。不过这样禁止了AppPay相关的东西。 -
Cannot pass non-trivial object of type 'WebCore::SimpleRange' to variadic function; expected type from format string was 'void *'
直接注释掉。
-
结尾
经过上述处理后,xCode已经可以编译通过, 使用命令行已可以编译通过。不过最后在调试时代码运行就Crash, 看报错原因是由于内存JIT内存访问导致。因此需要把 pthread_jit_write_protect_np
这个行注释的代码打开在使用命令行重新编译,就可以正常调试