前言

最近某个项目需要轻度定制的 Chromium ,记录一下编译和修改的过程。

这篇文章主要记录以下内容:

  • 如何拉取 Chromium for Android 的代码
  • 如何编译 Chromium for Android
  • 一些对 Chromium for Android 的小定制与修改
  • 看 Chromium 源码时的经验小记

谷歌官方的编译方式可以在这里找到:
https://chromium.googlesource.com/chromium/src/+/HEAD/docs/android_build_instructions.md
本文会在官方说明的基础上进行进一步的解释与补充。

工作环境

编译 Chromium for Android 需要 Linux 环境,并且只能使用 Linux 环境。
本文所使用的编译环境时 Arch Linux。
编译机配置,推荐 16GB 内存(跑的时候峰值需求能到 9GB 多),100GB 磁盘空间(拉取完整源码并编译 98 版本,最后实际消耗 78GB )。

首先的首先,创建一个文件夹,用来存放相关内容。
mkdir ~/work
cd ~/work

编译需要一些软件包的支持,由于此处的编译环境是 Arch Linux ,官方并没有为其提供一键安装软件包的脚本,因此基本上是报错缺啥装啥。
当然, base-devel 可以先装好。

源码的拉取

源码本体就在这里。
https://chromium.googlesource.com/chromium/src/

但是,由于编译源码需要一些额外的树外工具和 hooks ,而这些东西并不包含在主代码中,因此我们仍然需要使用谷歌的官方工具进行源码拉取。

获取源码管理工具

下载工具。
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git

将工具增加到环境变量。
export PATH="${PATH}:${HOME}/work/depot_tools"

拉取源码

mkdir chromium && cd chromium
fetch --nohooks android

此处拉取的完整代码,为的是稍后切换版本时方便,我想没有人会想把非常不稳定的主线版本拿来日用吧。
--nohooks代表暂时先不安装 hooks ,而只是拉取代码,hooks 我们稍后安装,按部就班的来。

这一步可能需要非常久的时间,而且建议开启代理,源码大小在 50GB 左右。

选择版本

在上一步完成后,工作目录下会多出一个 src 文件夹。
进入此文件夹。
cd src

从仓库刷新所有的 Tags。
git fetch origin --tags

查看 Tags。
git tag

选择一个心仪的 Tag 检出代码,比如:
git checkout 97.0.4692.93

安装 hooks 和 树外依赖

(ubuntu专用)安装依赖软件包
./build/install-build-deps-android.sh
Arch Linux 并不支持这个脚本,因此需要手动的“缺啥补啥”。
某些软件包甚至 Arch 官方仓库里没有,需要从 AUR 安装,比如
ncurses5-compat-libs

再次刷新源码并安装 树外依赖 和 hooks 。
gclient sync
这一步也需要下载不少的东西,请确保网络畅通。

编译

配置编译

指定编译配置文件。
gn args out/Default
其中,out/Default 是编译输出目录。

这一步操作后会打开一个文本编辑器,在其中写入编译配置:

# 目标操作系统
target_os = "android"
# 目标架构
target_cpu = "arm64"
# 不把警告作为错误,否则有一定可能性遭遇警告转来的编译错误
treat_warnings_as_errors = false
# 编译“正式版”,而非“开发人员内部版本”,启动正式版具有的性能优化
is_official_build = true
# 编译 ffmpeg 相关模块以提供 H.264 视频解码功能
ffmpeg_branding = "Chrome"
proprietary_codecs = true

开始编译

autoninja -C out/Default chrome_public_apk

然后编译就开始了,记得依赖缺啥补啥。

编译完成后,可以在 out/Default/apks 下找到安装包。

刷新代码

也许有一天,你会想要更新本地代码,拉取新代码编译新版 Chromium,此时需要做的是:

  • 配置环境变量
  • 进入 src 文件夹
  • 获取新代码:git fetch origin --tags
  • 检出新代码:git checkout <新的版本>
  • 更新 Hooks 和 树外工具:gclient sync
  • 编译!autoninja -C out/Default chrome_public_apk

搞定!

魔改

以下内容基于版本 108.0.5359.46 ,可能不适用于未来的新版本。
魔改的内容主要是“去谷歌化”,完整 patch 可 点击此处下载

修改默认搜索引擎

diff --git a/components/search_engines/template_url_prepopulate_data.cc b/components/search_engines/template_url_prepopulate_data.cc
index bb2366ed01a2d..68fcf8dc6d40f 100644
--- a/components/search_engines/template_url_prepopulate_data.cc
+++ b/components/search_engines/template_url_prepopulate_data.cc
@@ -201,10 +201,9 @@ const PrepopulatedEngine* const engines_CL[] = {
 
 // China
 const PrepopulatedEngine* const engines_CN[] = {
-    &sogou,
-    &baidu,
     &bing,
-    &google,
+    &baidu,
+    &sogou,
     &so_360,
 };

注意:只要搜索引擎列表里有谷歌,默认搜索引擎永远是谷歌,把谷歌删了后,默认搜索引擎是第一个。

默认关闭登录谷歌引导

diff --git a/components/signin/internal/identity_manager/primary_account_manager.cc b/components/signin/internal/identity_manager/primary_account_manager.cc
index d8b6883073669..2ddc389f975e6 100644
--- a/components/signin/internal/identity_manager/primary_account_manager.cc
+++ b/components/signin/internal/identity_manager/primary_account_manager.cc
@@ -52,7 +52,7 @@ void PrimaryAccountManager::RegisterProfilePrefs(PrefRegistrySimple* registry) {
   registry->RegisterBooleanPref(prefs::kGoogleServicesConsentedToSync, false);
   registry->RegisterBooleanPref(prefs::kAutologinEnabled, true);
   registry->RegisterListPref(prefs::kReverseAutologinRejectedEmailList);
-  registry->RegisterBooleanPref(prefs::kSigninAllowed, true);
+  registry->RegisterBooleanPref(prefs::kSigninAllowed, false);
   registry->RegisterBooleanPref(prefs::kSignedInWithCredentialProvider, false);
 }

Chromium 中的默认偏好都是在 Native 层中使用如上方式注册的,因此在搜索某个设置时可以使用:
grep -rn "Register.*Pref" --exclude-dir=out --exclude-dir=.git | grep -i <你的关键词>
来快速定位一个设置。

自动跳过启动引导页面

diff --git a/chrome/browser/first_run/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunStatus.java b/chrome/browser/first_run/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunStatus.java
index 46536c7cdd988..4592bb0d1de64 100644
--- a/chrome/browser/first_run/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunStatus.java
+++ b/chrome/browser/first_run/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunStatus.java
@@ -61,8 +61,7 @@ public class FirstRunStatus {
      * Checks whether the welcome page should be skipped from the main First Run Experience.
      */
     public static boolean shouldSkipWelcomePage() {
-        return SharedPreferencesManager.getInstance().readBoolean(
-                ChromePreferenceKeys.FIRST_RUN_SKIP_WELCOME_PAGE, false);
+        return true;
     }

移除不想要的设置选项

diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/MainSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/MainSettings.java
index c72bed9714299..3000d6d83efbb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/MainSettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/MainSettings.java
@@ -273,6 +273,9 @@ public class MainSettings extends PreferenceFragmentCompat
         } else {
             removePreferenceIfPresent(PREF_DEVELOPER);
         }
+
+        removePreferenceIfPresent(PREF_ACCOUNT_AND_GOOGLE_SERVICES_SECTION);
+        removePreferenceIfPresent(PREF_GOOGLE_SERVICES);
     }

不显示开发者选项

diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tracing/settings/DeveloperSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/tracing/settings/DeveloperSettings.java
index 94e967e18b9a0..e673e46b25396 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tracing/settings/DeveloperSettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tracing/settings/DeveloperSettings.java
@@ -33,7 +33,6 @@ public class DeveloperSettings extends PreferenceFragmentCompat {
         // Chrome version in Settings>About multiple times.
         if (sIsEnabledForTests != null) return sIsEnabledForTests;
 
-        if (VersionConstants.CHANNEL <= Channel.DEV) return true;
         return SharedPreferencesManager.getInstance().readBoolean(
                 ChromePreferenceKeys.SETTINGS_DEVELOPER_ENABLED, false);
     }

禁用主页上的“探索”

diff --git a/components/feed/core/shared_prefs/pref_names.cc b/components/feed/core/shared_prefs/pref_names.cc
index e239b42b31ef3..60c03b73930f4 100644
--- a/components/feed/core/shared_prefs/pref_names.cc
+++ b/components/feed/core/shared_prefs/pref_names.cc
@@ -21,7 +21,7 @@ const char kVideoPreviewsType[] = "ntp_snippets.video_previews_type";
 
 void RegisterFeedSharedProfilePrefs(PrefRegistrySimple* registry) {
   registry->RegisterBooleanPref(kEnableSnippets, true);
-  registry->RegisterBooleanPref(kArticlesListVisible, true);
+  registry->RegisterBooleanPref(kArticlesListVisible, false);
   registry->RegisterIntegerPref(kVideoPreviewsType, 1);
 }
 
diff --git a/chrome/browser/feed/android/java/res/layout/new_tab_page_feed_v2_expandable_header.xml b/chrome/browser/feed/android/java/res/layout/new_tab_page_feed_v2_expandable_header.xml
index ee1283cb9a6a0..01cf8d4ef4e7e 100644
--- a/chrome/browser/feed/android/java/res/layout/new_tab_page_feed_v2_expandable_header.xml
+++ b/chrome/browser/feed/android/java/res/layout/new_tab_page_feed_v2_expandable_header.xml
@@ -14,7 +14,8 @@ found in the LICENSE file.
     android:minHeight="@dimen/snippets_article_header_height"
     android:orientation="vertical"
     android:gravity="center_vertical"
-    android:layoutDirection="locale" >
+    android:layoutDirection="locale"
+    android:visibility="gone" >
 
     <RelativeLayout
         tools:ignore="RelativeOverlap"
 
diff --git a/chrome/browser/feed/android/java/res/layout/new_tab_page_multi_feed_header.xml b/chrome/browser/feed/android/java/res/layout/new_tab_page_multi_feed_header.xml
index 13bb0a67008f0..950d84f08f49c 100644
--- a/chrome/browser/feed/android/java/res/layout/new_tab_page_multi_feed_header.xml
+++ b/chrome/browser/feed/android/java/res/layout/new_tab_page_multi_feed_header.xml
@@ -11,7 +11,8 @@ found in the LICENSE file.
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:orientation="vertical" >
+    android:orientation="vertical"
+    android:visibility="gone" >
 
   <RelativeLayout
       android:id="@+id/main_content"