ubuntu chromium代码编译
Chromium代码下载编译
https://chromium.googlesource.com/chromium/src/+/main/docs/linux/build_instructions.md
配置编译工具
$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH="$PATH:${PWD}/depot_tools"
下载编译代码
mkdir chromium && cd chromiumfetch --nohooks chromiumcd src./build/install-build-deps.shgclient runhooks
#这个过程中会安装sysroot,比如:
# src/build/linux/sysroot_scripts/install-sysroot.py --arch=x86```bash
# 创建out/Default/args.gn,或者gn后面跟args参数
mkdir -p out/Default/
vim out/Default/args.gn # 将下面的选项写到args.gn文件
is_debug=falsetarget_cpu="x64"target_os="linux"use_vaapi=trueis_component_ffmpeg=truemedia_use_ffmpeg=trueffmpeg_branding="Chrome"proprietary_codecs=trueenable_platform_hevc=trueenable_mse_mpeg2ts_stream_parser=truemojo_media_host="gpu"mojo_media_services=["video_decoder"]is_official_build=falseenable_nacl=falsesymbol_level=1v8_symbol_level=0use_ozone=trueozone_platform_wayland=trueozone_platform_x11=trueozone_platform_headless=trueozone_auto_platforms=false
生成out/Default/build.ninja
文件:
gn gen out/Default
或者,直接通过–args参数指定编译选项,直接生成out/Default/build.ninja:
gn gen --args='is_debug=falsetarget_cpu="x64"target_os="linux"use_vaapi=trueis_component_ffmpeg=truemedia_use_ffmpeg=trueffmpeg_branding="Chrome"proprietary_codecs=trueenable_platform_hevc=trueenable_mse_mpeg2ts_stream_parser=truemojo_media_host="gpu"mojo_media_services=["video_decoder"]is_official_build=falseenable_nacl=falsesymbol_level=1v8_symbol_level=0use_ozone=trueozone_platform_wayland=trueozone_platform_x11=trueozone_platform_headless=trueozone_auto_platforms=false' out/Default
编译:
autoninja -C out/Default chrome -v
运行chrome,使用x11启动,播放一个1080的视频:
./out/Default/chrome --no-sandbox --enable-features=UseOzonePlatform --ozone-platform=x11 --app="http://192.168.31.124/stream/mse-demo/1080p.html"
输出log
编译完成后生成chrome,启动命令行加上--enable-logging --v=1
开关,就会生成chrome_debug.log,每启动一次log就会被覆盖。
v=1:level 1以下的INFO,WARNING,ERROR都会输出,如果要输出level 2以上,需要指定v=2以上。
./out/Default/chrome --no-sandbox --enable-features=UseOzonePlatform --ozone-platform=x11 --enable-logging --v=1 --app="http://192.168.31.124/stream/mse-demo/1080p.html"
使用wayland启动chromium
chromium使用ozone作为图像输出的平台抽象层,通过ozone-platform选项定义,选择不同标准的协议来支持不同的显示后端,如果需要使用wayland就要指定--ozone-platform=wayland
,前面编译的gn参数里面ozone_platform_wayland=true
和ozone_platform_x11=true
,已经支持了wayland和x11,所以启动的时候指定wayland还是x11即可,wayland启动的时候要先启动weston作为wayland server。
--ozone-platform=wayland // wayland显示协议的支持--ozone-platform=x11 // 支持X11 Windows系统
./out/Default/chrome --no-sandbox --enable-features=UseOzonePlatform --ozone-platform=wayland --enable-logging --v=1 --app="http://192.168.31.124/stream/mse-demo/1080p.html"
weston drm启动chromium,默认走硬件egl,gdm无法创建正确的显示buffer,可以通过参数--use-gl
切换到swiftshader,通过cpu软件模拟egl的功能,不走硬件egl,来暂时绕过。
./chrome --no-sandbox --enable-features=UseOzonePlatform --ozone-platform=wayland --use-gl=swiftshader
或者chromium编译选项中禁止gbm:
use_wayland_gbm=false
weston参数
weston默认为drm作为后端,可以通过参数 --backend=**-backend.so
来指定后端:
drm-backend.so // Weston的输出界面,通过/dev/dri/card0节点来显示x11-backend.so // Weston的输出,将被作为一个X Windows送到X Server中去显示wayland-backend.so // Weston的输出,作为另一个weston的输入,以wayland client的身份运行,需要先启动一个weston
xwayland
它不是一个backend,只是wayland的一个功能拓展,可以在weston中运行X程序,需要weston启动参数–modules=xwayland.so
内部会启动一个X server,用来运行X程序,由于X server又是运行在Wayland server上,所有X server的输出最终是作为一个Wayland Client送去显示的。
weston --modules=xwayland.so
chromium的默认显示backend是x11,因此,最终通过weston xwayland
来显示chromium:
./out/build/chrome --enable-accelerated-video-decode --enable-logging --v=1 \
--enable-features=UseOzonePlatform --ozone-platform=wayland --use-gl=egl
启用mojo video_decoder
media/gpu目录是运行在GPU进程中GPU video解码硬件加速的代码,包括不同平台的硬件加速框架和驱动的对接,平台和框架包括
- vaapi对接x86平台
- v4l2对接linux平台
- android平台对接MediaCodec
- windows平台对接dxva框架
- mac平台vt框架
- Render进程和GPU进程通过mojom IPC机制,Render进程作为client,GPU进程运行MojoVideoDecoderService
mojo build args
--- a/media/mojo/BUILD.gn
+++ b/media/mojo/BUILD.gn
@@ -10,13 +10,13 @@ import("//testing/test.gni")buildflag_header("buildflags") {header = "buildflags.h"- enable_mojo_renderer = false
+ enable_mojo_renderer = trueenable_mojo_cdm = falseenable_mojo_audio_decoder = falseenable_mojo_audio_encoder = false
- enable_mojo_video_decoder = false
+ enable_mojo_video_decoder = trueenable_mojo_media_in_browser_process = false
- enable_mojo_media_in_gpu_process = false
+ enable_mojo_media_in_gpu_process = true
通过gn参数mojo_media_host指定,设置media component运行在GPU进程。
mojo_media_host = "gpu"mojo_media_services = ["video_decoder"]
enable_platform_hevc->proprietary_codecs->ffmpeg_branding之间存在这样的依赖关系
启用硬件video decoder
args.gn选项:
flags = ["USE_VAAPI=$use_vaapi","USE_VAAPI_IMAGE_CODECS=$use_vaapi_image_codecs","USE_V4L2_CODEC=$use_v4l2_codec","USE_LIBV4L2=$use_v4lplugin","USE_VAAPI_X11=$use_vaapi_x11",]
所以args.gn里面可以用这些选项启用:
use_vaapi = true
use_vaapi_image_codecs = true
use_v4l2_codec = true
use_v4lplugin = true
use_vaapi_x11 = true
编译项说明
target_os="linux"
:构建系统是win、android、linux、chromeos等
target_cpu=“x86”
:x86构建比x64构建快一点,并且支持增量链接以实现更多目标。
enable_nacl=false
:不支持本地客户端Native Client (NaCl),这是一种Chrome插件,因为安全性,稳定性存在问题,已经很少使用了。
symbol_level=1
:将为堆栈跟踪生成足够的信息,但不会逐行调试。设置symbol_level=0将不包括调试符号。
is_debug=true
:GN生成一个启用了所有调试断言,并包含完整调试信息
is_component_build=false
:这会使用更多,更小的DLL和增量链接,与is_official_build不能同时为true。
is_official_build=false
:指明不使用Chrome官方的编译优化建议。
proprietary_codecs
:指明支持H264编码,编译时,自动H264相关组件,打包PE文件中。
remove_webcore_debug_symbols=true
:指明删除内核层支持调试的符号文件,这样,有助于减少文件体积,提高运行速度。
blink_symbol_level=0
:关闭源级调试以减少闪烁,以减少构建时间,如果您不打算调试闪烁,则可以使用此选项。
qtcreate debug
/home/hui/disk4t/chromium/chromium-2/src/out/Default/chrome --enable-features=UseOzonePlatform --ozone-platform=x11 --enable-nacl --enable-nacl-debug --no-sandbox
build error
error1:undefined symbol: ui::ShellDialogLinux
ld.lld: error: undefined symbol: ui::ShellDialogLinux::SetInstance(ui::ShellDialogLinux*)
>>> referenced by linux_ui.cc
>>> views/linux_ui.o:(views::LinuxUI::SetInstance(std::__1::unique_ptr<views::LinuxUI, std::__1::default_delete<views::LinuxUI> >)) in archive obj/ui/views/libviews.ald.lld: error: undefined symbol: ui::ShellDialogLinux::ShellDialogLinux()
>>> referenced by linux_ui.cc
>>> views/linux_ui.o:(views::LinuxUI::LinuxUI()) in archive obj/ui/views/libviews.ald.lld: error: undefined symbol: ui::ShellDialogLinux::~ShellDialogLinux()
>>> referenced by linux_ui.cc
>>> views/linux_ui.o:(views::LinuxUI::~LinuxUI()) in archive obj/ui/views/libviews.a
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
增加use_gtk就可以了:
use_gtk = true
参考链接
GN-Configuration-notes
building Chromium on Linux
Development Guides
ubuntu chromium代码编译相关推荐
- 安卓webrtc在ubuntu 2004下编译使用
文章目录 安卓webrtc在ubuntu 2004下编译使用 相关网址链接 Http 全局代理配置 android webrtc 编译 boto 代理配置 Unable to reach the sn ...
- ubuntu系统下载编译android源码
在ubuntu系统下编译android需要注意的事项: 1. 参考http://source.android.com/中的安装说明. 2. 安装JDK6中碰到的问题可以参考http://hi.baid ...
- 安卓9.0刷linux,Ubuntu系统下编译Android 9.0系统
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 前言 在Ubuntu系统下编译Android系统.哎呀不知道是不是换了新电脑的缘故,这次编译居然从安装JDK和配置环境下 ...
- Chromium Android编译指南
先决条件 需要有一台装有Linux操作系统环境的主机来做编译,这个环境的搭建配置方法可以参考Linux-specific build instructions.目前还不支持在其它(Mac/Window ...
- ubuntu平台下编译vlc-android视频播放器实践
音视频实践学习 android全平台编译ffmpeg以及x264与fdk-aac实践 ubuntu下使用nginx和nginx-rtmp-module配置直播推流服务器 android全平台编译ffm ...
- linux编译aborted,Ubuntu Linux上编译kernel出错__stack_chk_fail
Ubuntu Linux上编译kernel出错__stack_chk_fail 发布时间:2008-02-06 00:02:18来源:红联作者:SMuonon init/built-in.o: In ...
- 在 Mac 山猫 10.8 中从代码编译安装 vim
在 Mac 山猫 10.8 中从代码编译安装 vim Translations: en 我在安装过程中遇到一些问题, 所以记录下来. 我安装的是 vim 7.4. 友情提醒!! 一定要等看完全文再动 ...
- 【摘录】Ubuntu 10.10编译Android froyo可能需要注意的几个地方
http://www.eoeandroid.com/thread-38456-1-1.html 周末把系统升级到10.10,首先对Ubuntu在UI上的突飞猛进表示大家赞赏,很多细节都做得不错,尤其是 ...
- 在Ubuntu下,编译Kernel报错:Makefile:xxx: recipe for target 'xxx' failed
**在Ubuntu下,编译Kernel报如下错误:** Makefile:xxx: recipe for target 'xxx' failed make[2]:***[arch/arm/boot/c ...
最新文章
- 生成html页面的ftl文件,FreeMarker生成静态HTML页面的工具类FreeMarkerUtil
- 胃癌2019csco指南_领读指南沈琳:2019CSCO胃癌指南重要更新
- 推送:腾迅信鸽 VS Bmob
- CSP-S初赛知识点复习(全)
- c++ opencv添加logo_OpenCV-Python 图像平滑 | 十六
- 我们做自媒体是怎么失败的?
- ZeroMQ之Request/Response (Java)
- java匿名内部类 内部类_java中的匿名内部类详细总结
- Android httpclient、json
- 网络和IP地址计算器
- P3437 [POI2006]TET-Tetris 3D
- 2021-04-22
- 实战派来了!聊聊百度智能运维的“前世今生” | 技术沙龙
- 元学习—模型不可知元学习(MAML)
- Tomcat中定制阀门
- Dota 狼人一级野
- 防火墙和入侵防护IPS
- 【Shader Graph】流光效果(模型流光)
- 汇编-输入8位二进制串并转换为16进制数显示到屏幕(利用8421转换)
- cocos creator 3.7微信小游戏开发云函数和云托管部署