美文网首页
chromium 分享(干货)

chromium 分享(干货)

作者: 嘻哈小猴 | 来源:发表于2018-06-15 19:07 被阅读87次

本文章只针对arm架构嵌入式平台,且移植的是chromium的content_shell简易浏览器,由于地址栏等依赖x11,所以都已经去掉,主要用途在TV或者机顶盒上运行。由于arm gcc编译器目前最高为4.9版本,没有完全支持c++14新特性,而chromium从62版本开始就引进了c++14写法,导致在arm平台只能移植chromium 61版本。

移植对象:chromium 61.0.3163.100
系统架构:arm32位
系统内核:linux
硬件依赖:opengl

下载代码以及配置depot_tools具体参考chromium官网:
https://chromium.googlesource.com/chromium/src/+/master/docs/linux_build_instructions.md

下载指定版本代码:
fetch chromium
cd src
git checkout -b chromium_61.0.3163.100 61.0.3163.100
gclient sync --with_branch_heads --jobs 16

下载代码后,配置gn args:
gn gen out/my_browser/ --args='use_aura=true is_component_build=false is_debug=false is_clang=false is_desktop_linux=false enable_nacl=false use_sysroot=false linux_use_bundled_binutils=false use_gold=false use_dbus=false use_udev=false use_kerberos=false enable_media_remoting=false toolkit_views=false use_allocator="none" target_os="linux" target_cpu="arm" arm_float_abi="softfp"'
args中所有参数含义可以通过 gn args --list out/my_browser/查询到,在此不做过多解释

ninja -C out/my_browser/ content_shell -j32 (开启32个服务器线程疯狂编译)

到这里,所有编译命令已完结,但是还有很多事情要做!

工具链配置:
工具链配置目录chromium/src/build/toolchain/linux/BUILD.gn文件,找到
gcc_toolchain("arm") {
toolprefix = "arm-linux-gnueabihf-"

cc = "${toolprefix}gcc"
cxx = "${toolprefix}g++"

ar = "${toolprefix}ar"
ld = cxx
readelf = "${toolprefix}readelf"
nm = "${toolprefix}nm"

toolchain_args = {
current_cpu = "arm"
current_os = "linux"
is_clang = false
}
}
由于我们是linux平台,所以在linux目录下BUILD.gn,且架构为arm,所以找到gcc_toolchain("arm"),默认是arm-linux-gnueabihf-*,你可以配置自己的工具链。

公共配置文件:
公共配置文件在chromium/src/build/config目录下BUILDCONFIG.gn文件和BUILD.gn,BUILDCONFIG.gn是config文件,一般在这里面设置的变量所有gn文件都能读取到,你可以配置自己的变量,以下是我配置的变量

embedded platform value

declare_args() {
use_t_embedded = false
if(getenv("MYBRW_EMBEDDED") == "true") {
use_t_embedded = true
}

mybrw_home_dir = getenv("MYBRW_HOME_DIR")
mybrw_cross_toolchain = getenv("MYBRW_CROSS_TOOLCHAIN")
mybrw_porting_include_dir = getenv("MYBRW_PORTING_INCLUDE_DIR")
mybrw_porting_lib_dir = getenv("MYBRW_PORTING_LIB_DIR")
mybrw_platform_includes = getenv("MYBRW_PLATFORM_INCLUDES")
mybrw_platform_libs = getenv("MYBRW_PLATFORM_LIBS")
}
一般在declare_args()下定义的变量可以在gn args --list out/my_browser/看到,具体看gn语法,你们可以配置自己需要的变量。BUILD.gn主要定义宏,也是适用所有代码,我主要添加USE_T_EMBEDDED宏。

绘图修改代码:
由于移植arm平台,以前x11路线肯定是行不通了,所以需要更改这一块代码
chromium61/src/gpu/ipc/common/surface_handle.h:


图片.png

chromium61/src/third_party/angle/include/EGL/eglplatform.h:


图片.png

chromium61/src/third_party/khronos/EGL/eglplatform.h:


图片.png

chromium61/src/ui/gfx/native_widget_types.h:


图片.png
图片.png

chromium61/src/ui/aura/window_tree_host_platform.cc:


QQ图片20180615184152.png
图片.png
图片.png

chromium61/src/ui/platform_window目录下要创建embedded目录,里面内容已经上传至网盘(txt为cc文件,请自行修改)
链接:https://pan.baidu.com/s/1D0p1q20yI2E4aKzJi_kAHw 密码:laey

chromium61/src/ui/gl/init目录下,创建gl_initializer_embedded.cc(由gl_initializer_android.cc复制而来),创建gl_factory_embedded.cc(由gl_factory_android.cc复制而来)并修改代码如下


QQ截图20180615185654.png

fpi_graphic_create_window函数对应arm嵌入式底层surface
directfb 就是window surface
opengl 则是window handle(EGLNativeWindowType)
到此绘图模块移植完毕

编译过程中如遇到编译错误,就自己解决了,我先闪人,祝大家移植愉快!

相关文章

网友评论

      本文标题:chromium 分享(干货)

      本文链接:https://www.haomeiwen.com/subject/debmeftx.html