编译Chromium注意事项:
系统要求
最好用最新稳定版的ubuntu系统编译(省去编译过程中的很多麻烦):
ubuntu版本:ubuntu-24.04.1-live-server-amd64
磁盘空间:至少180GB的可用磁盘空间(官方说的是100GB,实际上根本不够)。
内存:至少8GB内存,有条件的话可以整到16GB内存及以上(具体以电脑内存的一半合适,太大了会导致电脑非常卡)。
cpu:总核数越多越好,以实际机器支持为准。
编译环境:Vmare虚拟机。
虚拟机设置:
要想后面编译顺利快速,少走弯路,这步设置很关键。
修改虚拟机的内存大小为16GB(具体以你电脑支持的为准)。
修改虚拟机的cpu处理器数量,和每个处理器的内核数量,使得处理器内核总数达到最大为佳(以你实际电脑能支撑的最大核数为准,也不宜太大,否则电脑会有点卡顿)。
修改虚拟机磁盘空间,虚拟机默认创建的磁盘空间通常只有20GB,这对我们来说远远不够,我们需要将磁盘空间扩充到至少180GB。虚拟机扩容可参考:Vmare扩展ubuntu磁盘大小(扩容)
增加swap交换空间(推荐设置这个),有利于减轻内存的压力。
bash
#增加 Swap 空间(这个16G看你自己需要,也可以是4G,这个swapfile可以随便定义,比如swapfile1、swapfile2),可以依次增加多个:
sudo fallocate -l 16G /swapfile # 创建 16G 的 swap 文件
sudo chmod 600 /swapfile # 设置权限
sudo mkswap /swapfile # 设置 swap
sudo swapon /swapfile # 启用 swap
编译Chromium:
拉取chromium:
bash
git clone https://chromium.googlesource.com/chromium/tools/depot_tools
加入环境变量:
bash
export PATH="$PATH:/home/pc/depot_tools"
source ~/.bashrc # 或 source ~/.zshrc
执行fetch脚本需要权限,需要给相应脚本赋予执行权限:
shell
chmod -R +x /home/pc/depot_tools
#chmod +x depot_tools/fetch
#chmod +x depot_tools/gclient
#chmod +x depot_tools/vpython3
#chmod +x depot_tools/cipd
新建chromium文件夹并拉取源码(顺利的话大概需要1个半小时左右的样子):
bash
mkdir chromium && cd chromium
fetch --nohooks --no-history android
# gclient sync
安装build依赖:
bash
cd /home/pc/chromium/src
build/install-build-deps.sh
运行钩子:
gclient runhooks
源码编译:
ini
#chmod +r /home/pc/chromium/src/third_party/androidx/cipd/BUILD.gn
gn gen --args='target_os="android" target_cpu="arm"' out/Default
编译生成apk:
sql
autoninja -C out/Default chrome_public_apk
#执行完后生成apk,apk的路径在:/home/pc/chromium/src/out/Default/apks/ChromePublic.apk
#清理out/Default下的其它编译生成文件
# gn clean out/Default
解决编译过程中的其他问题(可跳过):
bash
#清理并重新同步:
gclient sync --reset
#更新仓库到最新版本:
git pull origin main
gclient sync
#权限问题,导致 BUILD.gn 文件无法读取。
ls -l /home/pc/chromium/src/third_party/androidx/cipd/BUILD.gn
chmod +r /home/pc/chromium/src/third_party/androidx/cipd/BUILD.gn
内存不够导致的问题:构建过程在编译 csa-optimize-phase.cc
文件时被系统杀掉了("Killed"),通常这意味着系统资源不足,可能是内存不足或进程占用了太多的 CPU 资源。
bash
#增加 Swap 空间:
sudo fallocate -l 4G /swapfile # 创建 4G 的 swap 文件
sudo chmod 600 /swapfile # 设置权限
sudo mkswap /swapfile # 设置 swap
sudo swapon /swapfile # 启用 swap
Chromium定制化:
修改out/Default/args.gn
ini
sudo vim out/Default/args.gn
#args.gn
target_os = "android"
target_cpu = "arm"
is_debug = false
enable_nacl = false
# 使用Chrome官方的编译优化建议
is_official_build = true
# 分散链接编译
is_component_build = false
# 不使用官方API秘钥
use_official_google_api_keys = false
# 支持H264编码
proprietary_codecs = true
# 解码器
ffmpeg_branding = "Chrome"
# 解决不能播放MP4格式的视频问题
chrome_pgo_phase = 0
rtc_use_h264 = true
treat_warnings_as_errors = false
查看gn args支持哪些参数:
scss
gn args --list out/Default
chromium默认编译出来的装到手机上后是以手机模式运行的,我们想要把他改成电脑模式:
ini
grep -rnw './chrome/android/java/src/org/chromium/chrome/browser' -e 'ChromeActivity'
# 找到chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
sudo vim chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
# 搜索 getUseDesktopUserAgent,
将 usingDesktopUserAgent = !usingDesktopUserAgent;
改成:usingDesktopUserAgent = true;
#搜索 getWebContents , 在 if (tab != null) {
下加上:
boolean usingDesktopUserAgent = true;
Profile profile = getCurrentTabModel().getProfile();
RequestDesktopUtils.setRequestDesktopSiteContentSettingsForUrl(profile, tab.getUrl(), usingDesktopUserAgent);
TabUtils.switchUserAgent(tab,usingDesktopUserAgent,UseDesktopUserAgentCaller.ON_MENU_OR_KEYBOARD_ACTION);
TrackerFactory.getTrackerForProfile(profile).notifyEvent(EventConstants.APP_MENU_DESKTOP_SITE_EXCEPTION_ADDED);
RequestDesktopUtils.recordUserChangeUserAgent(usingDesktopUserAgent, getActivityTab());
# boolean usingDesktopUserAgent =
# currentTab.getWebContents().getNavigationController().getUseDesktopUserAgent();
更改应用包名(chromium默认的包名是org.chromium.chrome):
bash
sudo vim chrome/android/chrome_public_apk_tmpl.gni
# 找到chrome_public_manifest_package , 将他的值替换成自己的包名
# 查找chrome_public_manifest_package
# grep -r 'chrome_public_manifest_package' .
shell
sudo vim chrome/android/BUILD.gn
# 按ESC ,然后输入 /package = ,按enter确认后搜索,可按 n 键查找下一个。
#我们的目标是:manifest_package = chrome_public_manifest_package ,这个我们需要找到chrome_public_manifest_package这个定义的地方,并将他的值
#替换成我们自己的包名。
#注意不要修改这些 resources_package = "org.chromium.chrome",像其他模块下的也不用修改,比如 android_library("chrome_unit_test_util_java") #或者 android_library("chrome_test_util_java")
#或者 android_library("chrome_test_java") 或者 android_library("chrome_test_vr_java")
#或者 resources_package = "org.chromium.chrome.base"等都不用改。
查找应用版本号(这个可以跳过):
perl
sudo vim chrome/android/BUILD.gn
# 输入 /version_code 回车查找到 trichrome_version_code
# 查找trichrome_version_code
grep -rnw './' -e 'trichrome_version_code'
# 很明显指向了 TRICHROME_VERSION_CODE
grep -rnw './build/' -e 'TRICHROME_VERSION_CODE'
# /android_chrome_version GenerateVersionCodes
grep -rnw './build/' -e 'android_chrome_version'
grep -rnw './build/' -e 'GenerateVersionCodes'
# self.assertEqual(trichrome_version_code
perl
# version_name = chrome_version_name
# 查找chrome_version_name
grep -rnw './' -e 'chrome_version_name'
# 很明显,指向了 chrome_version_full
#查找到 chrome_version_full = _result.full
# 查找_result.full
grep -rnw './' -e '_result.full'
修改应用图标:
bash
grep -rnw './' -e 'res_chromium'
# fre_product_logo.png product_logo_name.png
# chrome_app_java_resources
grep -rnw './' -e 'chrome_app_java_resources'
grep -rnw './' -e 'product_logo_name.png'
ls -l components/browser_ui/styles/android/java/res_chromium/drawable-*
# /home/pc/chromium/src/components/browser_ui/styles/android/java/res_chromium/drawable-xhdpi/fre_product_logo.png
# /home/pc/chromium/src/components/browser_ui/styles/android/java/res_chromium/drawable-xhdpi/product_logo_name.png
# 经过我们最终定位,发现应用的图标在components/browser_ui/styles/android/java/res_chromium目录下,将对应的图标都替换成你自己上传的即可。
# 替换该目录/home/pc/chromium/src/chrome/android/java/res_chromium_base下的所有app_icon.png 和 layered_app_icon.png 文件
比如 /home/pc/chromium/src/chrome/android/java/res_chromium_base/mipmap-hdpi
修改应用名称:
bash
sudo vim chrome/android/java/res_chromium_base/values/channel_constants.xml
# 修改app_name 的值为应用的名字
屏蔽启动引导页:
kotlin
sudo vim chrome/android/java/src/org/chromium/chrome/browser/init/AsyncInitializationActivity.java
# 找到 /requiresFirstRunToBeCompleted ,将方法返回值由原来的true 改成false
sudo vim chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java
# 找到 /if (FirstRunFlowSequencer.launch( , 将以下方法完整注释掉:
if (FirstRunFlowSequencer.launch(mActivity, mIntent, false /* requiresBroadcast */,
false /* preferLightweightFre */)) {
return Action.FINISH_ACTIVITY;
}
应用全屏显示:
ini
sudo vim chrome/android/java/res/values-sw600dp-v26/styles.xml
#在style标签下方添加如下item:
<item name="android:windowLightStatusBar">false</item>
<item name="windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowActionBar">false</item>
sudo vim chrome/android/java/res/values-v26/styles.xml
# 这个跟上面设置一样
# 注意: <item name="android:windowLightStatusBar">@bool/window_light_status_bar</item>
<item name="android:windowLightStatusBar">false</item>
#这两个标签不能同时用
移除首页所有菜单栏
ini
sudo vim chrome/android/java/res_app/layout/main.xml
# 找到 /CoordinatorLayoutForPointer , 增加 android:layout_marginTop="-96dp" ,如下:
<org.chromium.components.browser_ui.widget.CoordinatorLayoutForPointer
android:id="@+id/coordinator"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:layout_marginTop="-96dp">
加载自己默认的标签页:
bash
sudo vim components/embedder_support/android/java/src/org/chromium/components/embedder_support/util/UrlConstants.java
# 分别找到 /NTP_URL 和 /NTP_NON_NATIVE_URL 将他们的值修改成你默认要打开的网页地址
以上定制化配置全部修改完毕后,我们可以重新生成apk:
sql
autoninja -C out/Default chrome_public_apk
#执行完后生成apk,apk的路径在:/home/pc/chromium/src/out/Default/apks/ChromePublic.apk
产品展示:
chromiun内核版本:132.0.6778.0