Chromeをビルドして部屋を暖めよう

この記事は、慶應理工アドベントカレンダー2021の17日目の記事です。

昨日の記事はこちら。 qiita.com 物理xプログラムしてる人があまり周りにいないので新鮮で面白いです。



最近寒い日が続きますね。

Chromeをビルドして部屋を暖めませんか。




組み立てた

本題に入る前に少しだけ。

11月に作業環境を新しくしたのです

https://twitter.com/ainnooo/status/1459803512389337092?s=20


パーツ選定が完全に初めてでして、ブログとTwitterYouTubeをにらめっこする日々の後、こんな構成になりました。

https://twitter.com/ainnooo/status/1459803775086985221?s=20

詳しい人にこの選定はどうなのかとか、各ブランドのイメージとか、相性とか、電源が過多だよとか教えてもらいました。



無事組み立てられた我がPC!

しかし組み立てたい駆動で組み立てたものですから、もったいないことに利用用途が小さなプログラムをコンパイルするくらいなのです。

足元に置いているのですが、最近は夜になるとクーラーで足元が寒いまであります。CPUに付属してきたクーラーなのですが。


これはなんとかして使ってあげないといけない。

よし、Chromeをビルドしよう!!!(飛躍)



ビルドしていく

基本的に公式のドキュメントに従います。

それでは始めます。

初っ端から8GBのメモリ(16GBがhighly recommended)、少なくとも100GBの空き容量が必要と言われます。

System requirements

A 64-bit Intel machine with at least 8GB of RAM. More than 16GB is highly recommended.

At least 100GB of free disk space.


Chromeをビルドしたい湯婆婆「...贅沢なOSSだねえ」

depot_toolsを取ってきます

$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
$ export PATH="$PATH:/path/to/depot_tools"


ソースコードをfetchします。地味に40分くらいかかりました。(え)

$ mkdir ~/chromium && cd ~/chromium
$ fetch --nohooks chromium


いろいろ準備します

$ cd src
$ ./build/install-build-deps.sh
$ gclient runhooks
$ gn gen out/Default


開発するわけではないですし、できるだけビルド時間を短くしたいのでout/Default/arg.gnの設定はこんな感じにしました

# Set build arguments here. See `gn help buildargs`.
is_debug = false
is_component_build = true
enable_nacl = false
symbol_level = 0
blink_symbol_level = 0
v8_symbol_level = 0


満を持して、ビルドです!

$ autoninja -C out/Default chrome



...1時間40分くらいかかりました!

他の方のブログを読んでもっとかかるかと覚悟していたので、予想より短かったです


立ち上げます

$ out/Default/chrome

愛着が湧きます




ビルド中のCPU/メモリ状態

ビルド中にvmstatのログを取っておいたのと、psensorというものを入れてCPU温度を取得してみました。

今回の環境です。

CPU(Ryzen5600G) 6コア 12スレッド 3.9GHz

メモリ 32GB


メモリに関してはfreeがスタート11649244KB、最小が2607552KBだったので9GBくらい利用してるんですかね...

CPUの方がほぼ100%の利用率です。温度は最高で53℃でした。ふわふわした読み取りしかできなくて悲しい




ソケット開く部分のコードを読む

ソフトウエアに逃げまして、せっかくビルドしたのでコードを読みます。

私はパケット処理とかがたぶん好きなので、ソケットを開くところを見つけてこようと思います。



ChromiumプロジェクトはCode Searchがあるのでこちらを使います。

Code Searchが強力すぎてgrepとか概念がなくなります。



雑に見つけてきました。net/socket/socket_descriptor.ccです。

おなじみの

SocketDescriptor result = ::socket(family, type, protocol);

登場です。もう少し上流にたどって呼び出し側を見てみます。

net/socket/tcp_client_socket.ccのTCPClientSocket::DoConnect()です。

OpenSocket()が先程のソケットを開くところにつながっていて、その後にアドレスをバインドしてそうです。おおー。


巨大なソフトウエアでも同じことしているんだなと感慨深くなったところで終わりにします




すこしいじる

最後に少しだけいじります。

ちなみに一度ビルドしてしまえば次回以降は差分ビルドなので快適です。


何を検索してもhttps://example.comにリクエストが飛んでしまうChromeです。

search barは "adventcalendar" なのに表示は examle.com の内容です。あまり需要はなさそうです。

ログ。

検索欄に一文字追加される毎に仕込んだログが書かれるのは面白いかもしれない。事前にリクエスト投げているとか??

diff(抜粋)。ほかはDCHECKが通らないところをコメントアウトしました(雑)

diff --git a/services/network/url_loader.cc b/services/network/url_loader.cc
index e53ff47c6f43d..1fdc125f6d788 100644
--- a/services/network/url_loader.cc
+++ b/services/network/url_loader.cc
@@ -577,8 +577,11 @@ URLLoader::URLLoader(
   }
   receiver_.set_disconnect_handler(
       base::BindOnce(&URLLoader::OnMojoDisconnect, base::Unretained(this)));
+
+       GURL url_examplecom = GURL("https://example.com");
+       LOG(ERROR) << "Change URL from" << request.url << " to " << url_examplecom;
   url_request_ = url_request_context_->CreateRequest(
-      GURL(request.url), request.priority, this, traffic_annotation,
+      url_examplecom, request.priority, this, traffic_annotation,
       /*is_for_websockets=*/false, request.net_log_create_info);
 
   url_request_->set_method(request.method);





部屋は全然暖まりませんでしたがここら辺で終わりにします。なんかおかしなところあったら是非教えてください!!!!


しまりがわるいな