chromium 21 chromium添加新的IPC消息需要重新编译

版权声明:技术分享,csdn longji https://blog.csdn.net/longji/article/details/84860794

00 IPC消息简介

参考: http://blog.gclxry.com/chromium-inter-process-communication/

01 进程间通信IPC消息

chromium 浏览器进程(主进程)和渲染进程(子进程)之间通信,一般使用IPC消息。这些消息形如:

ViewHostMsg_ClosePage_ACK

比较常用的两个消息头文件

view_messages.h
frame_messages.h

在 Vs-Chromium插件的 Code Search 中搜索形如: ViewHostMsg_ 会比较方便的找到消息发送和接收者。

frame相关的部分消息:
主进程接收消息文件
src\content\browser\frame_host\render_frame_host_impl.cc
src\content\browser\renderer_host\render_view_host_impl.cc
消息定义文件
src\content\common\frame_messages.h
子进程发送消息文件
src\content\renderer\render_frame_impl.cc

view相关的部分消息:
src\content\common\view_messages.h
src\content\renderer\render_view_impl.cc
src\content\browser\renderer_host\render_view_host_impl.cc

render_view_impl.cc是子进程的,render_view_host_impl.cc是主进成的。也就是带有_host的一般来说是主进程的内容。

02 添加新消息需要 rebuild 代码

添加新的IPC消息需要重新编译代码。所以最好一次性添加好自己想要的消息,或者采用带参数的消息。比如:类型和json格式。避免编译浪费时间。

添加新IPC消息后,仅仅执行 ninja -C out\DebugX64 chrome, 会提示类似错误:

decl IPC::MessageT<struct ViewHostMsg_RenderSendDataMain_Meta, class std::tuple<int, class std::basic_string<char, struct std::char_traits<char>, class std::allocator<char>>>, void>::Dispatch<class content::WebContentsImpl, class content::WebContentsImpl, class content::RenderViewHostImpl, void (__cdecl content::WebContentsImpl::*)(class content::RenderViewHostImpl *, int, class std::basic_string<char, struct std::char_traits<char>, class std::allocator<char>> const &)>(class IPC::Message const *, class content::WebContentsImpl *, class content::WebContentsImpl *, class content::RenderViewHostImpl *, void (__cdecl content::WebContentsImpl::*)(class content::RenderViewHostImpl *, int, class std::basic_string<char, struct std::char_traits<char>, class std::allocator<char>> const &))" (??$Dispatch@VWebContentsImpl@content@@V12@VRenderViewHostImpl@2@P812@EAAXPEAV32@HAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z@?$MessageT@UViewHostMsg_RenderSendDataMain_Meta@@V?$tuple@HV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@std@@X@IPC@@SA_NPEBVMessage@1@PEAVWebContentsImpl@content@@1PEAVRenderViewHostImpl@4@P834@EAAX2HAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z@Z))

lld-link: error: undefined symbol: "__cdecl IPC::MessageT<struct ViewHostMsg_RenderSendDataMain_Meta, class std::tuple<int, class std::basic_string<char, struct std::char_traits<char>, class std::allocator<char>>>, void>::MessageT<struct ViewHostMsg_RenderSendDataMain_Meta, class std::tuple<int, class std::basic_string<char, struct std::char_traits<char>, class std::allocator<char>>>, void>(int const &, class std::basic_string<char, struct std::char_traits<char>, class std::allocator<char>> const &)" (??0?$MessageT@UViewHostMsg_RenderSendDataMain_Meta@@V?$tuple@HV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@std@@X@IPC@@QEAA@AEBHAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
>>> referenced by D:\git\chromium\src\content\renderer\render_frame_impl.cc:4919
>>>               obj/content/renderer/renderer/render_frame_impl.obj:("virtual void __cdecl content::RenderFrameImpl::MonitorResourceRequest(class blink::ResourceRequest const &)" (?MonitorResourceRequest@RenderFrameImpl@content@@UEAAXAEBVResourceRequest@blink@@@Z))
ninja: build stopped: subcommand failed.

注意重新编译前要保存前面裁剪好的all.sln。

我是采用删除DebugX64文件夹后,gn gen,再重新编译的。
目前还不清楚ninja 的rebuild命令。

在没有增删文件的情况下,gn gen后,可以继续使用前面保存的all.sln,而不是用gn gen生成的新的all.sln。如果是手工裁剪项目还是有点烦时的。

03 自定义消息的注意事项

一定要注意消息的类型 routed 还是 control;同步还是异步(一般是异步消息)。

04 增加新的接口,很多时候也需要rebuild代码

当增加一些跨模块的接口时,编译时可以通过的,运行时会发生异常,比如页面崩溃,或者异常弹窗等。这时需要重新完整编译代码即可。

05 修改blink相关接口,一般需要rebuild代码

当修改blink相关的的接口时(涉及到纯虚函数的增、删、改),一般需要rebuild代码。否则会出现运行时错误。

猜你喜欢

转载自blog.csdn.net/longji/article/details/84860794