踏破铁鞋无觅处

最近学习Chromium的UI渲染,于是编译一下ui/views/examples的例子工程来看看。运行views_examples_exe,发现界面是上下颠倒显示。 一开始以为是例子工程可能好久没有维护了,在代码升级的过程中出了偏差,导致界面颠倒显示。于是自己动手写了一个例子工程,也是颠倒显示。看了下aura_demo工程界面的坐标,显示也是颠倒。我意识到这不是Aura层的问题,可能是CC模块通过GPU硬件加速渲染出来的结果本身就是颠倒的。 我家虚拟机里有Chromium... Read More | Share it now!

Chromium fast start机制

我们知道Chromium有一个Browser进程,多个Renderer进程。如果已经运行了Chromium浏览器,再通过快捷方式启动浏览器,会打开新的浏览器窗口,显示新标签页。或者创建一个新的浏览器进程,给它传递一个url参数,比如https://www.baidu.com/,就会在现有的窗口里面打开一个百度的页面。查看浏览器的进程,发现仍然只有Browser进程,那么第二次创建的新创建的进程哪里去了呢? 这就是Chromium的fast... Read More | Share it now!

Chromium多线程

之前也写过Chromium多线程相关的博客,就不再重复了。这两天基于Chromium50画了一下Thread相关的图,想到了一个恰当的比喻,分享一下。 这是相关的类图。 我们把线程Thread比喻成一个机器人,我们告诉机器人怎么做事,那我们就可以跟机器人并行做一些事情。 我们把要做的事情按照协议打包成一个Task,这个Task包含各种所需的信息,机器人拿到Task就知道该如何做事。打包Task就是使用base::Bind接口返回一个无参数无返回值的Callback,这样特殊的Callback称之为Closure。 一开始机器人是出于关机状态的,所以需要调用Thread::Start开动机器人。然后机器创建一个UI交互界面MessageLoop,我们可以通过task_runner给这个MessageLoop... Read More | Share it now!

Chromium静默安装扩展

Chromium有非常强大的扩展系统,很多功能可以通过扩展实现,比如广告过滤,购物比价。所以开发Chromium功能,不一定需要修改Chromium的C++源代码,只需要做一个扩展就可以了。 通过Chromium的扩展来增强浏览器功能,有多个优点: 功能耦合低。浏览器客户端只需要提供相应的接口API,扩展去调用相应的接口API即可。 开发客户端接口API和开发扩展可以并行。另外Chromium有完善的扩展系统,调试等等都非常方便。 升级独立。以后升级扩展就可以升级功能了,而不需要升级整个浏览器。 开发速度开。因为扩展大多数是用的web开发技术,就是html和js,所以开发起来很快。而修改Chromium的c++代码则复杂很多。 随着Chromium安全策略的收紧,一般来说,只能通过Chrome的应用商店来安装扩展,禁止其他扩展静默安装。https://developer.chrome.com/extensions/external_extensions根据这篇文档的描述,浏览器想内置一些扩展限制很多,比较麻烦。如果自己定制浏览器,想默认安装一些扩展,不是很方便。 其实,如果改代码的话,就没有任何限制,直接调用extensions::CrxInstaller去安装。下面是静默安装本地crx扩展文件的例子: 以前大概是2015年前,Chromium也是可以静默的安装内置的扩展的,现在代码里面需要改一点也是支持的。 把我们需要内置的扩展放到chrome/browser/resources/default_apps里面,这个目录已经有了几个其他的内置扩展,比如docs.crx、drive.crx等等。 此外需要在external_extensions.json里面添加我们扩展的信息。 当浏览器启动的时候,ExtensionService会调用default_apps::Provider会按照external_extensions.json的描述去安装我们内置的扩展。   ... Read More | Share it now!

利用Tracing阅读Chromium代码

Chromium中的Tracing工具可以记录每个函数的执行时间,是用来诊断浏览器性能问题的工具。它还有一个意想不到的用处,就是帮我们理解Chromium的代码,因为Tracing会把调用过的函数按照时间轴输出出来,通过Tracing的图形化界面,可以很清楚的明白对象函数之间的调用关系。 components/tracing/tracing_switches.cc代码文件的注释很清楚了介绍了Tracing命令行参数的用法: trace-config-file。这个开关指定Tracing命令行的配置文件,Tracing既可以通过命令行字符串设置配置,也可以通过加载一个配置文件来设置配置。 trace-shutdown。记录浏览器关闭时候到的Tracing信息。 trace-shutdown-file。把trace-shutdown记录的信息保存到一个指定的文件中。 trace-startup。记录浏览器启动时候的Tracing信息。 trace-startup-file。把trace-startup记录的信息保存到一个指定的文件中。 trace-startup-duration。设置trace-startup记录的秒数。 另外在trace-startup、trace-shutdown里面可以设置记录的Tracing类别,比如–trace-startup=base,net,就只会记录base和net类别的Tracing。 比如把以下命令行参数传递给浏览器: 它会记录浏览器启动的时候的Tracing信息,包含browser、content、input、renderer、renderer_host、startup、ui类别,记录10秒的数据,并把数据保存到tracing.json文件中。 然后浏览器地址栏中输入chrome://tracing/,点击左上角的Load按钮,加载我们生成的tracing.json数据文件,然后浏览器就会把数据以图形的样式展现给我们,如下图所示: 图中清楚显示了浏览器启动时做的各种初始化的工作,以及各种工作的先后次序。 Tracing中的数据是根据代码中的TRACE_EVENT宏收集到的: 我们也可以增进自己的数据,宏的第一个参数是类别。 ... Read More | Share it now!

减小Chromium二进制文件大小

前几天有人在Chromium-dev抱怨Chromium的二进制文件体积太大了,有没有什么办法可以减小大小。 遗憾的是,开发者说没办法,Chromium本身就是有很多特性,要是能够优化,早就优化了。 有趣的是有个人改变了common.gypi里面编译器选项,从速度最优改成大小最优: 据说能够优化20%的大小,下面是他的优化数据。 优化前: 43,021,824... Read More | Share it now!

搭建Chromium代码镜像

动机 做Chromium浏览器开发有件比较蛋疼的事情是获取Chromium代码。Chromium代码仓库一是比较大,依赖的东西很多,二是它的服务器都在国外,国内往往连不上。因此我想利用一台能够直接访问chromium.googlesource.com的服务器做为googlesource的镜像,我直接通过镜像来同步代码。 配置镜像服务器 https://chromium.googlesource.com/chromium/src.git是Chromium代码的主仓库,它依赖70多个第三方仓库,最方便快捷的方式就是利用cache-dir机制来一次性获取所有代码仓库。 获取depot_tools Chromium代码都是用depot_tools工具来管理,所以第一步就是要获取这个工具。在/chromium目录里面运行:git... Read More | Share it now!