CEF是基于chromium的开源项目,让集成chrome的浏览器内核非常方便,而且紧跟升级的节奏,在客户端产品上广泛使用。官网其实已经打了二进制包,可以直接拿来集成。

不过有时候我们还需要自己来打包,最常见的几个原因:

  1. 需要集成音视频能力(默认打包的音视频能力很弱)
  2. 有安全漏洞,可以自己简单的集成patch,频繁升级版本不一定能带来稳定性
  3. 有crash,可能需要自己来解决并打包

Mac升级aef

编译环境: macOS10.12.6, xcode8.3

选定的版本:11/28/2017 - CEF 3.3202.1687.gcd93b44 / Chromium 62.0.3202.94

官方的二进制包:http://opensource.spotify.com/cefbuilds/cef_binary_3.3202.1687.gcd93b44_macosx64.tar.bz2

默认打包不支持mp4,flv等媒体类型,需要支持播放媒体,增加编译参数:proprietary_codecs=1 ffmpeg_branding=Chrome

cef官方打包的源码镜像

http://opensource.spotify.com/cefbuilds/index.html

这个页面里边可以下到对应版本的 cef 源码和响应的chrome源码

比如 CEF 3.3071.1649.g98725e6对应的源码:

chromium: https://gsdview.appspot.com/chromium-browser-official/chromium-59.0.3071.109.tar.xz
cef: https://bitbucket.org/chromiumembedded/cef/get/3071.tar.bz2

编译的步骤:( 踩坑记 )

参考:https://bitbucket.org/chromiumembedded/cef/wiki/BranchesAndBuilding

自己编译CEF需要基于chromium源码,然后打上cef的patch,然后再一起编译,cef官方文档也有详细的说明。

官方有推荐自动获取源码的方法python tools/automate/automate-git.py --download-dir=./src --branch=3071 --x64-build,也可以尝试,不过我下面整理的方法是自己来拉代码的

总体上步骤如下:

  1. chromium主干切换成62的tag,然后执行gclient sync来拉取完整的代码
  2. 可能会出现历史的chromium版本,依赖的仓库的不存在了,比如如果webrtc的分支不在了,使用cef打包时的chrome代码,下载好的webrtc目录(其他有些模块如果代码有缺失,也可以在下载的chrome版本代码中找)(https://gsdview.appspot.com/chromium-browser-official/chromium-62.0.3202.94.tar.xz)
  3. cef拉取主干,切换到3071分支
  4. cef拷贝到chromium的src目录
  5. 建立 create.sh,设置好参数,进行patch补丁和cef融入
  6. 编译 ninja -C out/Debug_GN_x64 cef
  7. 经常需要修改gn的warning选项 src/build/config/compiler/BUILD.gn
  8. 手动打包: 编译完成后,可以使用 make_distrib 工具打包,打包好的二进制文件在 src/cef/binary_distrib 目录下
cd src/cef/tools
./make_distrib.sh --ninja-build --x64-build

create.sh脚本:

#!/bin/bash
export CEF_USE_GN=1
export GN_DEFINES="proprietary_codecs=true ffmpeg_branding=Chrome is_official_build=true enable_stripping=true symbol_level=0 enable_nacl=false remove_webcore_debug_symbols=true clang_use_chrome_plugins=0"

./cef_create_projects.sh

注意事项

可能出现的错误:

错误: error: '../../build/util/LASTCHANGE.blink', needed by 'gen/webkit_version.h', missing and no known rule to make it

解决:src目录执行两个脚本

./build/util/lastchange.py  build/util/LASTCHANGE
./build/util/lastchange.py -s third_party/WebKit/ -o build/util/LASTCHANGE.blink

配置:src/build/config/compiler/BUILD.gn 增加warning选项

# TODO(hans): Get this cleaned up, http://crbug.com/428099
"-Wno-inconsistent-missing-override",

"-Wno-tautological-unsigned-enum-zero-compare",
"-Wno-enum-compare",
"-Wno-null-pointer-arithmetic",
"-Wno-tautological-unsigned-zero-compare",
"-Wno-delete-non-virtual-dtor"

参考