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=trueozone_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代码编译相关推荐

  1. 安卓webrtc在ubuntu 2004下编译使用

    文章目录 安卓webrtc在ubuntu 2004下编译使用 相关网址链接 Http 全局代理配置 android webrtc 编译 boto 代理配置 Unable to reach the sn ...

  2. ubuntu系统下载编译android源码

    在ubuntu系统下编译android需要注意的事项: 1. 参考http://source.android.com/中的安装说明. 2. 安装JDK6中碰到的问题可以参考http://hi.baid ...

  3. 安卓9.0刷linux,Ubuntu系统下编译Android 9.0系统

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 前言 在Ubuntu系统下编译Android系统.哎呀不知道是不是换了新电脑的缘故,这次编译居然从安装JDK和配置环境下 ...

  4. Chromium Android编译指南

    先决条件 需要有一台装有Linux操作系统环境的主机来做编译,这个环境的搭建配置方法可以参考Linux-specific build instructions.目前还不支持在其它(Mac/Window ...

  5. ubuntu平台下编译vlc-android视频播放器实践

    音视频实践学习 android全平台编译ffmpeg以及x264与fdk-aac实践 ubuntu下使用nginx和nginx-rtmp-module配置直播推流服务器 android全平台编译ffm ...

  6. 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 ...

  7. 在 Mac 山猫 10.8 中从代码编译安装 vim

    在 Mac 山猫 10.8 中从代码编译安装 vim Translations:  en 我在安装过程中遇到一些问题, 所以记录下来. 我安装的是 vim 7.4. 友情提醒!! 一定要等看完全文再动 ...

  8. 【摘录】Ubuntu 10.10编译Android froyo可能需要注意的几个地方

    http://www.eoeandroid.com/thread-38456-1-1.html 周末把系统升级到10.10,首先对Ubuntu在UI上的突飞猛进表示大家赞赏,很多细节都做得不错,尤其是 ...

  9. 在Ubuntu下,编译Kernel报错:Makefile:xxx: recipe for target 'xxx' failed

    **在Ubuntu下,编译Kernel报如下错误:** Makefile:xxx: recipe for target 'xxx' failed make[2]:***[arch/arm/boot/c ...

最新文章

  1. 生成html页面的ftl文件,FreeMarker生成静态HTML页面的工具类FreeMarkerUtil
  2. 胃癌2019csco指南_领读指南沈琳:2019CSCO胃癌指南重要更新
  3. 推送:腾迅信鸽 VS Bmob
  4. CSP-S初赛知识点复习(全)
  5. c++ opencv添加logo_OpenCV-Python 图像平滑 | 十六
  6. 我们做自媒体是怎么失败的?
  7. ZeroMQ之Request/Response (Java)
  8. java匿名内部类 内部类_java中的匿名内部类详细总结
  9. Android httpclient、json
  10. 网络和IP地址计算器
  11. P3437 [POI2006]TET-Tetris 3D
  12. 2021-04-22
  13. 实战派来了!聊聊百度智能运维的“前世今生” | 技术沙龙
  14. 元学习—模型不可知元学习(MAML)
  15. Tomcat中定制阀门
  16. Dota 狼人一级野
  17. 防火墙和入侵防护IPS
  18. 【Shader Graph】流光效果(模型流光)
  19. 汇编-输入8位二进制串并转换为16进制数显示到屏幕(利用8421转换)
  20. cocos creator 3.7微信小游戏开发云函数和云托管部署

热门文章

  1. 大数据核心框架Hadoop
  2. LINUX基础之 压缩归档篇(二)
  3. Mybatis关系映射一对一的关系
  4. SCRUM Beta Day 2
  5. 计算机导论知识点总结与试题
  6. 基于JAVA学校校园网站系统(Springboot框架) 开题报告
  7. 苹果Mac系统偏好设置怎样原封不动地迁移(导入)到新电脑中?
  8. Unity抗锯齿,Unity3D模型花闪烁等效果优化。
  9. 你所不知道的ndJSON:序列化与管道流
  10. 重修Java内功——书到用时方恨少