为什么我们最终抛弃 Chromium 选择了 Firefox ?
最初,我们利用原始、低级的浏览器 API 开始构建 Firefox 的扩展。然而,在开始构建浏览器后,我们又希望将这些功能发布到 Android 和 iOS 上的移动浏览器中。后来,我们希望在 Firefox 57 提供的 webextension API 之上运行我们的代码。对于一个规模很小的团队而言,确保环境以及代码库之间的业务逻辑一致是一项难题。 为了解决这个问题,我们决定利用 JavaScript 来构建我们的一切架构。我们利用同构且通用的 JavaScript 编写业务逻辑,并在底层添加平台特定的实现,以处理每个运行时的细节。我们的浏览器核心的代码库包含跨所有平台产品的代码: • Web 扩展、与 Chrome、Firefox 和 Edge 的兼容; • 使用 React-native 的 Android 和 iOS; • NodeJS,用于测试和 headless 模式。 举个例子,我们有一个搜索模块提供给定查询的结果。这是浏览器核心的一个模块实现的。如前所述,结果的来源之一是浏览器的历史记录。这是平台特有的功能,因此台式机和移动设备上有不同的历史数据库。在构建时,绑定了相应的 JavaScript 实现,因此该搜索模块可以查询平台的数据库。搜索的用户界面也有所不同:在桌面系统中,结果显示在 URL 栏下方的内联框架中,而在移动设备上,UI 是使用 React-Native 实现的。两种情况都会将查询推送到同一个搜索实现中,并从中获取结果。 Android Android 上的情况与桌面系统略有不同。该操作系统由 Google 控制,大多数用户都会使用内置的浏览器或 Chrome(与 Android 一起发行)。幸运的是,用户仍然可以选择。你可以更改默认的浏览器,而且操作系统就会尊重你的选择,在你点击链接时使用选择的浏览器打开。我们构建了多个 Android 浏览器,每次都使用了不同的方法: Cliqz Android:与许多 Android 浏览器一样,Cliqz Android 是基于 Android WebView 的常规应用程序。不同之处在于它运行的是在 React-Native 运行时中运行的共享 JavaScript 代码库。我们的隐私保护功能(例如广告拦截和反跟踪功能)在 React-Native 线程中运行,并且还能够拦截系统 WebView 中发送的网络请求。我们通过这种独特的方法提供这些功能,同时又无需派生完整的浏览器引擎。 Ghostery Android:在 Ghostery 与 Cliqz 联合之后,我们决定升级 Ghostery Android 浏览器。我们的目标是在手机上提供完整的 Ghostery 体验,因此我们决定在 Firefox 上 构建新版的 Android 浏览器(名为 Fennec)。在此次构建中,我们充分利用了 Firefox Android 提供的 WebExtension。这基本上是在模仿我们桌面系统的做法。 Fennec 是一项伟大的工程项目,基本来说其本质是 Firefox,只不过是面向移动设备。它拥有 Gecko 渲染引擎和 SpiderMonkey JavaScript 引擎。最重要的是,它具有原生的 Android UI,可提供熟悉的外观。 不幸的是,Fennec 的开发是一个非常复杂的过程。开发人员必须不断地在不同层面和技术之间来回跳转,才能实现新功能或修复 bug。没有多少开发人员能够有效地在 C++、JavaScript 和 Java 之间切换。 Mozilla 社区都明白 Fennec 架构的局限性,因此该浏览器于 2019 年退休。 新一代 Cliqz 浏览器:根据 Fennec 的经验,Mozilla 社区创建了一个全新的体系结构来创建 Android 浏览器。它的核心是 GeckoView。这是一款精心封装的浏览器引擎,拥有精心制作的 Java API。任何开发人员都可以借助 GeckoView,创建 Gecko 支持的浏览器,同时又无需编写 JavaScript 或 C++ 代码。GeckoView 只是一个 " 库 ",就像与 Android 一同发布的 WebView。 但是 GeckoView 能够运行 WebExtensions,因此,很适合我们公司。我们可以在 GeckoView 之上构建漂亮的浏览器 UI,并以 WebExtensions 的形式发布共享的 JavaScript 代码库。这样一来,我们就可以借助我们迅捷的广告拦截器,在速度方面与 Chromium 竞争,并从隐私保护的各个方面超过 Chromium 。 iOS 苹果的 iOS 平台也大不相同。用户无法选择默认浏览器,浏览器供应商也无法构建自己的渲染或 JavaScript 引擎。所有开发人员都必须使用常规的 iOS WebView(WKWebView)。所有浏览器供应商都必须受制于这种限制:Mozilla 甚至 Google 浏览器都 " 只是 " iOS 应用程序。 从根本上来看,我们的浏览器没有什么不同。我们利用 Firefox 建立了 iOS 分支,为我们的浏览器建立了一个稳定的基础。为什么选择 Firefox?因为这是一个开源、非常可靠、久经考验的项目。但这不是唯一的选择:DuckDuckGo 也将是一个不错的选择。 由于 iOS WebView 不具备运行扩展的功能,因此我们不得不自己动手创建一个。同样,React Native 提供了解决方案:我们创建了一个混合应用程序,该应用程序运行的浏览器核心是经过我们大量修改的 Firefox 代码库中的 React Native。 值得一提的是,我们已经在 Firefox 之上建立了三个 iOS 分支,我们在建立分支时采用了不同的策略: 1. 与上游的同步很少的 " 软 " 分支:事实证明,我们所做的实质性更改主要围绕 WebView,因此维护难度非常大。我们选择修改 Firefox 代码,并使用虽然有年头但功能更强大的 UIWebView 来提供隐私功能; 2. 常规同步的 " 软 " 分支:失败了,因为这限制了我们根据自己的喜好来设计浏览器的能力; 3. 使用 cherry-pick 方式选择性同步的硬分支(当前版本):这是到目前为止开发人员最喜欢的分支,因为你可以自由修改,同时不必担心与上游发生冲突。 请注意,iOS 版的 Firefox 并不是一个发展速度非常快的项目。因此手动选择安全修复程序仍然可行。 (编辑:应用网_阳江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |