这个项目用来演示如何使用 chromium 中的一些基础机制,包括异步多任务,mojo,多进程等。
提示:如果你是 chromium 的新手,建议按照顺序学习这些 demo。
Demo 列表:
demo_exe
: 最简单的 demo,演示 gn 及创建自己的 exe;demo_log
: 演示使用日志库;demo_tracing_console
: 演示使用 Trace 输出到控制台;demo_tasks
: 演示使用线程池 ThreadPool;demo_messageloop
: 演示使用消息循环 MessageLoop;demo_mojo_single_process
: 演示在单进程中使用mojo
库;demo_mojo_multiple_process
: 演示在多进程中使用mojo
库;demo_mojo_multiple_process_binding
: 演示在多进程中使用mojo
库的 binding 层;demo_services
: 演示使用基于mojo
的 servcies 及多进程架构;demo_ipc
: 演示使用基于mojo
的 IPC 接口;demo_memory
: 演示使用 SharedMemory;demo_tracing_perfetto
: 演示将 Trace 输出为 Json 格式(用来对接 perfetto);demo_tracing_perfetto_content
: 演示 content 模块是如何对接 perfetto 的;demo_resources
: 演示 resources 相关内容,包括 grit,l10n,pak 等;demo_gl
: 演示使用//ui/gl
进行 GPU 渲染;demo_viz_gui
: 演示使用viz
显示 GUI 界面;demo_viz_offscreen
: 演示使用viz
进行离屏渲染;demo_viz_gui_gpu
: 演示使用viz
进行硬件加速渲染;demo_viz_layer
: 演示使用viz
进行交互渲染;demo_viz_layer_offscreen
, 演示使用 VIZ 的CopyOutput
接口进行离屏渲染;demo_cc_gui
: 演示使用cc
显示 GUI 界面;demo_cc_offscreen
: 演示使用cc
进行离屏渲染;demo_views
: 演示使用//ui/views
创建 UI;demo_apk
: 演示创建 Android 应用,base::android::* 和 JNI 的使用;demo_android_skia
: 演示在 Android 上使用 Skia 进行软件渲染和硬件渲染;demo_skia
: 演示在 Linux 上使用 Skia 进行软件渲染和硬件渲染;demo_x11
: 演示使用 X11 创建透明窗口;demo_x11_glx
: 演示在透明窗口中使用 glx;demo_x11_egl
: 演示在透明窗口中使用 egl;demo_shell
: 演示使用 content api, 创建一个精简的浏览器,支持 Linux 和 Android;
文档:
公共文档在 docs 目录,其他文档在代码相应目录下。
-
进入 chromium 的
src
目录; -
执行以下命令将该仓库 clone 到
src/demo
目录下;git clone <当前仓库的地址> demo
-
找到你的编译输出目录中的
out/Default/args.gn
文件,添加以下参数:# add extra deps to gn root root_extra_deps = ["//demo"] # 如果要编译 android 平台的 demo 需要额外添加以下参数 target_os="android" target_cpu="arm64" # 可以根据需要选择其它架构 x86,x64,arm,mipsel
-
执行
ninja -C out/Default demo
生成所有 demo 程序(详见 BUILD.gn);
-
进入 chromium 项目的根目录(src 上一层目录)找到
.gclient
文件; -
打开
.gclient
文件,参照下面的设置进行修改:solutions = [ { "name" : "src", "url" : "https://chromium.googlesource.com/chromium/src.git", "deps_file" : "DEPS", "managed" : False, "custom_deps" : { # let gclient pull demo project to 'src/demo' dir "src/demo": "<当前仓库的地址>", }, "custom_vars": {}, } ] ...
-
找到你的编译输出目录中的
out/Default/args.gn
文件,添加以下参数:# add extra deps to gn root root_extra_deps = ["//demo"] # 如果要编译 android 平台的 demo 需要额外添加以下参数 target_os="android" target_cpu="arm64" # 可以根据需要选择其它架构 x86,x64,arm,mipsel
-
执行
gclient sync
同步代码,这会拉取demo
仓库到src/demo
; -
执行
ninja -C out/Default demo
生成所有 demo 程序(详见 BUILD.gn);
- 完善进程初始化部分的文档 (docs/startup.md);
- 完善 UI 部分的文档 (docs/ui.md);
- 完善 content 模块的文档 (docs/content.md);
- 完善 demo_shell 的文档 (demo_shell/README.md);
- 添加 demo, 演示如何创建 aar 组件;
- 添加 demo, 演示如何使用 aura 创建 UI 界面;
- 添加 demo, 演示如何使用 PlatformWindow 创建 UI 界面;
- 添加 demo, 演示如何实现网页的离屏渲染;
- 添加 demo, 演示如何向 Blink 注入新的 JS 对象;
- 添加 demo, 演示
navigator.mediaDevices.getUserMedia()
的原理; - 添加 demo, 演示
tab capture api
的原理;
- 添加 demo_gl, 演示通过
//ui/gl
模块调用 GL 进行渲染;
- demo_viz_layer_offscreen 支持使用 SkiaOutputDeviceOffscreen 接口进行离屏渲染;
- 添加 demo_viz_layer_offscreen, 演示使用 VIZ 的 CopyOutput 接口进行离屏渲染;
- 添加 demo_viz_layer, 演示使用 VIZ 进行笔迹书写,同时支持使用命令行进行软件和硬件渲染的切换;
- 添加 demo_viz_gui_gpu, 演示使用 VIZ 进行硬件加速渲染以及 VIZ Client 的嵌套;
- 添加 demo_x11_glx 和 demo_x11_egl;
- 添加 demo_x11, 演示使用 X11 创建透明窗口;
- 更新 demo_skia, 默认使用软件渲染,支持透明窗口,GL 渲染支持 GL_RGB565 像素格式;
- 添加 demo_skia, 演示在 Linux 中使用 Skia 进行软/硬件渲染;
- 更新 demo_android_skia, 添加多线程渲染以及帧率同步;
- 添加 demo_android_skia, 演示在 Android 中使用 Skia 进行软/硬件渲染;
- 添加 demo_tracing_perfetto_content, 演示 content 模块是如何将 trace 保存到文件的,该文件可以用于 chrome://tracing;
- 添加 demo_tracing 的文档 demo_tracing;
- 将 demo_tracing 移动到 demo_tracing 文件夹,并改名为 demo_tracing_console, 添加 Flush 功能;
- 添加 demo_tracing_perfetto, 演示 trace 和 perfetto 的集成及使用;
- 添加 demo_cc_gui, 演示使用
cc
显示 GUI 界面;
- 添加 demo_cc 的 TRACE.txt, 用于协助理解 cc 的运行时行为;
- 添加 demo_cc_offscreen, 演示使用
cc
进行离屏渲染;
- 添加 demo_viz_offscreen, 演示使用
viz
进行离屏渲染; - 修改 demo_viz 为 demo_viz_gui,功能不变;
- 添加 demo_viz, 演示使用
viz
模块; - 添加
viz
的文档:viz
- 添加 demo_views,演示使用
//ui/views
开发 UI;
- demo_apk 支持 JNI 调用 C++类的实例方法;
- 添加文档:浏览器启动流程简述
- demo_apk 支持 JNI;
- 添加文档: demo_apk
- 添加 demo_tracing,用来演示 trace 的使用;
- 添加 demo_apk,用来演示如何使用 gn 创建 Android 应用;
- 添加 demo_shell,用来演示如何使用 Content API 创建一个精简浏览器;
添加以下 demo 及相关文档:
- demo_exe: 最简单的 demo,演示 gn 及创建自己的 exe;
- demo_log: 演示使用日志库;
- demo_tracing: 演示使用 Trace;
- demo_tasks: 演示使用线程池 ThreadPool;
- demo_messageloop: 演示使用消息循环 MessageLoop;
- demo_mojo_single_process: 演示在单进程中使用 mojo 库;
- demo_mojo_multiple_process: 演示在多进程中使用 mojo 库;
- demo_mojo_multiple_process_binding: 演示在多进程中使用 mojo 库的 binding 层;
- demo_services: 演示使用基于 mojo 的 servcies 及多进程架构;
- demo_ipc: 演示使用基于 mojo 的 IPC 接口;
- demo_memory: 演示使用 SharedMemory;