尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Skia 构建完全指南:从 GN 参数到多平台交叉编译

发布时间:2026/9/24 23:59:07

资讯中心
01
ARTICLE

Skia 构建完全指南:从 GN 参数到多平台交叉编译

Skia 构建完全指南:从 GN 参数到多平台交叉编译
图形学【免费下载链接】skiaSkia is a complete 2D graphic library for drawing Text, Geometries, and Images. See documentation for contribution instructions.项目地址https://gitcode.com/gh_mirrors/ski/skia点击查看免费下载本文以官方构建文档 site/docs/user/build.md 为主线结合仓库源码与 GN 配置系统讲解 Skia 的构建体系is_official_build与第三方依赖的取舍、编译器的选择、Quickstart 快速上手以及 Android、ChromeOS、Mac、iOS、Windows、ARM64 与 CMake 等各平台的完整构建流程。读完本文你将掌握 Skia 全平台构建的核心技能并能独立配置出适合生产发布或日常开发调试的构建产物。构建前置下载源码与工具链在构建之前请先按照 下载 Skia 的官方说明 完成以下准备安装depot_tools其中包含 gclient、git-cl 与 Ninja并将它加入PATH克隆 Skia 仓库运行python3 tools/git-sync-deps同步第三方依赖运行python3 bin/fetch-ninja获取 Ninja 构建工具或通过 gclient 提供 Ninja。Skia 使用 GN 与 gn/BUILDCONFIG.gn 定义了整个构建图的入口与全局参数。注意bin/gn本身也需要先同步。如果发现没有bin/gn请确认已经运行过python3 tools/git-sync-deps该脚本会拉取 GN 二进制与第三方依赖。is_official_build与第三方依赖两种构建模式Skia 的构建行为由is_official_build这一个关键参数划分为两种截然不同的模式默认值为false定义于 gn/BUILDCONFIG.gn参数值适用人群产物特征is_official_buildtrue大多数使用Skia 的最终用户优化构建、无调试符号第三方依赖以动态链接方式链接到系统库搜索路径is_official_buildfalse默认绝大多数开发Skia 的开发者未优化构建、完整调试符号所有第三方依赖从源码编译并内嵌进 libskia开发者默认模式的定位在 gn/skia.gni 中体现得很直接is_skia_dev_build is_skia_standalone !is_official_buildis_skia_dev_build会进一步打开一系列面向开发的功能开关例如skia_enable_android_utils is_skia_dev_buildgn/skia.gniskia_enable_gpu_debug_layers is_skia_dev_build is_debuggn/skia.gniskia_enable_tools is_skia_dev_buildgn/skia.gni即默认开发构建会顺带编译 dm、viewer 等工具skia_enable_spirv_validation is_skia_dev_build is_debug !skia_use_dawngn/skia.gniSkia 的官方测试手动与自动化都在开发者默认模式下进行。第三方依赖skia_use_foo与skia_use_system_fooSkia 的许多特性依赖第三方库例如图像解码libpng、libwebp、libjpeg-turbo字体子集化ICU、sftnly以及 harfbuzz、freetype 等字体处理库。所有这些第三方依赖都是可选的通过形如skia_use_foo的 GN 参数控制foo为具体库名。默认值集中声明在 gn/skia.gni 中例如skia_use_libpng_decode true、skia_use_libpng_encode truegn/skia.gniskia_use_libjpeg_turbo_decode truegn/skia.gniskia_use_harfbuzz truegn/skia.gniskia_use_icu truegn/skia.gniskia_use_freetype is_android || is_linux || is_canvaskitgn/skia.gniskia_use_fontconfig is_linuxgn/skia.gniskia_use_gl truegn/skia.gniskia_use_vulkan falsegn/skia.gniskia_use_dawn falsegn/skia.gni这些开关在仓库中形成了清晰的“开关—实现”对应关系。以 libpng 为例third_party/libpng/BUILD.gn 中declare_args() { skia_use_system_libpng is_official_build !is_canvaskit } if (skia_use_system_libpng) { system(libpng) { libs [ png ] } } else { third_party(libpng) { # 从 ../externals/libpng 编译 png.c 等源码 sources [ ... ] deps [ //third_party/zlib ] } }这里体现了第二组参数skia_use_system_foo的作用当skia_use_foo开启时再开启skia_use_system_fooSkia 将不再从源码编译该库而是链接系统路径下已有的头文件与库文件。从源码可以看出各库的默认值并不完全一致均定义于各自的 BUILD.gn 中库默认值参考文件libpngis_official_build !is_canvaskitthird_party/libpng/BUILD.gnlibjpeg-turbois_official_build !is_canvaskitthird_party/libjpeg-turbo/BUILD.gnlibwebpis_official_build !is_canvaskitthird_party/libwebp/BUILD.gnharfbuzzis_official_build !is_canvaskitthird_party/harfbuzz/BUILD.gnexpatis_official_buildthird_party/expat/BUILD.gnluais_official_buildthird_party/lua/BUILD.gnfreetype2(is_official_build \|\| !(is_android \|\| sanitize MSAN)) !is_canvaskitthird_party/freetype2/BUILD.gn可以看到is_official_buildtrue默认就会打开所有skia_use_system_foo个别 wasm/canvaskit 场景除外。这也正是官方文档那句“优化构建 动态链接系统第三方库”的实现机制system()模板只是把库名与头文件路径暴露给链接器而不会将库体编进 libskia。system()模板定义在 third_party/third_party.gnitemplate(system) { config(target_name _public) { forward_variables_from(invoker, *, []) } group(target_name) { public_configs [ : target_name _public ] } }也就是说一旦走system()分支构建系统只关心“系统上有没有这个库、头文件路径对不对”其余全部交给操作系统的库搜索机制。如果你需要为这些系统库补充额外的头文件或库搜索路径例如安装在非标准位置可以通过extra_cflags和extra_ldflags追加bin/gn gen out/Official --argsis_official_buildtrue extra_cflags[-I/opt/myinclude] extra_ldflags[-L/opt/mylib]Rust 第三方依赖Skia 的一部分第三方依赖以Rust编写。要从 GN 构建中编译它们需要先安装 Bazel或使用bazelisk构建过程会下载 Rust 工具链并完成编译。相关开关包括skia_use_rust_exif、skia_use_rust_icc、skia_use_rust_png_decode等gn/skia.gni默认均为false。仓库中experimental/rust_*系列与rust/目录下的源码即这些 Rust 组件的落地形态。DawnSkia 的部分 GPU 后端使用 Dawn 有一条强约束assert(!skia_use_dawn || skia_enable_graphite) # Dawn is Graphite-only即Dawn 只能配合 Graphite 渲染架构使用开启 Dawn 的同时必须开启skia_enable_graphite默认false见 gn/skia.gni。支持的编译器与 C20 要求首选 Clang 的理由Skia 原则上可以用 GCC、MSVC 等编译器编译但软件后端software backend中的大量例程只在 Clang 下才能跑到最快。如果以下场景对你很重要且不使用 Clang 编译性能会显著下降软件光栅化software rasterization图像解码image decoding色彩空间转换color space conversion官方明确表示这只是优先级取舍问题并非非 Clang 编译器有本质缺陷。如果你因此遇到严重问题可以在邮件列表mailing list上反馈。C20 与工具链选择Skia 使用 C20 语言特性编译标志为-stdc20因此需要支持 C20 的编译器。Clang 21 已实现 C20 标准的大部分特性缺少 C20 支持的旧编译器可能产生难以理解的编译错误。如果不指定Skia 默认使用cc和c即 gn/BUILDCONFIG.gn 中的默认值在很多平台上这通常是 GCC 而非 Clang。若要显式指定编译器通过 GN 参数覆盖即可bin/gn gen out/Clang --argsccclang cxxclang这样可以在不修改机器默认工具链的情况下用 Clang 构建。Quickstart最快路径跑通一次构建生成构建文件运行bin/gn gen生成构建文件第一个参数是构建目录名--args用于配置构建类型。静态库构建目录名out/Staticbin/gn gen out/Static --argsis_official_buildtrue共享库DLL构建目录名out/Shared加is_component_buildtruebin/gn gen out/Shared --argsis_official_buildtrue is_component_buildtrueis_component_build的默认值为falsegn/BUILDCONFIG.gn。值得注意的是它会影响工具链的可用性——gn/skia.gni 中# Our tools require static linking (they use non-exported symbols) skia_enable_tools skia_enable_tools !is_component_build也就是说组件共享库构建模式下依赖非导出符号的 dm、viewer 等工具将不再被编译。共享库构建通常用于需要动态分发 libskia 的集成场景而开发调试请保持静态构建。查看可用参数GN 的全部可用构建参数都声明在 gn/skia.gni共 301 行涵盖渲染后端、字体、编解码、工具等数百个开关。想查看某一构建目录当前生效的全部参数运行bin/gn args out/Debug --list多构建目录并存GN 允许多个构建目录同时存在每个目录可以独立配置互不干扰。官方给出的一组典型示例bin/gn gen out/Debug bin/gn gen out/Release --argsis_debugfalse bin/gn gen out/Clang --argsccclang cxxclang bin/gn gen out/Cached --argscc_wrapperccache bin/gn gen out/RTTI --argsextra_cflags_cc[-frtti]这些参数分别对应is_debugfalse发布优化模式默认is_debugtrue会带调试符号cc/cxx指定编译器cc_wrapperccache用 ccache 缓存加速增量编译extra_cflags_cc仅对 C 编译追加标志如-frtti开启 RTTISkia 默认可能关闭 RTTI。另外extra_cflags对 C 与 C 都生效在 gn/skia.gni 中还有一个实际用例当skia_enable_optimize_size与is_debugtrue冲突时官方建议改用extra_cflags[-DSK_ENABLE_OPTIMIZE_SIZE]。编译与链接构建文件生成后用 Ninja 编译整个 Skianinja -C out/Static只编译指定目标避免全量构建ninja -C out/Debug skia ninja -C out/Debug viewer dmskia是核心库目标viewer是交互式渲染查看器dm是 Skia 的测试驱动Deployment Mechanism。注意并非所有目标在所有参数组合下都可用例如is_component_buildtrue时不编译工具。列出某构建目录的全部可用目标gn ls out/Debug缺头文件的处理如果编译时提示缺少某些头文件说明系统缺少对应依赖库的开发包。Linux 上可运行仓库自带的安装脚本tools/install_dependencies.sh更新与增量重建拉取新提交并重建的常规流程git pull python3 tools/git-sync-deps ninja -C out/Staticgit-sync-deps的作用是把DEPS文件声明的第三方依赖位于third_party/externals/下同步到本地头文件缺失问题往往源于此步未执行或依赖未更新。Android 构建前置条件构建 Android 版 Skia 需要较新版本的 JavaOracle 下载页较新版本的 Android NDK。获取 NDK如果没有现成 NDK 且可以访问 CIPD可以用 Skia 自带的工具链脚本下载 bot 使用的 NDK./bin/fetch-sk ./bin/sk asset download android_ndk_linux ~/ndk # on Linux ./bin/sk asset download android_ndk_darwin ~/ndk # on Mac ./bin/sk.exe asset download android_ndk_windows C:/ndk # on WindowsGN 配置生成构建文件时传入 NDK 路径与目标 CPU 架构bin/gn gen out/arm --argsndk~/ndk target_cpuarm bin/gn gen out/arm64 --argsndk~/ndk target_cpuarm64 bin/gn gen out/x64 --argsndk~/ndk target_cpux64 bin/gn gen out/x86 --argsndk~/ndk target_cpux86ndk与ndk_api的默认值定义在 gn/BUILDCONFIG.gnndk # Android 5.0, Lollipop ndk_api 21ndk_api默认 21对应 Android 5.0 Lollipop调大它可以访问更新的 Android 特性例如 Vulkan。工具链的生成代码gn/toolchain/BUILD.gn会把ndk_api拼进编译器前缀如aarch64-linux-android21-clang同时 gn/skia.gni 中skia_use_ndk_images会在ndk_api 30时自动启用 NDK 图像解码能力。is_debug、is_component_build等通用参数在 Android 构建下继续有效。在设备上测试编译出二进制后把二进制和resources目录推到设备上直接运行。bin/droid脚本可以简化此流程ninja -C out/arm64 adb push out/arm64/dm /data/local/tmp adb push resources /data/local/tmp adb shell cd /data/local/tmp; ./dm --src gm --config gl这里dm使用--src gm运行 golden 图像测试与--config glGL 渲染配置在设备上跑测试。ChromeOS 交叉编译前置条件为 ARM 版 ChromeOS 设备交叉编译需要Clang 4 或更新版本一个 armhf sysroot用于链接的 chromebook 上的 (E)GL 库文件为 x86 ChromeOS 设备编译则只需 Clang 与 lib 文件。获取资产能访问 CIPD 时用以下命令获取全部所需资产./bin/sk asset download clang_linux /opt/clang ./bin/sk asset download armhf_sysroot /opt/armhf_sysroot ./bin/sk asset download chromebook_arm_gles /opt/chromebook_arm_gles ./bin/sk asset download chromebook_x86_64_gles /opt/chromebook_x86_64_gles若没有权限使用这些资产可参考infra/bots/assets/下对应目录armhf_sysroot、chromebook_arm_gles、chromebook_x86_64_gles的 README 自行制作。GN 参数示例ARM 设备cc /opt/clang/bin/clang cxx /opt/clang/bin/clang extra_asmflags [ --targetarmv7a-linux-gnueabihf, --sysroot/opt/armhf_sysroot/, -marcharmv7-a, -mfpuneon, -mthumb, ] extra_cflags[ --targetarmv7a-linux-gnueabihf, --sysroot/opt/armhf_sysroot, -I/opt/chromebook_arm_gles/include, -I/opt/armhf_sysroot/include/, -I/opt/armhf_sysroot/include/c/4.8.4/, -I/opt/armhf_sysroot/include/c/4.8.4/arm-linux-gnueabihf/, -DMESA_EGL_NO_X11_HEADERS, -funwind-tables, ] extra_ldflags[ --sysroot/opt/armhf_sysroot, -B/opt/armhf_sysroot/bin, -B/opt/armhf_sysroot/gcc-cross, -L/opt/armhf_sysroot/gcc-cross, -L/opt/armhf_sysroot/lib, -L/opt/chromebook_arm_gles/lib, --targetarmv7a-linux-gnueabihf, ] target_cpuarm skia_use_fontconfig false skia_use_system_freetype2 false skia_use_egl truex86_64 设备cc /opt/clang/bin/clang cxx /opt/clang/bin/clang extra_cflags[ -I/opt/clang/include/c/v1/, -I/opt/chromebook_x86_64_gles/include, -DMESA_EGL_NO_X11_HEADERS, -DEGL_NO_IMAGE_EXTERNAL, ] extra_ldflags[ -stdliblibc, -fuse-ldlld, -L/opt/chromebook_x86_64_gles/lib, ] target_cpux64 skia_use_fontconfig false skia_use_system_freetype2 false skia_use_egl true要点解读--targetarmv7a-linux-gnueabihf指定交叉编译目标三元组--sysroot指向 armhf 根文件系统skia_use_fontconfig false关闭依赖主机环境的字体配置ChromeOS 环境不适用 fontconfig 默认值——默认在 Linux 上为true见 gn/skia.gniskia_use_egl true启用 EGL 接口以对接 ChromeOS 的 GPUGLESskia_use_system_freetype2 false强制从源码编译 freetype2避免链接 host 系统库。编译与部署用 ninja 编译 dm或任意可执行目标然后通过 ssh 推送到 chromebook并参考 测试文档 以glesGPU 配置运行 dm。大多数 chromebook 默认将 home 分区标记为noexec直接运行会报 “permission denied”需要先重挂载为可执行sudo mount -i -o remount,exec /home/chronosMac 构建Xcode 工程与 Apple SiliconMac 用户可以在bin/gn gen时传--idexcode生成 Xcode 工程。Mac 的 GN 构建默认按 Intel CPU 处理。在 Apple SiliconM1 及更新上构建需要显式指定target_cpuarm64bin/gn gen out/AppleSilicon --argstarget_cpuarm64Python 环境Apple 自带的 Python 版本偏旧已知与 Skia 构建系统配合不佳。官方建议安装 python.org 的最新官方版本然后运行 “Applications/Python 3.11/Install Certificates.command” 初始化证书。iOS 构建GN 配置iOS 构建通过target_osios开启默认target_cpuarm64bin/gn gen out/ios64 --argstarget_osios bin/gn gen out/ios32 --argstarget_osios target_cpuarm bin/gn gen out/iossim-apple --argstarget_osios target_cpuarm64 ios_use_simulatortrue bin/gn gen out/iossim-intel --argstarget_osios target_cpux64关于模拟器ios_use_simulatortrue时需把target_cpu设为主机架构在 Intel Mac 上单独设置target_cpux64也会自动瞄准 iOS 模拟器。ios_use_simulator的默认值逻辑在 gn/BUILDCONFIG.gnios_use_simulator target_os ios (target_cpu x86 || target_cpu x64)即在 Intel 架构下构建 iOS 时模拟器默认开启ARM64 下默认关闭。签名配置默认情况下iOS 构建会打包真机还会签名测试二进制。只想验证编译可通过时关闭签名skia_ios_use_signing falseskia_ios_use_signing的默认值来自 gn/skia.gniif (is_ios) { skia_ios_identity .*Google.* skia_ios_profile Google Development # should only code sign when running on a device, not the simulator skia_ios_use_signing !ios_use_simulator }签名时默认使用 Google 的签名身份与描述文件。要换成自己的设置skia_ios_identity.*Jane Doe.* skia_ios_profileiPad Profile查看可用身份命令行执行security find-identity描述文件名称在 Apple Developer 网站查看或在 Finder 中打开~/Library/MobileDevice/Provisioning Profiles目录选中某个.mobileprovision文件按空格预览其顶部字符串或绝对路径即为skia_ios_profile的合法取值。安装与部署对已签名包ios-deploy可以方便地在真机安装运行ios-deploy -b out/Debug/dm.app -d --args --match foo也可以传--idexcode生成 Xcode 工程来部署。若使用 Xcode 10 或更高版本可能需要在Project Settings...中把Build System:改为Legacy Build System。部署到低于当前 SDK 版本的旧系统设备时设置ios_min_targetios_min_target major.minor其中major.minor是设备上的 iOS 版本如 12.0 或 11.4。该参数会透传到 gn/ios.gni 中的IPHONEOS_DEPLOYMENT_TARGET从而控制部署目标版本。Windows 构建基础要求Skia 可在 Windows 上使用 Visual Studio 2017 或 2019 构建。如果 GN 找不到二者会报错此时可通过win_vc显式传入VC路径。也可以使用免费的 Build Tools for Visual Studio 2017/2019。Skia 官方 bot 使用的是打包好的 2019 工具链Googler 可通过 CIPD 下载./bin/sk.exe asset download win_toolchain C:/toolchain然后在 GN 参数中设置win_vc C:\toolchain\VC win_sdk C:\toolchain\win_sdkwin_vc与win_sdk的默认值在 gn/BUILDCONFIG.gn 中win_vc默认为空会由 gn/find_msvc.py 自动探测win_sdk默认指向C:/Program Files (x86)/Windows Kits/10。这套工具链是官方支持 32 位构建的唯一途径需同时设置target_cpux86。构建假设PATHEXT环境变量包含.EXE。强烈推荐用 clang-cl 构建Skia 包含只在 clang 下才被优化的生成代码其他编译器只能获得通用的未优化版本。注意在 Windows 上设置cc/cxx是无效的——这两个变量在 Windows 被忽略。正确做法是设置clang_win指向 LLVM 安装目录。若安装了 LLVM 预编译包 于默认位置clang_win C:\Program Files\LLVMclang_win默认值为空gn/BUILDCONFIG.gn设置后 GN 会通过 gn/highest_version_dir.py 自动探测其中的 clang 版本号clang_win_version。请使用标准 Windows 路径写法C:\Program Files\LLVM不要用 MinGW 风格如/c/Program Files/LLVM。如果程序的其余部分将用非 Clang 编译器编译建议同时添加is_trivial_abi false以保证 ABI 兼容。Visual Studio 解决方案用 Visual Studio 开发时可传--idevs给bin/gn gen生成all.sln。该解决方案位于对应 GN 目录内只构建/运行该单一配置。如果需要支持多个 GN 配置的解决方案可使用辅助脚本要求所有 GN 目录都在out目录内。先照常为每个配置执行带--idevs的bin/gn gen然后python3 gn/gn_meta_sln.py这会生成新的专用输出目录与解决方案文件out/sln/skia.sln。它包含与每个 GN 配置一一对应的解决方案配置支持构建与运行其中任意配置还会根据所选配置的预处理器定义调整非活动代码块的语法高亮。Windows ARM64实验性Windows 10 on ARM 有早期实验性支持当前需要较新版本的MSVC以及 Visual Studio Installer 中的Visual C compilers and libraries for ARM64独立组件。将target_cpu设为arm64即可使用该工具链。注意Windows 10 on ARM 不支持 OpenGL因此 Skia 的 GL 后端会被 stub 掉、无法工作但 ANGLE 受支持bin/gn gen out/win-arm64 --argstarget_cpuarm64 skia_use_angletrue产物将支持软件后端或 ANGLE 后端。在 DM 中两个后端都可用viewer 则必须以--backend angle启动因为软件后端尝试用 OpenGL 显示窗口内容。CMake 工程生成Skia 提供了一个 GN 到 CMake 的转换器主要服务于偏好 CMake 工程描述的 IDE仅用于开发场景不面向发布bin/gn gen out/config --idejson --json-ide-script../../gn/gn_to_cmake.py转换逻辑由 gn/gn_to_cmake.py 实现生成一个 CMake 工程描述供 IDE 解析。结语构建参数速查参数默认值说明is_official_buildfalse官方发布模式优化构建、无调试符号、动态链接系统第三方库is_component_buildfalse组件共享库构建开启后工具目标不可用is_debugtrue调试构建符号false为发布优化cc/cxxcc/c编译器可执行文件Windows 上忽略改用clang_winextra_cflags/extra_ldflags空追加编译/链接标志与搜索路径cc_wrapper空编译器包装器如ccachendk/ndk_api/21Android NDK 路径与 API 级别target_cpu随平台目标 CPU 架构arm、arm64、x64、x86target_os随平台目标操作系统如iosclang_winWindows 上 LLVM 安装目录win_vc/win_sdk自动探测/默认路径Windows VC 与 SDK 路径ios_use_simulator随架构iOS 模拟器开关skia_ios_use_signing!ios_use_simulatoriOS 代码签名开关全部参数的权威声明位于 gn/skia.gni 与 gn/BUILDCONFIG.gn任何时候都可以用bin/gn args out/dir --list查看某个构建目录的完整参数与默认值。掌握上述参数组合你就可以针对桌面、移动端、嵌入式与特殊 GPU 环境定制出满足需求的 Skia 构建。赞分享图形学【免费下载链接】skiaSkia is a complete 2D graphic library for drawing Text, Geometries, and Images. See documentation for contribution instructions.项目地址https://gitcode.com/gh_mirrors/ski/skia点击查看免费下载相关推荐Earthly 多平台构建完全指南QEMU 模拟、交叉编译与内置平台参数Earthly 多平台构建完全指南QEMU 模拟、交叉编译与内置平台参数 本指南以 Earthly 的多平台multi platform构建能力为核心讲CI/CDDevOps构建工具PyInstaller Bootloader 构建完全指南从源码编译到跨平台交叉构建PyInstaller Bootloader 构建完全指南从源码编译到跨平台交叉构建 PyInstaller 通过 C 语言编写的 bootloader 完成开发工具构建工具Agentic RAG性能优化指南从嵌入模型到分块策略的7个关键调优技巧Agentic RAG性能优化指南从嵌入模型到分块策略的7个关键调优技巧 Agentic RAG检索增强生成智能体是构建智能问答系统的强大框架但实际应用上一篇iTrustee_tzdriver核心组件解析深入理解非安全侧驱动架构下一篇AcTrail 核心架构解析eBPF 与 seccomp 如何实现无侵入监控创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。