因为项目需要,需要将游戏手机助手中的朋友圈给移植到PC游戏中,而以前游戏中的内嵌浏览器采用的是IE6内核,满足不了我们的需求,于是决定把Cef3内嵌到游戏中,在完成正常工作之余,利用闲散时间不断地查找各种资料,初步完成了项目需求,决定写一篇文章来记录我碰到的各种坑。
一开始我只是在网上找了一个最后支持XP系统的版本–2623版本,利用这个版本进行开发,后来发现不支持MP3、MP4,是需要重新编译一个支持MP3、MP4的版本的,在网上找一个已编译好了的版本(在Windows下编译Cef3.2623并加入mp3、mp4支持(附带源码包和最终DLL)),最后把一些dll、资源等替换下就行,并不需要更改工程代码,非常感谢Redrain!附上链接:http://blog.csdn.net/zhuhongshu/article/details/54193842
一、首先来了解下Cef3
CEF全称Chromium Embedded Framework,是一个基于Google Chromium 的开源项目。CEF的典型应用场景包括:
嵌入一个兼容HTML5的浏览器控件到一个已经存在的本地应用。
· 创建一个轻量化的壳浏览器,用以托管主要用Web技术开发的应用。
· 有些应用有独立的绘制框架,使用CEF对Web内容做离线渲染。
· 使用CEF做自动化Web测试。
CEF3是基于Chomuim Content API多进程构架的下一代CEF,拥有下列优势:
· 改进的性能和稳定性(JavaScript和插件在一个独立的进程内执行)。
· 支持Retina显示器。
· 支持WebGL和3D CSS的GPU加速。
· 类似WebRTC和语音输入这样的前卫特性。
· 通过DevTools远程调试协议以及ChromeDriver2提供更好的自动化UI测试。
· 更快获得当前以及未来的Web特性和标准的能力。
翻译自https://bitbucket.org/chromiumembedded/cef/wiki/GeneralUsage.md
看不懂英文的可以看这篇GeneralUsage翻译文:https://github.com/fanfeilong/cefutil/blob/master/doc/CEF General Usage-zh-cn.md#important-concepts
二、二进制文件及资源文件说明
有些文件是必须的,否则无法运行
-
CEF core library.
libcef.dll(Cef核心文件,含js引擎、网页加载渲染逻辑等) -
Crash reporting library.
chrome_elf.dll(我还没用上) -
Unicode support data.
icudtl.dat(支持Unicode需要) -
V8 snapshot data.
natives_blob.bin
snapshot_blob.bin(V8引擎快照数据需要)
有些是根据情况可删减的,cef可以继续运行,或缺失部分功能:
-
Localized resources.
Locale file loading can be disabled completely using
CefSettings.pack_loading_disabled. The locales directory path can be
customized using CefSettings.locales_dir_path. (可设置本地资源的路径)- locales/
Directory containing localized resources used by CEF, Chromium and Blink. A
.pak file is loaded from this directory based on the CefSettings.locale
value. Only configured locales need to be distributed. If no locale is
configured the default locale of “en-US” will be used. Without these files
arbitrary Web components may display incorrectly.(CEF,Chromium和Blink使用的本地化资源。如果没有区域设置将配置默认语言环境“en-US”。如果没有这些文件任意Web组件可能显示不正确。)
- locales/
-
Other resources.
Pack file loading can be disabled completely using
CefSettings.pack_loading_disabled. The resources directory path can be
customized using CefSettings.resources_dir_path.-
cef.pak
-
cef_100_percent.pak
-
cef_200_percent.pak
These files contain non-localized resources used by CEF, Chromium and Blink.
Without these files arbitrary Web components may display incorrectly.(这些文件包含了供CEF使用的区域无关资源,缺少这些文件任意Web组件可能显示不正确。) -
cef_extensions.pak
This file contains non-localized resources required for extension loading.
Pass the--disable-extensions
command-line flag to disable use of this
file. Without this file components that depend on the extension system,
such as the PDF viewer, will not function.(此文件包含扩展加载所需的非本地化资源传递--disable-extensions
命令行标志来禁止使用文件。没有这个文件,依赖于扩展系统的组件将不起作用,如PDF查看器。) -
devtools_resources.pak
This file contains non-localized resources required for Chrome Developer
Tools. Without this file Chrome Developer Tools will not function.( 此文件包含Chrome开发者工具所需的非本地化资源,缺少这个文件,Chrome开发者工具将无法运行。)
-
-
Angle and Direct3D support.
- d3dcompiler_43.dll (required for Windows XP)
- d3dcompiler_47.dll (required for Windows Vista and newer)
- libEGL.dll
- libGLESv2.dll
Without these files HTML5 accelerated content like 2D canvas, 3D CSS and WebGL
will not function.(Direct3D支持文件,如果缺少这些文件,HTML5在渲染2D画布,3D CSS,WebGL时将不起作用。)
-
Widevine CDM support.
-
widevinecdmadapter.dll(DRM数字版权管理功能Widevine需要)
Without this file playback of Widevine projected content will not function.
See the CefRegisterWidevineCdm() function in cef_web_plugin.h for usage.
-
三、引入到工程中
因为是内嵌在我们自己的项目中,所以只需要给工程中引入cef3,将一些dll等资源文件加入到工程exe所在目录下,在我们自己的第三方库文件夹中加入了cef3文件夹,里面加入cef的include文件夹,和lib文件夹,lib文件夹里分别放入的是debug版本和release版本的libcef.lib文件和libcef_dll_wrapper.lib文件。
配置项目属性:
C/C++ ->常规附加包含目录中加入cef的include目录所在路径
链接器->输入添加附加依赖项libcef.lib和libcef_dll_wrapper.lib
利用CMAKE创建cef3的demo工程,找到cefsimole工程,改造cefsimple工程的代码,是满足我们的需求。当然你的需求很复杂,还是建议看看cefclient工程。cefclient是一个完整的CEF客户端应用程序示例,并且它的源码包含在CEF每个二进制发布包中。使用CEF创建一个新的应用程序,最简单的方法是先从cefclient应用程序开始,删除你不需要的部分。本文档中许多示例都是来源于cefclient应用程序。
在我们在开发之前,需要知道一些cef的基础概念。如果你和我一样是一个新手,建议还是先了解了解基础知识。
四、Cef基础概念
1、多进程架构
首先你要知道cef3是多进程架构的,这点非常重要。Browser被定义为主进程,负责窗口管理,界面绘制和网络交互。Blink的渲染和Js的执行被放在一个独立的Render 进程中;除此之外,Render进程还负责Js Binding和对Dom节点的访问。 默认的进程模型中,会为每个标签页创建一个新的Render进程。其他进程按需创建,例如管理插件的进程以及处理合成加速的进程等都是按需创建。
默认情况下,主应用程序会被多次启动运行各自独立的进程。这是通过传递不同的命令行参数给CefExecuteProcess函数做到的。如果主应用程序很大,加载时间比较长,或者不能在非浏览器进程里使用,则宿主程序可使用独立的可执行文件去运行这些进程。这可以通过配置CefSettings.browser_subprocess_path变量做到。
CEF3的进程之间可以通过IPC进行通信。Browser和Render进程可以通过发送异步消息进行双向通信。甚至在Render进程可以注册在Browser进程响应的异步JavaScript API。
通过设置命令行的–single-process,CEF3就可以支持用于调试目的的单进程运行模型。
2、多线程
在CEF3中,每个进程都会运行多个线程。完整的线程类型表请参照cef_thread_id_t。例如,在Browser进程中包含如下主要的线程:
TID_UI 线程是浏览器的主线程。如果应用程序在调用调用CefInitialize()时,传递CefSettings.multi_threaded_message_loop=false,这个线程也是应用程序的主线程。
TID_IO 线程主要负责处理IPC消息以及网络通信。
TID_FILE 线程负责与文件系统交互。
由于CEF采用多线程架构,有必要使用锁和闭包来保证数据的线程安全语义。IMPLEMENT_LOCKING定义提供了Lock()和Unlock()方法以及AutoLock对象来保证不同代码块同步