Chromium for Android
在前面的Chromium的移动版章节中,我们对Chromium的Android版作过简单介绍,本章则进一步阐述其中的细节。
2012年,Google发布了第一版的ChromeFor Android。该产品受到了巨大的关注,但是同桌面版的Chrome浏览器不同地是,它的源代码并没有被开源出来,而且也不是跟随最新的Chromium Trunk代码,而是基于很早一个chromium稳定版-18。
在刚开始的时候,Google每隔一段时间会放出一个压缩包,里面包含Chrome For Android所有的C++代码,而Java相关的代码则没有放出来(其实放出了一部分代码,但是UI部分则没有),因而你没有办法编译出来一个类似桌面版Chromium的浏览器。不过,你可以利用Google释放发出的代码来编译一个C++动态库(情况有些变换,现在你可以使用最新trunk上面的代码来编译一个这样的库了),来替换发布的APK包中相应的动态库,这样你就能生成一个自己定制的浏览器APK。如果你不是很在乎UI层和浏览器的丰富功能,还有一种方法可以让你编译一个简单的浏览器,那就是利用chromium代码直接编译出两个APK -Content Shell和Test Shell,它们界面非常简单,但是它们都可以渲染网页并拥有基本上所有Chrome For Android的HTML5功能。
听起来令人迷惑,不是吗?好了,让我们通过下面的图来理解它们吧。
上图的层次结构非常清楚。从图中可以看出,它们都是基于Content模块/Content API/ContentView,而这是渲染网页和支持HTML5功能的核心,所以很大程度上来讲,在HTML5的支持上,它们不仅很类似,而且代码都是相同的,因而分析Content Shell或者Test Shell可以帮助你理解Chrome for Android的网页渲染和HTML5功能。
在上图的最上面一层,除了Browser是看不到它的代码以外,其它的你都可以在chromium的开源社区中找到它们的源代码并可以尝试编译它们。至于如何编译它们,请见参考文献1,支持编译Android的ARM版和IA版。
Content Shell 和TestShell
这两者都是在content模块上构建的简单浏览器,怎么个简单法呢,简单到界面就是一个URL输入框附加一个页面显示框,功能就是显示个网页,至于其它功能,抱歉,它们基本上都没有提供,而且这也不是它们的目标。
从界面上来看,目前两者没有什么区别,但就其目的和功能上来说,我的理解它们还是很不一样的:
Content Shell是直接在content模块之上的,其主要目的是测试content API/ContentView等模块的正确性; Test Shell虽然也依赖content模块,但是它还依赖于chrome浏览器的很多基础设施和组件(android平台的chrome内核),更像是测试它们的一个简单浏览器,因为chrome for android的UI部分不开源,所以Test Shell应该是最接近它的一个工具,可以帮助理解chrome for android的架构和内部原理。
Android的WebView
使用Chromium的内核来实现Android的WebView机制,这个后面单独介绍。
同桌面版的不同之处
Chromium的Android版同传统的桌面版有很多不同的地方,具体包括以下几个方面: 首先是工作模式方面,Chromium的桌面版一直紧跟trunk,有着不同的发布渠道,包括dev,beta,stable等。而Android版则是基于某个稳定版在内部开发,然后不定期的释放出一些代码,其并没有同最新的Chromium同步(最近才开始保持同步)。
其次是开源方面,Chromium桌面版都是开源的,但是目前来看,Android版只是开源了部分,就是Content模块和以下,浏览器的一些功能模块,而UI部分则没有而且在可以预见的未来也不会开源。
再次是架构方面,首先是GPU进程变成为browser进程的一个线程,其次是线程化合成已经是Android版的一个默认功能。见下图所示,你可以跟“多进程模型”中的进程模型图进行对比一下。
然后是安全机制,对于Android平台来说,沙箱模型有些不一样。在Android4.1之后,引入了进程的isolated UID机制,这就为Chromium的renderer进程提供独立开来的可能性。每个Renderer进程都有唯一的UID,因而它们之间和Browser进程互相不能访问,直接被隔离开来。
之后是渲染部分,特别是GPU硬件加速部分也有很多不同,以后会一一介绍他们。 最后是功能方面,同桌面版比较,一些功能如HTML5,插件,NativeClient,extension等目前都不支持。
源文件目录
content/public/android/ content模块中的android接口,例如contentview等 content/shell/android Contentshell相关类 chrome/android TestShell的相关类 android_webview/ 该目录包含实现Android系统当前WebView接口所需的内部实现类,基于Chrome的内核
参考资料
- https://code.google.com/p/chromium/wiki/AndroidBuildInstructions