前言
最近某个项目需要轻度定制的 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"