如何利用Chromium For Android开发Android浏览器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何利用Chromium For Android开发Android浏览器相关的知识,希望对你有一定的参考价值。
应用层次概念图layers 每个盒子代表一个概念中的应用层。通常情况下应该有可能通过替换任意一层及其上层组建来生成一个新的浏览器。因此,没有任何层应该与其更高层次有依赖关系。 WebKit的:Safari,Chromium和其他所有基于WebKit的浏览器都使用Webkit作为渲染引擎。WebKit Port是WebKit的一部分,处理与具体平台相关的操作,如资源加载和图形。 Glue: 将WebKit类型转换成Chromium类型 。这就是我们的“WebKit嵌入层”。这是浏览器Chromium和test_shell(允许我们测试WebKit)的基础。 Renderer/Render Host: 这是Chromium的“多进程嵌入层。”由它代理传递跨进程的消息和命令。你可以想象,其他的多进程浏览器也可以使用这一层,它对其他的浏览器服务没有依赖。 Tab contents: Chrome的特有层,来表示标签显示的内容。它与应用服务绑定, 例如密码管理器和history系统。本层不应该假设它嵌入在Chromium浏览器窗口中(还有其他Chromium组件如”html对话框“使用本层)。 浏览器:展现浏览器窗口,它嵌入了多个TabContentses。 WebKit 我们使用 WebKit这个开源项目来展示网页。此代码主要是由Apple编写的并存放在/third_party/WebKit目录中。WebKit主要包括两部分:“WebCore”负责核心布局功能,“javascriptCore”用来执行JavaScript。我们只将JavaScriptCore用于测试目的,通常我们使用高性能的V8 JavaScript引擎取代它。我们实际不使用苹果称之为“WebKit”的软件层(译注:就是WebKit/Source/WebKit目录下的内容,Webkit/Source目录下同样有WebCore和JavaScriptCore目录),这个软件层用在如Safari这样的应用程序中,用来衔接WebCore和OS X。为了方便,我们通常将从Apple获取的代码称作“WebKit”。(译注,其实只使用了WebCore) The WebKit Port 在最底层,我们有我们的WebKit“Port”。这是我们实现的平台相关的代码,它用来衔接平台和WebCore。这些文件位于WebKit目录中,通常在Chromium目录中或者以Chromium为后缀名。实际上Port的大部分代码不是和操作系统相关的:你可以把它看成是WebCore的Chromium Port(译注:用来衔接WebKit和Chromium的)。有些部分,如字体渲染,必须针对每个操作系统平台分别处理。 网络流量是由我们的多进程资源加载系统处理的,而不是由渲染进程直接调用操作系统完成。 图形使用为android开发的Skia图形库。这是一个跨平台的图形库,原生的处理除了文字以外的所有图形、图像。Skia位于/third_party/skia。图形操作的主要入口点是 / WebKit/port/platform/graphics/GraphicsContextSkia中。这个对象表示一个网页。它处理所有从浏览器进程出入的与导航有关的命令。它继承自RenderWidget,负责提供绘画和输入的处理。RenderView通过全局的(对每个渲染进程来说是全局,即每个进程一个)RenderProcess对象与浏览器进程通信。 常见问题:RenderView和RenderWidget的有什么差异?RenderWidget通过实现名为WebWidgetDelegateglue层的抽象接口WebWidgetDelegate映射到一个的WebCore::Widget这基本上是屏幕上的一个窗口,它绘制窗口并接收窗口中的输入事件。RenderView从RenderWidget继承,它表示一个标签或弹出窗口的内容。它处理所有导航命令并完成窗口绘制和响应输入事件。只有一种情况下如RenderWidget独立于RenderView存在:网页上select boxes。它是个有向下箭头和很多选项的弹出列表。在选择框必须使用原声窗口渲染,以便他们能够在显示在其他东西之上,并在必要时弹出框架。这些窗口需要绘制并接收输入,但是他们不是一个单独的“网页”(RenderView)。 渲染器中的线程 每个渲染器中运行着两个线程:渲染线程和主线程。渲染线程是RenderView和其他所有的WebKit代码运行的线程。当它和浏览器之间进行通信时,首先将消息送到主线程,然后主线程再将消息传递给浏览器进程。只有主线程收到浏览器的回复之后渲染才可以继续进行,这样可以使我们同步地将消息从渲染器传递给浏览器。例如,当页面中的JavaScript请求cookie时,渲染线程将被阻塞,主线程将所有收到的消息放入队列直到接收到浏览器的正确回复。在这期间收到的任何消息都将按照顺序发送给渲染线程进行处理。 浏览器进程 rendering browser 浏览器进程的底层对象 所有和渲染进程之间的通信都通过浏览器进程中的I/O线程实现的。它同样也处理所有的网络通信,这样可以不阻塞用户界面。
当主线程初始化RenderProcessHost完毕后(用户界面运行时),它建立新的渲染进程并新建名为ChanelProxy的IPC对象通过命名管道与之通信。这个对象运行于Browser的I/O线程中,监听连接到渲染进程的命名管道,并将所有消息转发到UI线程的RenderProcess对象。ResourceMessageFilter会过滤掉能够直接执行的I/O处理消息,比如说网络请求。过滤使用ResourceMessageFilter::OnMessageReceived方法。 Ui线程中的RenderProcessHost负责分发所有显示相关的消息给RenderViewHost(同时它也会处理有限的几种非显示相关的消息)。消息的分发在RenderProcessHost::OnMessageReceived函数执行。 浏览器进程的高层对象 显示相关的消息会进入RenderViewHost::OnMessageReceived。大部分消息在这里处理,其他的则被转发到RenderWidgetHost。渲染进程中有两个对象对应到RenderView和RenderWidget对象。在Microsoft Windows上,对于每个RenderWigetHost都有一个RenderWidgetHostHWND与之对应,这个类专门负责管理消息事件并绘制原生的HWND。其他系统上也有类似的负责原生输入和绘图的对象。 在renderView/Widget对象之上是WebContent对象,大部分的消息都是在这个对象中响应的。WebContents表示一个tab中的内容。它继承自通用的TabContents对象(还有其他集中TabContents的子类,比如下载页面或历史页面)。它是大部分导航和顶层浏览器UI更新的结合点(switching point)。 FAQ:为什么要分离WebContents和RenderViewHost对象?
原因有二:这两个对象提供不同层面的功能。 参考技术A 问题要从引擎部分和Java界面部分来看。引擎部分,不准确的说,就是非Java部分的代码,是可以用于一个稳定的产品的。但是Java界面部分的代码,Chromium for Android只是提供了一个很简单的演示程序。距离具体的产品,还是有很多工作要做的。
自定义 chromium 源代码为 android 创建自定义浏览器
【中文标题】自定义 chromium 源代码为 android 创建自定义浏览器【英文标题】:Customizing chromium source code to create a custom browser for android 【发布时间】:2012-03-27 10:17:30 【问题描述】:我想为安卓创建一个新的网络浏览器,但是这个浏览器不像普通的网络浏览器。这仅对打开本地(html、css 和 js)文件以及执行一些本地任务(如磁盘读取、播放音乐等)有用。它不会打开任何 Web URL。
所以我想定制铬源代码。如何根据我的要求定制它?
我下载了 chromium 源代码并使用 ubuntu linux 构建。但它有很多项目和目录。我试图在this link 的帮助下理解源代码架构。但是我很困惑,因为该链接中提到的某些文件在源代码中不可用。
如果有人知道铬移植和定制,请帮助我。谢谢。
【问题讨论】:
【参考方案1】:为什么您不为此目的使用 WebKit。许多使用这个网络引擎的网络浏览器也是你的铬。 http://developer.android.com/reference/android/webkit/package-summary.html
【讨论】:
以上是关于如何利用Chromium For Android开发Android浏览器的主要内容,如果未能解决你的问题,请参考以下文章
ubuntu10.04 firefox 总卡死 换chromium好点,但只要开flash player还是会卡死,也不能用virtualbox了。