记一则Chrome与Unity(11.10)整合问题的修复

Unity作为Ubuntu的主打桌面环境,在与各种应用软件的集成度上在有着天然的优势。比如Launcher的Thunderbird会显示未计邮件数,Chrome浏览器则会在Chrome下载东西的时间显示当时下载的数量及进度条。

然而在Ubuntu 11.10当中,这个整合性在Chrome上却不见了。开始我以为这是Unity的bug,然而作为一个Hacker,是不能这样胡乱猜测的…于是我开始了Chrome源码之旅……

在Chrome(具体说是开源的Chromium当中),我找到了与Unity整合相关的源码,在「chrome/browser/ui/gtk/unity_service.cc」中,有这么一句:

void* unity_lib = dlopen("libunity.so.4", RTLD_LAZY);
  if (!unity_lib)
    return;

答案已经很明白了,是Chromium利用dlopen的形式动态加载libunity的库以整合进Unity环境当中,并且在后面的代码里利用了「dlsym」来调用具体的function。

Chromium写死了「libunity.so.4」,这是Ubuntu 11.04提供的libunity版本,而在Ubuntu 11.10当中,已经没有这个了,而是:libunity.so.6。

这时Workaround也想到了,只需要链接一个libunity.so.6至libunity.so.4,Chrome又能与Unity很好的工作了,如图:

Workaround只是方便自己,最好还是将这个问题解决在上游当中,毕竟解决这个问题也不难。由于没那么多时间去学习Chromium的patch提交流程,还要花很多时间去设置开发环境。因此我只是简单的报了一下Bug:Issue 101857: Ubuntu Unity integration needs update

如果有哪位认识Google的Chromium工程师,或者有提交patch经验的,可以帮助加快修复这个问题,这样我们就能下个版本的「Google Chrome 16」中见到它与Unity的完美整合了!

一些想法:

  • 直觉和经验判断可能是错的:因为之前对Unity的印象(bug多),所以出现问题我第一时间就想到是Unity的问题,而事实并非如此;
  • 面对一个巨型项目,hack也不难:Chromium是一个异常巨大的开源浏览器项目,想掌握它的源码可是要费不少功夫。但是越是这样的的大项目,其结构组织就越有条理,如果只是修正一个小问题,是很容易找到着手点的。

所以分享这么一个小故事,只是想跟大家说,开源项目与闭源项目一样,都会有各种各样的问题,但是开源项目给了你修正这些问题的可能性。碰到问题的话,可不要撒手不管,抓住这么个机会来锻炼自己吧,即使报告一个bug,也是对自己和对整个项目生态圈都是有帮助的。


你可能感兴趣的:(chrome,unity,11.10)