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