2. cef 及 cefcapi
文章目录
- 1. CEF(Chromium Embedded Framework)简介
- 1.1 应用场景
- 2. cefcapi
- 3. 进程
- 4. 线程
1. CEF(Chromium Embedded Framework)简介
CEF由Marshall Greenblatt于2008年创建,基于Chromium项目,提供了一套稳定的API,使开发者能够将高性能的浏览器内核嵌入到桌面应用中。其核心功能包括:
-
HTML5支持:与Chrome浏览器相同的HTML5渲染能力,支持WebGL、WebRTC等现代技术57。
-
跨平台兼容性:支持Windows、Linux和macOS(部分版本仍在开发中)17。
-
进程与线程模型:采用Chromium的多进程架构(如Browser进程管理主逻辑,Render进程处理页面渲染),并通过多线程模型保证应用的响应性27。
1.1 应用场景
CEF广泛应用于需要混合Web与本地功能的场景,例如:
- 桌面应用套壳:如QQ、微信桌面端、网易云音乐, 游戏商城等,通过CEF实现复杂UI与本地逻辑的结合5。
- 企业工具:数据分析、多媒体播放器等需要嵌入Web内容的专业工具15。
- 跨平台开发:利用前端技术(HTML/CSS/JS)结合本地API,提升开发效率57。
- 技术特点:
- 商业友好授权:采用BSD协议,适合商业化开发5。
- 多版本支持:CEF3是当前主流版本,支持多线程和复杂交互,逐步替代CEF1/27。
- 扩展性:允许自定义插件、协议处理、JavaScript绑定等7。
2. cefcapi
libcef 共享库导出一个 C API,将用户与 CEF 运行时和代码库隔离开来。作为二进制版本的一部分,并以源代码形式分发的 libcef_dll_wrapper 项目将这个导出的 C API 包装在 C++ API 中,然后链接到客户端应用程序。此 C/C++ API 转换层的代码由转换工具自动生成。UsingTheCAPI 页面上描述了 C API 的直接使用。
3. 进程
-
CEF3 使用多个进程运行。处理窗口创建、UI 和网络访问的主要进程称为“浏览器”进程。这通常是与主应用程序相同的进程,并且大部分应用程序逻辑将在浏览器进程中运行。Blink 渲染和 JavaScript 执行发生在单独的“渲染”进程中。一些应用程序逻辑,例如 JavaScript 绑定和 DOM 访问,也会在渲染进程中运行。默认进程模型将为每个唯一的来源(方案+域,即URL)生成一个新的渲染进程。其他进程将根据需要产生,例如处理加速合成的“gpu”进程。
-
默认情况下,主应用程序可执行文件将被多次启动为系统中的独立进程。这是通过传递到 CefExecuteProcess 函数的命令行标志来处理的。如果主应用程序可执行文件很大,加载时间很长,或者不适用于非浏览器进程,可以使用单独的可执行文件。这可以通过 CefSettings.browser_subprocess_path 变量进行配置。有关详细信息,请参阅“应用程序结构”部分。
-
CEF3 生成的独立进程使用进程间通信 (IPC) 进行通信。在浏览器和渲染进程中实现的应用程序逻辑可以通过来回发送异步消息进行通信。渲染进程中的JavaScriptIntegration可以调用位于浏览器进程中的异步 API。有关详细信息,请参阅“进程间通信”部分。
-
针对特定平台的调试提示也适用于Windows、MacOS和Linux。
4. 线程
-
CEF3 中的每个进程都运行多个线程。有关线程的完整列表,请参阅cef_thread_id_t枚举。这些是一些常用的线程:
-
TID_UI线程是浏览器进程中的主线程。如果使用 CefSettings.multi_threaded_message_loop 值为 false 调用 CefInitialize(),则此线程将与主应用程序线程相同。
-
TID_IO线程用于浏览器进程处理IPC和网络消息。
-
TID_FILE_*线程用于浏览器进程与文件系统交互。阻塞操作只能在该线程或客户端应用程序创建的CefThread上执行。
-
TID_RENDERER线程是渲染器进程中的主线程。所有 Blink 和 V8 交互都必须在此线程上进行。
由于 CEF 的多线程特性,使用消息传递或锁定来保护数据成员免受多线程访问非常重要。CefPostTask 系列函数支持在线程之间轻松传递异步消息。有关详细信息,请参阅“发布任务”部分。
说明: 上述大部分内容转载和参考自 https://zhuanlan.zhihu.com/p/630130886