ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

构建 ungoogled-chromium 完整指南:从源码下载、二进制清理、补丁应用到 GN 构建

构建 ungoogled-chromium 完整指南:从源码下载、二进制清理、补丁应用到 GN 构建 构建 ungoogled-chromium 完整指南从源码下载、二进制清理、补丁应用到 GN 构建【免费下载链接】ungoogled-chromiumGoogle Chromium, sans integration with Google项目地址: https://gitcode.com/gh_mirrors/un/ungoogled-chromium本篇技术指南以 ungoogled-chromium 仓库的 docs/building.md 为骨架系统讲解如何将该项目的全部特性集成进你自己的 Chromium 构建流程。你将掌握从源码下载、二进制剪枝、补丁应用、域名替换到 GN 与 Ninja 编译的完整命令链路并理解每个步骤背后的工具实现原理从而在自己的发行版或自定义构建环境中复现 ungoogled-chromium 的构建过程。构建方式概述平台仓库优先自定义集成为辅ungoogled-chromium 的官方推荐构建方式并非直接使用本仓库而是参考各支持平台的专用仓库这些仓库提供了对应平台所需的全部剩余配置与脚本。平台列表详见 docs/platforms.mdAndroid、Arch Linux、Debian/Ubuntu 及衍生版、Fedora/CentOS、Windows、macOS 各有独立仓库Linux 用户如果您的发行版不在已支持列表中则需要使用 Portable Linux 仓库ungoogled-chromium-portablelinux它以发行版无关的方式提供构建支持。需要特别说明的是本仓库只包含所有平台通用的代码补丁、构建标志、元数据并不包含构建全部平台所需的全部代码因此集成到自己的构建流程时可能还需要为您的平台补充额外的补丁和构建配置参见 docs/platforms.md。如果您希望把 ungoogled-chromium 融入已有的 Chromium 构建流程即您已经具备一套能产出自己 Chromium 构建的方法则可以直接按下一节执行。开始前建议通读 docs/design.md 了解整体架构设计。集成到现有 Chromium 构建流程的完整步骤以下过程勾勒了构建包含 ungoogled-chromium 全部特性的 Chromium 所需的核心步骤。文档作者明确强调这些步骤本身并不足以独立完成构建——您仍需自行补齐平台相关的下载、GN 标志与打包环节。整体步骤与 docs/design.md 中Packaging一节的八大流程下载解包 → 剪枝 → 打补丁 → 域名替换 → 构建 GN →gn gen→ninja→ 打包一一对应。第一步确保 Chromium 源码已下载downloads.ini第一步是确保 Chromium 源码就位。在多数官方支持平台中通常使用自定义工具完成即本仓库的utils/downloads.py若您使用depot_tools检出 Chromium则可跳过本步。mkdir -p build/download_cache ./utils/downloads.py retrieve -c build/download_cache -i downloads.ini ./utils/downloads.py unpack -c build/download_cache -i downloads.ini -- build/src该命令读取仓库根目录的 downloads.ini 配置。以当前仓库为例它定义了 Chromium 官方源码压缩包的下载地址、文件名、哈希校验文件与解包规则[chromium] url https://commondatastorage.googleapis.com/chromium-browser-official/chromium-%(_chromium_version)s-lite.tar.xz download_filename chromium-%(_chromium_version)s-lite.tar.xz hash_url chromium|chromium-%(_chromium_version)s-lite.tar.xz.hashes|https://commondatastorage.googleapis.com/chromium-browser-official/chromium-%(_chromium_version)s-lite.tar.xz.hashes output_path ./ strip_leading_dirs chromium-%(_chromium_version)s从 downloads.ini 可以看出当前仓库对应 Chromium 版本由chromium_version.txt当前为153.0.8010.52注入源码包使用-lite精简版 tarball并通过hash_url指定的哈希清单做完整性校验。从源码实现看utils/downloads.pyretrieve子命令负责下载与校验优先调用curl失败或不存在时回退到 Pythonurllib并支持断点续传unpack子命令在解包前再次核对哈希支持md5/sha1/sha256/sha512及hash_url多种来源随后按strip_leading_dirs剥离顶层目录并解压到build/src。第二步二进制剪枝prune_binaries.py./utils/prune_binaries.py build/src pruning.list该步骤从源码树中剥离预编译的二进制文件——包括预构建可执行文件、共享库以及其他形式的机器码。根据 docs/design.md这些二进制要么被替换为系统或用户提供的等价物要么改为从源码构建无法移除的那些则不含机器码。待删除文件的清单由pruning.list定义当前仓库该文件约 1.4 万行并由devutils/update_lists.py生成维护。从 utils/prune_binaries.py 的源码看实际剪枝分为两部分按清单删除文件逐行读取pruning.list对每个相对路径执行删除Windows 上只读文件会先清除只读属性再删不存在的文件会被记录为无法剪枝并在最后报错退出sys.exit(1)清理 CONTINGENT_PATHS 与__pycache__脚本内置了一组条件路径如third_party/llvm/、buildtools/linux64/、各平台 sysroot、大量测试数据目录等这些路径在源码以 clone、tarball、lite tarball 等不同方式获取时存在与否不同统一剪除以保证构建一致性。保留的.gn、.gni、.grd、.grdp、.isolate、.pydeps等构建必需元数据文件不会被误删。--keep-contingent-paths可跳过条件路径剪枝当您希望使用 Google 官方工具链构建时--sysroot可豁免指定架构的 sysroot。第三步应用补丁patches.py./utils/patches.py apply build/src patchesungoogled-chromium 的所有补丁位于仓库 patches/ 目录遵循GNU Quilt 格式所有补丁位于patches/内文件以.patch结尾内容为 unified diff 格式patches/series 文本文件定义了应用顺序当前 111 行每行是相对patches目录的路径以#开头的行被忽略补丁按类别分为core/涉及后台请求、Google 专有代码、预编译二进制必须随 Chromium 更新持续跟进与extra/涉及控制力与透明度的功能增强不保证跨版本存续两大类再按来源分组debian/、inox-patchset/、bromite/、iridium-browser/、ungoogled-chromium/项目开发者自研补丁等。从 utils/patches.py 源码看apply子命令按series顺序逐条执行patch -p1 --ignore-whitespace --forward并自动定位 GNU patch 工具优先级--patch-bin参数 →PATCH_BIN环境变量 →which patch。该工具还提供了merge子命令用于把多个 Quilt 格式补丁目录合并成一个支持--prepend前插这在平台仓库中用于汇总各来源补丁。此外仓库还附带 devutils/validate_patches.py 与对应测试devutils/tests/test_validate_patches.py用于校验补丁格式规范。第四步域名替换domain_substitution.py./utils/domain_substitution.py apply -r domain_regex.list -f domain_substitution.list -c build/domsubcache.tar.gz build/src域名替换是 ungoogled-chromium 的关键防御机制docs/design.md 称其为粗粒度但有效的后备措施将 Chromium 源码中的 Google 及其他网络域名替换为以qjz9zk结尾的不存在域名配合少量补丁如 patches/core/ungoogled-chromium/block-trk-and-subdomains.patch使任何经net::URLRequest发出的此类请求都被拦截并通过信息栏通知用户——即源码层面杜绝了向这些域名发起连接的可能。三个配置文件分工明确domain_regex.list 定义搜索与替换的正则表达式对搜索与替换表达式以#分隔。当前仓库示例注意转义写法google([A-Za-z\-]*?\*?)\.com(?!mon)#9oo91e\g1.qjz9zk gstatic([A-Za-z\-]*?\*?)\.com#95tat1c\g1.qjz9zk chromium([A-Za-z\-]*?\*?)\.org#ch40m1um\g1.qjz9zk规则约束所有替换结果必须以 TLDqjz9zk结尾搜索与替换表达式必须一一对应不允许两个搜索表达式匹配同一字符串也不允许两个替换表达式产生同一结果。domain_substitution.list 列出需要执行替换的源码文件当前约 1.78 万行命令中的-c build/domsubcache.tar.gz会生成域名替换缓存替换前先把每个文件的原始内容连同 CRC32 哈希打包进 tarball供后续revert子命令回滚使用回滚前会先校验当前文件哈希是否与缓存一致详见 utils/domain_substitution.py 的revert_substitution。第五步构建 GN可选mkdir -p build/src/out/Default cd build/src ./tools/gn/bootstrap/bootstrap.py --skip-generate-buildfiles -j4 -o out/Default/仅当您没有使用depot_tools检出 Chromium、也没有现成 GN 二进制时才需要本步。它从源码引导编译 GN 元构建工具-j4指定并行度--skip-generate-buildfiles跳过不必要的生成步骤。第六步调用构建gn gen ninjamkdir -p build/src/out/Default # NOTE: flags.gn contains only a subset of what is needed to run the build. cp flags.gn build/src/out/Default/args.gn cd build/src # If you have additional GN flags to add, make sure to add them now. ./out/Default/gn gen out/Default --fail-on-unused-args ninja -C out/Default chrome chromedriver chrome_sandbox仓库根目录的 flags.gn 提供了构建所需的 GN 参数子集当前内容包含chrome_pgo_phase0 clang_use_chrome_pluginsfalse disable_fieldtrial_testing_configtrue enable_hangout_services_extensionfalse enable_mdnsfalse enable_remotingfalse enable_reportingfalse enable_service_discoveryfalse enable_widevinetrue exclude_unwind_tablestrue google_api_key google_default_client_id google_default_client_secret safe_browsing_mode0 treat_warnings_as_errorsfalse use_official_google_api_keysfalse use_unofficial_version_numberfalse v8_drumbrake_bounds_checkstrue这些参数直接体现了项目目标清空 Google API 密钥google_api_key等为空、关闭 Safe Browsingsafe_browsing_mode0、禁用字段试验配置与各类网络服务enable_mdns/enable_remoting/enable_reporting/enable_service_discovery均为 false。注意如注释所强调flags.gn只是构建所需参数的一个子集您仍需根据平台仓库补充其余 GN 标志后再执行gn gen。--fail-on-unused-args用于在存在未使用参数时报错帮助及早发现配置问题。最终ninja -C out/Default chrome chromedriver chrome_sandbox编译浏览器主体、驱动与沙箱三件套。构建 FAQ内存不足怎么办问题构建过程中因内存耗尽RAM 耗尽而反复崩溃如何解决按推荐优先级排列有以下几种方案降低 Ninja 并行线程数-j参数例如将上文的ninja -C out/Default chrome chromedriver chrome_sandbox改为ninja -C out/Default -j2 chrome chromedriver chrome_sandbox减少并发编译任务以压低峰值内存占用。GN 引导编译时的-j4同理添加交换空间swap为系统增加 swap 分区或 swapfile让内核在物理内存吃紧时将部分数据换出避免 OOM Killer 终止编译进程。结语综合来看ungoogled-chromium 的构建本质上是官方 Chromium 构建流程 四个定制环节通过 downloads.ini 与 utils/downloads.py 获取并校验源码、通过 pruning.list 与 utils/prune_binaries.py 剪除预编译二进制、通过 patches/ 与 utils/patches.py 应用功能补丁、通过 domain_regex.list 与 utils/domain_substitution.py 完成域名替换最后以 flags.gn 中体现隐私取向的 GN 参数完成编译。对于大多数用户最稳妥的路径仍是直接使用您平台对应的官方仓库见 docs/platforms.md本文的六步流程则适合希望深度定制、把 ungoogled-chromium 特性注入自有构建管线的场景。【免费下载链接】ungoogled-chromiumGoogle Chromium, sans integration with Google项目地址: https://gitcode.com/gh_mirrors/un/ungoogled-chromium创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表