查看原文
其他

是的,Android版Edge浏览器支持Extension(插件/扩展)了

郭霖 郭霖
2024-07-19


有些小伙伴的消息渠道实在过于灵通,所以这件事我也不用藏着掖着了。


(此处插件指的就是Extension,虽然Extension最标准的翻译应该是扩展)


其实Extension这个功能我们是想要先小范围秘密推出,看看数据再说的。没想到一些海外的极客博主,在我们发布带Extension功能版本的当天,就把隐藏的这个开关给找到了,并立刻引起了很多的新闻报道,这个功能也就藏不住了。



是的,这个功能就是我做的。关于这一点,连我自己都未曾想到过。


长期以来,支持Extension一直是Android版Edge浏览器最强烈的用户呼声,我们内部收到过很多类似的用户反馈。我自己的公众号上也曾有不少朋友留过言,希望Android版Edge能支持Extension。



那个时候,我还能很耐心地跟大家解释为什么Edge Android不支持Extension,反正这个功能和我也没什么关系嘛。


有趣的是,你永远不知道明天会发生什么。


2021年底,我们部门来了一位新同事,jiayi。jiayi最早在腾讯做QQ浏览器,之后又去了猎豹浏览器,再后来又去过阿里和快手,现在来到了微软Edge浏览器。


jiayi担任的岗位是Android端架构师,所以他一开始做的也是一些偏基础架构之类的工作。后来我听说他准备去搞Android端的Extension,这就太牛了,Extension可是自从我进入Edge项目组之后就时不时听说的超级难题,确实得是架构师级别的才能搞得定。


结果在2022年底,Edge项目组进行了一次组织架构调整,jiayi不再任职架构师了,而是成为了基础架构组的Manager,还把我划到了他的组里。


新组成立,Manager要和每个组员单独聊天沟通,俗称1:1。jiayi当时找到我,就跟我说:“郭神,Extension就交给你了啊。”



澄清一下,这活确实不是我主动要求的,但却是我主动接下的。因为当时如果我拒绝的话,是可以安排我到其他组继续做传统Android开发的。


但是对于我来说,这是一个非常大的挑战。如果做成功了,不仅能够产生巨大的影响力,同时还能让我跳出Android的技术栈,扩展自己的技术领域(Extension主要是用C++开发的)。


这活我接了。


考虑到接手之前别人的研究成果总比自己从零开始强,于是我问jiayi之前研究到了哪里,我可以继续接着搞。结果jiayi说,这不是一直太忙了么,还没开始研究呢。。。



不过jiayi还是给我提供了一个重要信息,那就是Android上的Kiwi浏览器是支持Extension的,并且Kiwi还开源了自己的代码。


于是我去查看了一下Kiwi的源码,好消息是,它确实成功支持了Extension。坏消息是,开源的代码已经是4年前的版本了,和现在Chromium的代码差距巨大。


因此,指望着靠照搬Kiwi的代码来让Edge支持Extension是不可能的事情了,但是我仍然从Kiwi的源码中受到了很大的启发。


因为本质上来说,我们并没有想要去发明Extension这个东西,Extension本来就在那里,只是Google不允许它在Android上运行而已。所以我们要做的事情,就是要把PC平台现有的Extension代码给带到Android平台上。


那么具体要怎么带呢?这时我去参考了一下Kiwi的思路:



这是一段GN代码,在Chromium当中,GN可以用来进行编译配置,指定哪些文件参与编译,哪些文件不参与。


而上述的代码中,注释里很明确写了!is_android,也就是说这些代码是不给Android使用的。但是Extension却又依赖这些代码,所以Kiwi使用了if (true),来把这些代码强制带到Android平台上。


不得不说,Kiwi的这种做法虽然暴力,但确实管用。我在思路上进行了部分借鉴,不过写法要远比Kiwi更加优雅,不然这种写法在微软的代码审查上也是过不去的。


当然这只是一个非常简单的例子,事实上Extension的代码量极其庞大,依赖关系错综复杂。我在整个的实现过程中能深深感受到,Google是完全没打算让Extension能在Android上运行,才会把代码写成这样。所以有小伙伴还期待着Chrome Android能支持Extension的,短期内就不要想了。


另外,只是把Extension相关的代码带到Android平台上并不算完。要知道,带进来的这些代码都不是为Android平台设计的,必然会出现海量的编译错误。


因此,接下来才是更加困难的部分,就是如何让这些Extension关联的代码在Android上能够编译通过。


这个就没有什么特别好的办法了,只能一个一个错误地去解决。


Chromium项目在编译的时候可以通过一个-k number的指令,告诉编译器遇到多少个编译错误之后才停止编译。我把这个数字调到了1000都不能一次性编译完整个项目,可见引入了Extension之后会带来多少的编译问题。


这些所有的编译问题一共花两个多月时间才全部处理完。两个多月时间,只是为了让项目能够编译通过,大家可以想象一下这个过程有多艰辛。


当然,即使所有的代码都编译通过了,也仅仅意味着Extension相关的代码被带到了Android平台上,这和可以在Android平台上能够正常使用Extension仍然是两回事。


因此,接下来的一段时间,我还要对Extension的具体功能进行开发调试,验证整体的Extension框架能否在Android平台上正常运行。不过相比起来,这已经算是回归到比较正常的软件开发流程了,之前做的那些事情才真的是整天摸着石头过河。


最后闯过无数难关,我终于做出了一个能够在Edge Android上运行Extension的Demo,这个项目到这里才算是正式立项。


之后就是以正规的流程去开发这个项目了,但仍有非常非常多的事情要做,包括功能开发、代码质量审查,安全性隐私性审查,应用性能检测等等等等一系列的事情。另外,Extension改动的还基本都是桌面端的代码,因此还需要Edge美国团队和印度团队的成员来检查我这边的改动。总之没有一件事情是不花时间的。


最后从上线的日期来看,这距离我接手这个项目已经过去了一年左右的时间,这一年时间里我就只做了这一件事。


不过如此困难的一个项目,功劳也并不都是我一个人的。有许多同事在期间参与到了这个项目当中,并给我提供了帮助。


这里首先我要特别感谢我们组的一位同事,wadai。


wadai差不多参与了半个Extension项目的开发过程,帮助我解决了很多高难度的技术问题,并且还在这个过程中发明出了GN Overlay这种对Edge开发具有重大意义的技术。


我记得在解决编译问题的后期,有大约3000+ undefined symbol的报错。基本就是我们俩一人分一半,逐个解决的。光处理这些问题就得花上至少两周以上的时间,枯燥又乏味,但我们就是这么趟过来的。


另外要感谢的就是jiayi,虽说jiayi没有参与这个项目的研发,但是他作为Manager的一些决策直接决定了这个项目的成败。


开发进入中期的时候,我发现Chromium在Extension的设计上并没有做到很好的独立性,其实它是依赖于很多模块的。而Edge桌面端又会在这些被依赖的模块里做很多自己的功能,最后把Extension带到Android上的同时,我也几乎把半个Edge桌面端的功能都给带到Android上了。


这个事情对我当时打击很大,因为代码写成这个样子,PR文件改动数甚至达到了1000多个,就算Extension真的在Android上能跑起来了,我们也绝无可能上线。那个时候我甚至觉得这是一个注定要失败的项目,想要中途放弃了。


jiayi在这个时候做出了非常重要的决策。他让我先不要管代码写的合不合理,优先就是去实现一个能在Android上运行Extension的Demo,代码后期都可以再进行优化。哪怕是后期真的没有优化空间,这东西就是做不了,我们出过一个可运行的Demo,也比现在什么都没有的情况下结束项目强。


事实上也正如jiayi所说,我们在后期做了很大程度的代码优化工作,最低时PR的文件改动数仅剩200多个。扫清了这些障碍,Extension项目才得以顺利上线。


我还要感谢Edge美国团队的Kevin。Kevin是Edge桌面端的架构师,在我们开发Android端Extension的时候给了我们巨大的帮助。


Kevin特别喜欢中国的文化,他还关注了我的公众号,因此这篇文章他很有可能会看到。


Hey Kevin, I would like to give you a big thanks for everything. The Android Extension is here because of your help.


当然,还有很多同事我是想要感谢的,但是感觉不能再写下去了,再写这篇文章就要成感谢大会了。


回到正题,接下来得好好跟大家介绍下Edge Android上的Extension功能到底如何使用。


这个功能还在慢慢灰度中,因此没有被灰度到的朋友现在可能还看不到。


这里我教大家一个快速体验的办法。首先确保你的浏览器是最新的Edge 122版本,如果还没安装Edge的话可以通过下面的二维码快速安装:



然后在Edge的地址栏输入edge://flags,你会看到如下界面:



这个界面是Edge用于配置一些实验性功能开关的界面,里面显示的都是目前Edge正处于测试阶段的一些功能。


接下来在这个界面的搜索框当中输入android extension,如下所示:



然后将这个功能的开关打开,选择Enabled选项即可:



当你选择了Enabled之后,底部会弹出一个提醒告诉你重启浏览器来使开关生效。


重启之后,依次访问:底部工具栏菜单键->右滑至菜单第二页->全部菜单,在这里你就能在最下方看到一个新的扩展入口了。



点击扩展可打开我们为Android平台专门设计的扩展商店页面,目前有3款扩展程序可供大家安装使用:



这3款扩展程序都是非常热门且实用的,接下来我向大家分别演示一下它们的用法。


第1款,Dark Reader。它是用于将网页渲染成深色模式的。


作为Android开发者,我相信大家应该都知道如何让自己的App适配深色模式。但是浏览器是一个很特殊的App,虽然浏览器的外观可以用传统的方式去进行深色模式适配,但是浏览器显示的网页我们却是没有办法控制的。


因此,很多浏览器用户在夜间浏览网页时其实都是比较刺眼的,体验并不友好。


而Dark Reader则是专门用于解决这个问题的扩展程序,它有一套颜色算法可以对网页里的浅色元素进行反色,从而让任何网页内容都变得非常适合在夜间浏览。


安装Dark Reader后打开网页的效果如下图所示:



另外我们还可以通过如下路径来操作已安装的扩展程序:底部工具栏菜单键->右滑至菜单第二页->全部菜单->扩展,现在你会看到刚刚安装好的Dark Reader:



点击Dark Reader,将会打开扩展程序的弹窗界面,在这里可以对该扩展程序进行更多的功能控制,比如开启和关闭Dark Reader,或者针对某一个网站开启和关闭等等。



我最喜欢的一个功能就是,点击Auto,让它跟随系统的深色模式自动开启和关闭,这样就能做到系统全局的深色模式效果了。


第2款,uBlock Origin,广告屏蔽神器,用过的都知道它有多牛逼。所以这里我主要给没用过的朋友们做个简单的科普。


不知道大家玩不玩Steam游戏,玩的朋友可能都听过这个梗,没有人能在百度下载到正版的Steam,因为搜出来的全是广告。



当然现在百度已经良心很多了,至少在第二条结果给了个官网的链接,但其他结果仍然都是广告。


现在我们安装一下uBlock Origin这个扩展程序,然后再次尝试在百度搜索Steam。



可以看到,现在搜索出来的结果变得非常清爽,基本都是官网链接,广告都被屏蔽掉了。


这里再告诉大家一个网站可以专门用来测试广告屏蔽的效果,adblock-tester.com。


uBlock Origin在这个网站能够获得96分的高分,可见其广告屏蔽能力是非常强的。



第3款,Global Speed,视频倍速控制器。任何在浏览器播放的视频都可以用它来控制播放速度。


B站的二次元用户们应该都很喜欢倍速播放这个功能,二倍速播放就能打开一个全新世界的大门。


Global Speed这款扩展程序则将B站的这个鬼畜功能应用到了所有的视频网站,可以说是相当哇塞了。


这里我以播放抖音视频为例(不知道吧?在浏览器里也是可以刷抖音的),安装好Global Speed,然后打开它的弹窗界面,就能对视频播放进行倍速控制了。



怎么样,这3款扩展程序是不是既实用又好玩?


但是也一定有朋友会说,才支持3款扩展程序也太少了吧。


没错,少是少了些。但是,只支持3款扩展程序,和只能支持3款扩展程序是两回事。


因为从能力的角度上来说,我们是把桌面端Extension的能力近乎全部都搬到了Android平台上,也就是说桌面端能安装的扩展程序,讲道理在Android上都能安装。


但是要知道,这么多的扩展程序,它们可能之前并没有考虑过还能在Android平台上运行,也没有对移动端进行过专门的适配。因此即使能安装这些扩展程序,在运行时也或多或少会出现一些问题。


也正是因为这个原因,我们采取了精选策略,先提供给大家经过我们严格测试的扩展程序,保证它们在Android上的用户体验是足够好的。


然后我们会一步步扩大支持范围,让更多的扩展程序能够登陆Android平台。


最后的长期目标是开放开发者生态,让广大的开发者们都能够在Edge Android上发布自己开发的优质扩展程序。


当然这个规划非常长远,目前我们还只是在第一步。至于后面每一步能不能走好,需要广大的用户和开发者们一同参与进来,多多给我们提出宝贵的意见。


如果你对我今天介绍的这些内容感兴趣,那么不妨扫描下方二维码下载最新版的Edge浏览器体验一下吧。



推荐阅读:
我的新书,《第一行代码 第3版》已出版!
我为Android版Microsoft Edge所带来的变化
在微软工作365天,还你一个我眼中更加真实的微软
在微软工作100天,谈谈我眼中的微软

欢迎关注我的公众号
学习技术或投稿


长按上图,识别图中二维码即可关注
继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存