前一段參與了一個項目,項目內(nèi)部使用了chromium作為基礎(chǔ)庫,這也是我第一次接觸chromium,到現(xiàn)在差不多半年時間,這里說說使用心得。
優(yōu)點
先進(jìn)的多線程任務(wù)處理理念:少用共享內(nèi)存,少用鎖,多用任務(wù)分發(fā),特定的task放在固定的sequence中。具體可以看這篇文章:
多線程開發(fā)中,多用消息傳遞,少用鎖
跨平臺,且功能強(qiáng)大,比如網(wǎng)絡(luò)通信、進(jìn)程間通信、如何啟動進(jìn)程并傳遞參數(shù)等,都有比較好用的封裝。
有自己的一套編譯構(gòu)建規(guī)則GN,這貌似不能算作一個優(yōu)點,畢竟學(xué)習(xí)成本高,但是它和bazel類似,你會感覺很熟悉。配置了很嚴(yán)格的編譯參數(shù),確保代碼的健壯性。很多在其它地方(-Wall -Werror等)可以編譯通過的代碼,在chromium里都編譯不通過,具體為啥我還沒來得及深入研究。
內(nèi)部集成了很多檢測機(jī)制,編譯時檢查和運行時檢查,可以檢查某個操作是否在特定的sequence中,如果不在的話,debug模式時會觸發(fā)斷言。這樣可以確保很多操作是線程安全的,進(jìn)一步增強(qiáng)代碼的健壯性。
具體可以看看這篇文章:https://aijishu.com/a/1060000000091082#item-2-1
缺點
整個chromium太大了,我自己本地看了下,除去.git,大概有60G左右,配置它的環(huán)境非常麻煩,需要翻墻,拉取它所有的依賴庫也特別耗時。
因為項目特別大,編譯時間特別長,特別是全量編譯。
項目大,其實不適合做普通項目的基礎(chǔ)庫,普通項目用不到chromium的大多數(shù)功能,還要忍受它占用空間大,配置環(huán)境麻煩,編譯時間長的缺點。而且編出來的可執(zhí)行文件體積很大,特別是做SDK,如果對體積有要求的話,估計不能滿足要求。
不能引用其他的第三方C++動態(tài)鏈接庫或者靜態(tài)鏈接庫,因為它內(nèi)部集成了一套自己魔改的C++源碼,使用的這套C++源碼做的編譯,和外部的三方庫不兼容。比如一個std::string,正常庫中的符號應(yīng)該是std::basic_string,而在chromium中,它卻是std::__1::basic_string,導(dǎo)致和其他庫不兼容,集成時候會報找不到相關(guān)符號。
因為它內(nèi)部集成了一套自己魔改的C++源碼,所以裁剪時也不太方便,其中的base、sql等模塊裁剪還挺容易。
而有些模塊需要強(qiáng)依賴這套內(nèi)部的C++源碼才能編譯成功,無法裁剪,最近我也是在裁剪這塊踩了好多坑。
google還提供了一個mini-chromium project,其實就是base的子集,就是給那些想用base作為基礎(chǔ)庫的項目使用的,但是這個project功能太少,用處不大。
遇到了問題在網(wǎng)上找答案不是很方便,畢竟用的人少。
建議
貌似edge瀏覽器就是在chromium的基礎(chǔ)上開發(fā)的,但小項目建議就別用它了,太麻煩,個人看法,單純從基礎(chǔ)庫的角度來說,不如boost方便。
不知道大家對chromium怎么看,可以留言聊聊。