一、背景
最近我司在做网页启动的优化,我通过对网络请求的观察,发现chromium创建的Connection的数目是有限的,这对于一些资源过多的页面来说,有点捉襟见肘了。 因此,笔者打算分析一下Chromium中的网络加载模块,看一下能否找到增加连接数目的方法。
本文主要分成如下几个阶段:
- 虚拟机环境的准备
- Chromium源码下载
- Chromium源码编译
二、虚拟机环境的准备
- 虚拟机:VMWare17
- 操作系统:Ubuntu20.04.2 (磁盘265GB 内存24GB)
- git (2.47.1)
- python环境, 可参考该文章
- 科学上网(略)
Ubuntu虚拟上所要配置的环境变量及代理:
虚拟机上设置代理: Settings--》 Network --》 Network Proxy ---》 设置代理 ---》 关闭
三、Chromium源码下载
这个阶段既费耐心,又费流量,做好心理准备,哈哈。 笔者尝试了三种方式,前两种失败了, 建议直接使用第三种。
3.1 安装depot_tools(需要科学上网)
Google仓库上的该工具要比码云上的更新, 其需要依赖的python版本是3.8 , 而码云上的代码依赖的python版本是2.7。
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH="$PATH:/path/to/depot_tools"
还是需要注意 depot_tools的版本,建议使用Google官网最新的。
3.2 下载代码
- 确定要获取的代码版本
- 从码云上下载对应版本的代码 (这里不需要 “科学上网”)
- 使用depot_tools中的Gclient同步Google的依赖
3.2.1 代码版本确定
代码版本确定:先查看一下,当前Android设备上的Webview的版本:
# adb shell dumpsys package com.android.chrome | grep versionName
versionName=114.0.5735.131
然后通过 码云下载 指定版本的代码,本文中的版本是(114.0.5735.131)
3.2.2 下载对应版本代码
mkdir chromium && cd chromium # 创建一个工作目录
git clone --depth 100 -b 114.0.5735.131 https://gitee.com/mirrors/chromium.git src
3.2.3 同步第三库及下载编译依赖
然后通过gclient 同步google上的依赖库。(这一步是需要“科学上网”的)。 依次创建gclient.boto 和 .gclient文件, 内容文件如下,其作用是配置gclient的运行参数。
gclient.boto 需要通过 环境变量 NO_AUTH_BOTO_CONFIG进行配置 export NO_AUTH_BOTO_CONFIG=<gclient.boto 路径>
```text
// file : gclient.boto
[boto]
proxy = <proxy_ip>
proxy_port = <port>
proxy_type = http
// file : .gclient
solutions = [
{ "name" : "src",
"url" : "https://chromium.googlesource.com/chromium/src.git",
"deps_file" : "DEPS",
"managed" : False,
"custom_deps" : {
},
"custom_vars": {
# "download_remoteexec_cfg": True
# "download_remoteexec_cfg": True,
# "rbe_instance": "projects/rbe-chromium-untrusted/instances/default_instance",
},
},
]
cache_dir = None
target_os=["android"]
接下来执行:
gclient sync
gclient runhooks
3.3 下载代码其他方式(失败了,可以忽略掉)
记录一下过去一周的所尝试的方法。
3.3.1 下载方式一 (失败)
mkdir chromium && cd chromium
fetch --nohooks --no-history android
gti fetch origin --tags
git tag
上述方式是官方给出的同步方式。但是国内的网络环境(“尤其是科学上网之后”),是最大的一个挑战。 更为苦涩的是 没有断点续传功能,一旦失败,需要重新开始。
上述fetch命令中的, “ --nohooks --no-history” 选项还是很重要的, 可以节省一些 不必要的浪费。
3.3.2 下载方式二(失败)
fetch chromium
这种方式,消耗的流量就更大了。
3.3.3 遇到的错误
无论是选择 “下载方式一” 还是选择 “下载方式二”, 都会报下面的错误:
error: RPC failed; curl 56 GnuTLS recv error (-9): Error decoding the received TLS packet. fatal: the remote end hung up unexpectedly fatal: early EOF fatal: index-pack failed
下面是一些笔者尝试的方式,最终没有解决。 大家可以参考一下。 给我的感觉是, 修改git.httpbuffer没有效果。
-
[linux] error: RPC failed; curl 56 GnuTLS recv error (-9): Error decoding the received TLS packet.e
-
Solved: Fix for Git clone failure due to GnuTLS recv error (-9)
-
Repo之解决GnuTLS recv error (-9): Error decoding the received TLS packet(二十九)
四、编译
4.1 编译
- 使用GN生成编译配置
- 使用AutoNinja 编译
gn args out/Default # 会弹出一个配置文件,输入如下配置:
target_os = "android"
target_cpu = "arm64"
# 不把警告作为错误,不然很有可能报错
treat_warnings_as_errors = false
然后进行保存
4.2 编译错误
chromium.googlesource.com/chromium/sr… ninjia生成阶段找不到cfg文件
上面问题的链接 : blog.csdn.net/hns707/arti…
上面问题的最终解决方式:(禁用掉 use_reb 、 use_gamo)
依据Chromium版本,回退了depot_tools 的版本,然后进行了同步操作,发现提示如下:
终于编译起来了:
4.3 编译成功
四、安装
安装:
# adb install ....../ChromePublic.apk
Performing Streamed Install
Success
启动:
五、相关链接
写在最后
Chromium源码的下载,太费流量,太浪费Money了。