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程式碼。否則會出現執行時錯誤。