记一则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,也是对自己和对整个项目生态圈都是有帮助的。