1. 程式人生 > >chromium 21 chromium新增新的IPC訊息需要重新編譯

chromium 21 chromium新增新的IPC訊息需要重新編譯

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 &))" (
[email protected]
@[email protected]@[email protected]@[email protected]@[email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@[email protected][email protected][email protected]@[email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@[email protected]@[email protected]@@[email protected]@[email protected]@@[email protected]@[email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@[email protected])) 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 &)" ([email protected][email protected]@[email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@[email protected]@[email protected]@@[email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@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 &)" ([email protected]@[email protected]@[email protected]@@@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程式碼。否則會出現執行時錯誤。