因为某些原因,需要编译一次chromium浏览器使其支持HEVC格式的视频播放,这里记录一下编译过程中踩到的坑。
编译过程参考 https://github.com/chromium/chromium/blob/master/docs/windows_build_instructions.md,我这里是在windows下编译,编译的版本为85.0.4162.0。
系统环境
win7操作系统,vs2017,windows 10 SDK,这些是必须要求的,我刚开始没有安装windows 10 SDK,导致后面编译出错,安装后就正常了。
安装depot_tools
- 直接从github上的文档链接中可以下载到depot_tool的压缩包,解压可用。
- 将解压后的depot_tool的路径设置到PATH环境变量中。且位置要求在Python和git相关环境变量之前。
- 打开一个命令行(win+r键,输入cmd,回车即可),直接输入gclient,这一步会安装Python和git等相关工具。
这里有坑:
不做设置时,直接执行gclient会因为网络问题报错,需要设置代理,在命令行输入以下命令设置http代理(1080为我的上网工具的默认代理端口),https_proxy也要设置成http而不是https,我被这个设置坑了很长时间
set http_proxy=http://localhost:1080
set https_proxy=http://localhost:1080
- gclient执行完毕后就Python和git就会自动安装完成了,输入
where python
可验证是否安装成功。
下载源码
- 配置git及代理
git config --global https.proxy socks5://localhost:1080
git config --global http.proxy socks5://localhost:1080
git config --global user.name "My Name"
git config --global user.email "my-name@chromium.org"
git config --global core.autocrlf false
git config --global core.filemode false
git config --global branch.autosetuprebase always
- 新建一个文件夹,命名为chromium(可以任意名称),命令行cd到该文件夹下,执行
fetch chromium
即可下载源码,该步骤可以加上--no-history
参数只下载最新代码,不下载git的历史提交记录
此处有坑
执行时Python会报类似cannot use a string pattern on a bytes-like object
的错误,搜索了一下是某些代码的写法Python2会正常执行,Python3会报错,这里应该是调用网络Python3,导致的报错,可以追踪到具体报错代码。但简单操作就是不调用Python3。
需要修改depot_tools目录中的fetch.bat文件,文件最下面内容如下
:: Defer control.
IF "%GCLIENT_PY3%" == "1" (
:: Explicitly run on Python 3
call vpython3 "%~dp0\fetch.py" %*
) ELSE IF "%GCLIENT_PY3%" == "0" (
:: Explicitly run on Python 2
call vpython "%~dp0\fetch.py" %*
) ELSE (
:: Run on Python 3, allows default to be flipped.
call vpython3 "%~dp0\fetch.py" %*
)
因为不知道这里的几个变量是怎么判断的,所以直接把里面的call vpython3统统改成了call vpython,再执行fetch操作,就开始正常下载了(gclient.bat中有相同内容,也需要改一下,不记得是哪一步操作会需要用到gclient也有相同的问题)。
编译
- 下载完成后,会有代码会在src目录中,命令行cd到src目录,执行
gn gen out/Default
用于生成编译目录
如果需要生成vs可打开的工程文件的话,使用gn gen --ide=vs2017 out\Default
命令,会在out/Default目录中生成一个all.sln文件,可以用vs直接打开,然后使用vs编译
vs编译时我这里出现了编译出问题后重新编译时又把所有文件重新编译了,耗费时间太长,所以不建议使用vs编译 - 使用ninja编译
在src目录中,执行autoninja -C out\Default chrome
命令进行编译
我这里实际上的命令参考了https://www.infoq.cn/article/s65bFDPWzdfP9CQ6Wbw6这里,使用的是一下命令
gn gen out/release --args="is_component_build = false enable_nacl = false is_debug = false symbol_level = 0 blink_symbol_level = 0"
autoninja -C out/release chrome
- 编译时遇到的坑
- 先是直接使用vs进行编译的,跑了很久以后编译不动了,取消后重新编译,会把所有文件又从头开始编译,耗费了大量时间
- 编译过程中出现了transport_security_state_generator相关的错误导致编译失败,然后换用的autoninja使用命令行进行编译
- 使用命令行编译过程中,同样遇到了错误,但是此时弹出了错误对话框,提示是transport_security_state_generator运行缺少了api-ms-win-downlevel-kernel32-l2-1-0.dll。
- 在out/release目录中找到了transport_security_state_generator.exe,直接运行也是同样提示缺少dll。网上找到了这个dll,放到了windows/system32目录中,再次执行,不再出错了(别用百度搜索到的那个太平洋下载中心上的dll,应该是版本不对,运行时会报其他内存访问的错误)
- 编译过程比较耗时,我的电脑只有4个逻辑处理器,编译一共有4万多个任务,挂机跑一晚上,第二天查看只编译了2万多个,运行已经卡住不动了,关掉命令行重新打开,再次运行
autoninja -C out\Default chrome
才能继续。 - 从下载源码,到编译成功,我一共用了4天的时间(艰难苦恨~~~~)
添加HEVC的支持
此处参考了https://www.infoq.cn/article/s65bFDPWzdfP9CQ6Wbw6这里的处理。
应该是使用的版本不同,导致我这里编译ffmpeg时出现undefine symbol的错误,直接根据错误提示,在ffmepg代码中查找未定义的函数在哪个文件中,然后将其添加到ffmpeg_generated.gni文件中的ffmpeg_c_sources文件列表中。再次编译,直到没有报错为止。
打包
编译完成以后,执行下面的命令,就会将编译好的文件打包为一个chrome.7z命名的压缩包和一个mini_installer.exe命名的安装包。可以使用压缩包分发,解压可用。也可以使用exe格式的安装包分发。
autoninja -C out/release mini_installer
因为chromium的代码在实时的更新,以上内容只能作为参考,可能换个时间换个配置再次操作就会有不同的问题,需要具体问题具体分析了。