👉目录
1 引言
2 首次贡献
3 持续贡献
4 成为 Committer
5 感悟
开源软件构筑起了互联网世界坚实的地基,开源的社区分布式协作模式,也极大地促进了软件开发的效率,大教堂与集市的钟声下,技术开始普惠世界。
腾讯公司从开源中受益,也将自己的技术探索反哺回了开源社区。鹅厂的工程师们,也多有在各大开源社区、基金会中担任 Commiter 乃至 PMC 的开源人。本文作者十年前首次开始给 Chromium 贡献代码,一步一步地在 Chromium 社区学习成长,并为社区提了多个优化 Patch,最终成为了一名 Chromium Commiter,这是他的故事自述。
01
引言
Chromium 是由 Google 主导开发的开源浏览器项目。目前绝大多数浏览器和 Web 框架都是基于 Chromium 内核开发的。腾讯 X5 内核同样也是基于 Chromium,并在此基础上做了很多深度定制和优化。我有幸参与到 X5 内核的开发,并为 Chromium 贡献了多个 Patch,最终成为 Chromium 项目的 Committer。
02
首次贡献
首次向 Chromium 贡献代码要追溯到十年前(2014年)。当时是在分析 X5 内核上的一个页面显示的 bug,跟踪代码发现 Chromium 合成器中计算三维向量长度的函数有点问题:
对于一个向量(a, b, c)
,其长度为std::sqrt(a * a + b * b + c * c)
,在 Web 场景下,经常出现其中两个值为 0,所以源码中对这种情况做了优化:如果其中两个值同时为 0,则长度等于另外的非零值。如果另外一个非零值小于 0,则返回的长度值小于 0,显然不合理。
当时跟踪的 bug 就是因为计算的长度值小于 0 导致的。
确定是 Chromium 源码的 bug 后,我就准备尝试去给 Chromium 提交 Patch。但是当时团队和公司还没有人给 Chromium 提过 Patch,所以接下来就去摸索如何给 Chromium 贡献代码,幸好 Chromium 中有如何贡献代码的文档。不过那时候的文档还比较粗糙,远没有现在的如何贡献代码的文档详细。仔细阅读文档后,就开始按照步骤一步步来。
(https://chromium.googlesource.com/chromium/src/+/main/docs/contributing.md)
Chromium 贡献代码有两种身份:
Contributor:只要是向 Chromium 贡献过代码就是 Contributor;
Committer:是指有 Chromium 仓库写入权限的 Contributor。
成为 Committer 的要求下文会有介绍。首次贡献代码需要做如下操作,否则无法提交 Patch:
签署 Contributor License Agreement;
修改 AUTHORS 文件,加入自己的账号信息。https://source.chromium.org/chromium/chromium/src/+/main:AUTHORS
完成前期准备工作后,按照提示发起 Code Review 给相关模块的 OWNER 审查代码。因为这个 Patch 改动不大,所以 Code Review 很快就通过了。代码成功合入主线时,当时还挺激动的。
我的首次提交:
Fix scale on axis may be negative(https://codereview.chromium.org/253083002)
03
持续贡献
在之后的工作也碰巧遇到了几个原生的 bug,也都向 Chromium 提交了patch:
Remove redundant signals_check_notifier_ schedule(https://codereview.chromium.org/2516163002)
Update GpuPreferences when running GPU thread inside browser process(https://chromium-review.googlesource.com/c/chromium/src/+/569324)
Delay creating DeferredGpuCommandService until gpu driver bug list is loaded(https://chromium-review.googlesource.com/c/chromium/src/+/597375)
后来 X5 内核准备商业化,为了提升团队的技术影响力,开始主动向 Chromium 提交 Patch。在2022年期间我向 Chromium 提交了 19 个 patch,主要是涉及 Android WebView、Scroll、Animation 等。
以下是个人认为比较重要的几个 Patch:
Fix element doesn't scroll back to initial position(https://chromium-review.googlesource.com/c/chromium/src/+/3560870)
Fix scroll offset changes slightly when the page is reloaded(https://chromium-review.googlesource.com/c/chromium/src/+/3608429)
Don't serialize anchors that are inside a shadow DOM(https://chromium-review.googlesource.com/c/chromium/src/+/3594139)
aw: Fix WebViewInstrumentation show blank when back to foreground(https://chromium-review.googlesource.com/c/chromium/src/+/3615699)
aw: Fix android webview inspector does not show overlay(https://chromium-review.googlesource.com/c/chromium/src/+/3631800)
Fix page cannot scroll in some areas(https://chromium-review.googlesource.com/c/chromium/src/+/3676595)
Reland "Attach animation timeline to host"(https://chromium-review.googlesource.com/c/chromium/src/+/3721224)
团队中的其他同事也提交了一些 Patch。在 2022 年下半年的举办的 BlinkOn 17 会议上,腾讯公司首次上榜了 Chromium 的 Non-Google Commits 名单。
04
成为 Committer
根据 Chromium 官方文档所述,成为 Committer 需要满足的关键条件是:
向 Chromium 仓库贡献 10~20 个重要的 patch,且至少有三个人审查过代码。
有人提名你为 Committer,且至少两人支持这个提名。
Chromium 的代码审查非常严格,所以要做到 10 个以上的 Patch 是需要一些时间的。我翻了下自己过往的提交记录,感觉满足条件的 Patch 不是很多,而且 Patch 不够集中,难以被提名为 Committer。
为了成为 Committer,还需要提交一些“重要”的 Patch。我决定选择 WebGPU 作为主攻方向来支撑我成为 Committer。其实我在 X5 上的工作重心是在 Android WebView、渲染架构和性能优化、滚动动画等,如果继续在上面的方向上投入会相对容易些。但我想趁着成为 Committer 的机会,多了解一些新的东西。刚好 WebGPU 是一个相对比较新的技术,而且我对这方面比较感兴趣,之前也一直在关注 WebGPU 的发展。
WebGPU 是一种新的 Web API,允许在 GPU 上进行渲染和计算操作,类似于 Direct3D 12、Metal 和 Vulkan。与 WebGL 不同,WebGPU 提供了对更高级 GPU 功能的访问,并为 GPU 上的通用计算提供支持,这一特性使得在浏览器上运行机器学习算法成为可能。关于 WebGPU 详细介绍可参考 WebGPU 的 W3C 标准。Chromium 已在 M113 版本上针对 Mac 和Win 默认开启了 WebGPU,M121 版本上针对 Android 特定机型也默认开启了 WebGPU。
从2023年12月初开始,在业余时间陆陆续续提交了一些 WebGPU 相关 Patch。因为WebGPU 和 Canvas、WebGL 开发团队有一些重叠,为了和团队的 Committer 混熟,所以期间也提交了一些 Canvas、WebGL 和 OffScreen Canvas 相关的 Patch。以下是节选的一些 WebGPU 和 WebGL 相关的 Patch:
Fix leaked WGPUAdapter in Blink's GPUAdapter(https://chromium-review.googlesource.com/c/chromium/src/+/5113730)
Reland "Lazily create the TextureLayer for WebGPU"(https://chromium-review.googlesource.com/c/chromium/src/+/5211706)
Fix image-rendering:pixelated fails for bitmaprenderer(https://chromium-review.googlesource.com/c/chromium/src/+/5237798)
Fix image-rendering:pixelated fails for offscreen webgl and webgpu(https://chromium-review.googlesource.com/c/chromium/src/+/5232962)
Occlusion calculation skip TextureLayer without resource(https://chromium-review.googlesource.com/c/chromium/src/+/5168985)
Chromium 代码修改一般都需要编写测试验证,包括单元测试、Web Platform Test 等。单元测试大家都比较熟悉,就不再多说了。Web Platform Test 是一个跨浏览器的 Web 标准测试套件,确保不同浏览器内核的行为符合 W3C 标准。所以一般来说,Blink 层的修改一般都是需要有 Web Test 验证的,这样不仅方便代码审查者验证问解决情况,同时也防止后面其他人的修改导致这个 bug 再次出现。有时候代码修改很少,但是为了验证修改的正确性,可能需要花很多时间设计和编写测试用例。
因为 WebGPU 和 WebGL 涉及的API和规范非常多,所以它们都有独立的 Web 标准测试套件。期间我也提交了一些 Patch:
Add reftests: delay calling context getCurrentTexture after configure(https://github.com/gpuweb/cts/pull/3294)
Add reftests: canvas display after device lost(https://github.com/gpuweb/cts/pull/3669)
Add tests for bufferData, bufferSubData and getBufferSubData from WASM Memories of 4GB and 16GB in size.(https://github.com/gpuweb/cts/pull/3294)
关于提名我为 Committer,还挺意外的。Chromium 的代码审查策略是非 Committer 的提交需要两个以上 Committer 来审查。当时我有一个 Patch 其中一个 Committer 审查通过了,但是另一个 Committer(Corentin Wallez,WebGPU 负责人)一直没有给我通过。后来告诉他因为我还不是 Committer,所以需要两个人审查通过代码才能合入,并顺便请教了些成为 Committer 的一些事项。因为马上就要春节放假了,想着年后再提交几个 Patch 后,再找他帮忙提名 Committer。没想到的是过年期间就收到了 Committer 的通知邮件。我猜测应该是上次问他之后他就直接帮我申请了。
05
感悟
从十年前提交一个小小的 patch 开始,逐步参与到 Chromium 开源项目,对我的编程能力、代码规范和内核技术理解等都有很大的提升。
与 Chromium 开源社区保持紧密联系,不仅能够及时了解和学习最新的技术和趋势,也使我能够将这些知识和经验应用到 X5 内核的开发中,使其能够吸纳社区之长,站在巨人的肩膀上走得更远。
-End-
原创作者 | 王玉培
你有过哪些印象深刻的开源社区参与经历吗?欢迎评论留言。我们将选取1则评论,送出腾讯云开发者定制眼罩1个(见下图)。6月5日中午12点开奖。
📢📢欢迎加入腾讯云开发者社群,享前沿资讯、大咖干货,找兴趣搭子,交同城好友,更有鹅厂招聘机会、限量周边好礼等你来~
(长按图片立即扫码)