修十年Bug修成Commiter?鹅厂工程师的Chromium社区贡献之旅
👉目录
1 引言
2 首次贡献
3 持续贡献
4 成为 Committer
5 感悟
01
02
对于一个向量(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)
04
根据 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 内核的开发中,使其能够吸纳社区之长,站在巨人的肩膀上走得更远。
📢📢欢迎加入腾讯云开发者社群,享前沿资讯、大咖干货,找兴趣搭子,交同城好友,更有鹅厂招聘机会、限量周边好礼等你来~
(长按图片立即扫码)