需求

用的国产电脑,统信麒麟自带的chromium版本都是83版本,lceda要求超过100版本,低版本没法打开编辑器,只能用客户端版本。都是JS,还整这么多事...

刚开始想着一步到位直接在阿里云香港主机上买高配置的竞价虚拟机,结果居然编译不过,老是报有个东西没安装,试了好几次都不行,本来都计划放弃了的。周末闲着没事,想着家里的12核32GB的x86电脑也不弱了,再来搞一次交叉编译试试。

代码获取

必要条件是必须有办法有梯子,没梯子,代码都拉不下来。

编译过程参考的步骤,官网有2个网页。但是都太简单了,还有个stackexchange的问答,里面详细一些。

https://chromium.googlesource.com/chromium/src/+/main/docs/linux/build_instructions.md

https://chromium.googlesource.com/chromium/src/+/main/docs/linux/chromium_arm.md

ubuntu - Compile Chromium Browser for ARM (2019) - Unix & Linux Stack Exchange

基本上参考这3个地址就能正常编译了。

这里主要记录下我编译过程:

先配置git和http代理


/usr/bin/git config --global http.proxy http://xxx:xx
/usr/bin/git config --global https.proxy http://xxx:xx
export http_proxy="http://xxx:xx"
export https_proxy="http://xxx:xx"

然后拉工具配置环境


git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH="$PATH:$HOME/chromium/depot_tools"

然后拉代码


mkdir ~/chromium && cd ~/chromium
fetch --nohooks --no-history chromium

--no-history能节约好多空间。

配置和编译

然后就开始安装依赖


./build/install-build-deps.sh

这个过程报了个错,看了下是拉谷歌字体的时候用的个Py调用的curl,Py里面没法把环境变量的代理传进去,手工编辑下


vi ./build/linux/install-chromeos-fonts.py
#找到curl的那行,添加
'-x', 'http://192.168.5.221:20171', 
改好后的调用如下
subprocess.check_call(['curl', '-x', 'http://192.168.5.221:20171', '-L', url, '-o', tarball])

再执行install-build-deps.sh就好了。

然后再安装arm交叉编译的环境


./build/install-build-deps.sh --arm
./build/linux/sysroot_scripts/install-sysroot.py --arch=arm
./build/linux/sysroot_scripts/install-sysroot.py --arch=arm64

接下来开始配置并编译


mkdir out
mkdir out/arm
gclient sync && gclient runhooks &&

gn gen out/arm --args='is_official_build=true is_debug=false is_component_build=false symbol_level=0 enable_nacl=false blink_symbol_level=0 use_jumbo_build=true target_cpu="arm64" chrome_pgo_phase=0'
gclient runhooks
autoninja -C out/arm chrome

我机器编译大概一两个小时,看机器配置,编译完成后,网上很多文章说直接运行chrome就行,但我拷贝到飞腾机器上直接运行报错。后面打包了文件夹内容就正常了。


cd out
tar zcf ./arm.tar.gz --exclude=./arm/obj --exclude=./arm/thinlto-cache --exclude=./arm/clang_x64_v8_arm64 --exclude=./arm/clang_x86_v8_arm --exclude=./arm/gen --exclude=./arm/clang_x64 --exclude=./arm/irt_arm --exclude=./arm/nacl_helper ./arm

里面应该还打包了不少不需要的文件,不过体积大的基本被exclude掉了,拷贝到飞腾机器上解压后运行正常。

其他:

查看chromium源码匹配的clang版本号方法

tools/clang/scripts/update.py --print-revision

根据官网文档对chromium编译器需求的描述:https://chromium.googlesource.com/chromium/src/+/refs/tags/89.0.4389.114/docs/clang.md 

chromium的编译使用预编译的clang二进制版本,并且使用chromium版本发布时候的clang版本。

但chromium也支持gcc,官方不保证是否成功,但接受gcc编译的相关Patch 使用 is_clang=false开关打开gcc编译。

使用clang_base_path="包含bin/clang的目录绝对路径"  来指定。

小坑

但是发现无法播放视频网站的视屏,但播放youtube的是可以的。搜索了下,有人早遇到过了

Chromium浏览器不能播放MP4-腾讯云开发者社区-腾讯云

原因是部分通用的H264 解码codec没编译进去,解决办法就是在生成配置的时候添加2个参数重新编译就好了。


proprietary_codecs = true ffmpeg_branding = “Chrome"

最后编译配置参数为:


gn gen out/arm --args='is_official_build=true is_debug=false is_component_build=false symbol_level=0 enable_nacl=false blink_symbol_level=0 use_jumbo_build=true target_cpu="arm64" chrome_pgo_phase=0 proprietary_codecs=true ffmpeg_branding="Chrome" chrome_pgo_phase=0'

如果想进一步了解,可以查看这些参数的说明,比如:


gn args --list out/arm | grep -C10  ffmpeg_branding

后续如果遇到需要从源码编译什么版本,增加禁用什么功能就可以自己搞定了,不用再看国内浏览器厂商脸色了。

关于硬件解码

在Linux上如何查看有3个方法:

1. chrome://gpu/  这个页面查看下面两行

  • Video Decode: Hardware accelerated
  • Video Encode: Software only. Hardware acceleration disabled

并且在页面最下方,会列出硬件支持的编解码的规格和能力。

2. 在真实页面播放视频,F12打开开发者工具,右边三个点的按钮点开选媒体,点选正在播放的播放器查看属性。

 3. 用chrome://media-internals/ 查看媒体播放器,选中正在播放的视频,下面会显示属性

至于这个里面显示的解码器是硬件还是软件解码,有空再查询下chromium的相关东西。再确定。

chromium启动及运行日志

chrome   --enable-logging  -v=2
# --enable-logging启用日志记录,打印到文件。
# -v=2  日子详细程度,反正我指定2就足够了,其他级别没测试过。


日志位置,linux上 

~/.config/chromium/chrome_debug.log

另外一个确认是否调用了显卡硬件加速能力的方法:

LIBVA_TRACE 可以跟踪libva的调用。

添加 LIBVA_MESSAGING_LEVEL=3 参数,可以在控制台看到,每次浏览器通过vaapi调用显卡的时候都会打日志(龙芯这浏览器还挺不错)。

LIBVA_MESSAGING_LEVEL=3 /opt/apps/cn.loongnix.lbrowser/files/cn.loongnix.lbrowser --enable-features=VaapiVideoEncoder  
libva info: VA-API version 1.22.0
libva info: Trying to open /usr/lib/aarch64-linux-gnu/dri/radeonsi_drv_video.so
libva info: Found init function __vaDriverInit_1_4
mesa: for the -simplifycfg-sink-common option: may only occur zero or one times!
mesa: for the -global-isel-abort option: may only occur zero or one times!
libva info: va_openDriver() returns 0

libva info: VA-API version 1.22.0
libva info: Trying to open /usr/lib/aarch64-linux-gnu/dri/radeonsi_drv_video.so
libva info: Found init function __vaDriverInit_1_4
libva info: va_openDriver() returns 0

对于某些场景下,默认没有编码支持,可以添加 --enable-features=VaapiVideoEncoder 参数,就可以开启硬件编码的能力,但前提是显卡得有这能力。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐