如何在 Android 上使用思源黑體作為系統字體?


知道自己的答案和這篇答案撞車了,印象中知乎還有一篇寫得相當詳細的答案,但是我找不到了。我一直想把「如何評價思源黑體 (Source Han Sans) 字族?」過於冗長的部分獨立出來,同時也想為自己折騰的歷程做個總結,所以又寫了這篇答案。

適用於 Android 5.x 以上,基於思源黑體 1.004 版本:

背景:

Google 已經將 Noto Sans CJK(思源黑體的 Google 版)作為 Android 5.0 以後的系統字體。(剛發布時,Adobe 說這是一款用於桌面的字體……[1])然而由於系統安裝包的體積有限,Google 只在系統中內置了簡、繁、日、韓 4 個高度子集化的字體,應該是只保留了相應地區與其他地區字形不同的字,日文假名依然使用 4.x 時代的 MTLmr3m.ttf(因為這 4 個字體都不含假名),而且只提供了一個字重。某些廠商(如 Motorola、Sony)更是將這些字體刪除,僅使用古老的 Droid Sans Fallback。(索尼罪大滔天!)因此,要想獲得 Android 5.x 的終極字體體驗,還是需要折騰一番。

在操作之前,請先通讀教程,手機要獲得 Root 許可權或者能進入 Recovery,需要掌握相應的 Android 和 Linux 知識。如果你不清楚每一步是在做什麼和可能導致的後果,請不要操作。

先上效果

左:只使用 Regular,右:加入 Medium 與 Light

左:偽粗體,右:加入 Bold

(偽粗體會有較多的筆畫粘連,邊緣比較模糊,實機顯示效果差別更大。)1. 將需要的字體複製到 /system/fonts 目錄下,我推薦 Region-specific Subset OTF 版,在這裡可以獲得。由於 Android 現在擁有了新的 OTF 渲染引擎,因此無需將 otf 改名 ttf,更不需要用字體編輯軟體。比如(我沒有韓文需求,所以這裡沒有列韓文版,下同):

SourceHanSansCN-Light.otf
SourceHanSansCN-Regular.otf
SourceHanSansCN-Medium.otf
SourceHanSansCN-Bold.otf
SourceHanSansTW-Light.otf
SourceHanSansTW-Regular.otf
SourceHanSansTW-Bold.otf
SourceHanSansJP-Light.otf
SourceHanSansJP-Regular.otf
SourceHanSansJP-Bold.otf

一共增加了 61.3MB,比系統自帶的 15.5 MB 要大不少。

注釋:為什麼要有 Medium?

按照 Google 官方 Material Design 指南 Styles 一節[2],Light 字重只用於最大的 Display 4 樣式,而 Medium 廣泛應用在小標題和按鈕上,缺席的卻是 Bold。可能是由於 Google 認為 Bold 對於 UI 字體來說太粗了,這一點在這一節的後半部分關於 Tall Script(南亞、東南亞語言)的解釋中可以推測出來。

(Medium 字重和高亮色一起構成了「這個元素可以點擊」這樣的暗示。)

隨著扁平化的潮流,iOS 的 UI 中 Medium 字重也廣泛應用在標題上[3]:

(在系統 UI 中,你基本見不到 Bold 的身影。)

不幸的是,Android 發行版實際上只為 CJK 提供了一個字重,比 Tall Script 的兩個字重還要少,Google 官方卻厚顏無恥地說 Noto Sans CJK 有七種字重,所以可以和英文使用一樣的字重設置……因此,當開發者使用 Medium 的時候,我們看到的是 Regular,而 Android 系統也不會像 Bold 那樣自動加粗生成一個偽粗體,這種字體的微妙差別完全無法體現。

因此我的建議是為自己 UI 常用的語言備齊 4 個字重(Light、Regular、Medium、Bold),而對於其他的語言,備齊 3 個。這是因為在網頁和文檔中 Bold 還在廣泛使用(為了做出強烈的對比),Light 也在一些網頁設計中佔有非常重要的地位(CSS 就提供 font-weight: lighter),甚至到了濫用的程度。

2. 編輯 /system/etc/fonts.xml,將(Android 5.x)

&
&NotoSansHans-Regular.otf&
&
&
&NotoSansHant-Regular.otf&
&
&
&NotoSansJP-Regular.otf&
&
&
&NotoSansKR-Regular.otf&
&

或者(Android 6.0)

&
&NotoSansSC-Regular.otf&
&
&
&NotoSansTC-Regular.otf&
&
&
&NotoSansJP-Regular.otf&
&
&
&NotoSansKR-Regular.otf&
&

替換為

&
&SourceHanSansCN-Light.otf&
&SourceHanSansCN-Regular.otf&
&SourceHanSansCN-Medium.otf&
&SourceHanSansCN-Bold.otf&
&
&
&SourceHanSansTW-Light.otf&
&SourceHanSansTW-Regular.otf&
&SourceHanSansTW-Bold.otf&
&
&
&SourceHanSansJP-Light.otf&
&SourceHanSansJP-Regular.otf&
&SourceHanSansJP-Bold.otf&
&
&
&NotoSansKR-Regular.otf&
&

理論上還應該修改為了兼容舊軟體而保留的 /system/etc/fallback_fonts.xml,然而實際測試只修改 fonts.xml 沒有發現有問題的地方,故此步驟可選,如有需要可以參照下方適用於 4.x 的部分。

3. 修復許可權,將以上涉及的所有文件的許可權設置為 644 (-rw-r--r--),可以用文件管理器手工操作,也可以使用 adb:

adb shell
su
mount -o rw,remount /system
chgrp 0 /system/etc/fonts.xml
chmod 644 /system/etc/fonts.xml
chgrp 0 /system/fonts/*
chmod 644 /system/fonts/*

必須正確修改許可權,否則可能會導致字體異常甚至變磚,請做好一切備份。即使按照正確的步驟操作,部分脆弱機型也可能會無限重啟或變磚,為了保險可以在 Recovery 下操作。如遇上述情況可以嘗試清理緩存和 Dalvik 緩存。(不要問我是怎麼知道的,這些都是血與淚換來的。)

4. 重啟。

附:Recovery 下全程用 adb 操作的步驟,Windows 系統

首先掛載 /system,然後:

for %i in (*.otf) do adb push %i /system/etc/%~nxi
for %i in (*.xml) do adb push %i /system/etc/%~nxi
adb shell
chmod 644 /system/etc/fonts.xml
chmod 644 /system/fonts/*
reboot

PS:隨著 Android 字體技術的進步,缺字、錯亂等問題都不復存在了,也不用再考慮 Android 4.x 中的粗體問題。

參考資料

[1] 隆重介紹 思源黑體:一款Pan-CJK 開源字體

[2] https://www.google.com/design/spec/style/typography.html

[3] https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/MobileHIG/ColorImagesText.html

-----

(原答案,轉移自 https://www.zhihu.com/question/24499749/answer/28047028)

適用於 Android 4.x,基於思源黑體 1.001 版本:

(1) 初級用法

注意,在 Android 中修改字體,請務必注意許可權問題,否則將導致字體異常甚至變磚。請做好一切備份,如果變磚請進入 Recovery 操作。

我習慣的做法不是替換字體,而是將字體直接複製到 /system/fonts 目錄下,然後在 fallback_fonts.xml 的

&
&
&DroidSansFallback.ttf&
&

&

前加入

&
&
&SourceHanSansCN-Regular.otf&
&SourceHanSansCN-Bold.otf&
&

&

本來以為這麼一做又入改字體的大坑了。但是這次 Android 奇怪的 fallback 機制居然表現得異常完美。

▲ fallback 韓文。

▲ 國際音標,依然那麼&銷魂& 慘不忍睹。(其實是 fallback 到了 Droid Sans Fallback。)

▲ 顏文字,完美。

(這一段主要是對我的這個答案的回應:對比 iOS 系統 Android 的字體渲染有何區別?)

(2) 進階用法

我已經在 Android 上使用思源黑體半個多月,幾乎沒有任何兼容性上的問題,而且神奇地避開了 Android 在字體 fallback 和渲染上的一些小 bug [注1],更加堅定了我將其用作主力字體的信心。

Android
自 4.1 以來增加了 fallback 時對不同語言可以採用不同的次序的功能,配合 MTLmr3m.ttf
字體,為日語用戶提供了日文漢字字形。於是思源黑體也可以如法炮製:將不同區域的版本拷貝到 /system/fonts 後,在原版的
fallback_fonts.xml 的

&
&
&DroidSansFallback.ttf&
&

&

前加入

&
&
&SourceHanSansCN-Regular.otf&
&SourceHanSansCN-Bold.otf&
&

&

&
&
&SourceHanSansTWHK-Regular.otf&
&SourceHanSansTWHK-Bold.otf&
&

&

&
&
&SourceHanSansTWHK-Regular.otf&
&SourceHanSansTWHK-Bold.otf&
&

&

&
&
&SourceHanSansTWHK-Regular.otf&
&SourceHanSansTWHK-Bold.otf&
&

&

再在之後加入

&
&
&SourceHanSansJP-Regular.otf&
&SourceHanSansJP-Bold.otf&
&

&

即可根據語言的不同自動調用相應的地區字形。(我沒有安裝韓文版。)

說幾點問題:

  1. 從上面可以看出語言代碼是區分大小寫的。
  2. 只有日語能在切換系統界面語言時切換字形;語言設為繁體依然是簡體字形,然而在網頁中卻可以。
  3. 系統語言設為日語時顯示簡體中文會缺字,無法正確 fallback。[注2]
  4. 繁體版的逗號太高了,明顯高於居中的位置。

  5. 網頁中有行距問題,參考下圖:

(3) 粗體問題

這麼做本來是沒有問題的,但是萬惡的 Adobe 把 1.001 版的粗體的信息除 Preferred Family
之外有關粗體的內容都改為了常規體(其實這是為了解決一些bug,比如[3])。加上 Android
奇怪的字體機制,發現一個常規體就會將它用作常規體(說好的嚴格按照 XML 順序呢!),因此用 1.001 版的思源黑體直接按照上面的步驟操作完後會帶來滿屏粗體的情況。(感謝 @Shin li 、 @翟瀅皓 、@黃俊 在原答案的評論)

所以我們要對它做一點小修改。首先去下載 Adobe OpenType 字體開發套件(AFDKO)。主要用到的是 ttx 工具。

首先,將 head OS/2 和 name 表提取出來。

ttx -t "head" -t "OS/2" -t "name" SourceHanSansCN-Bold.otf

將 1.001 版和 1.000 版的表都提取出來後,用軟體進行對比。把其中關於「Bold」(粗體)的內容都改好,把 fsType、fsSelection 和 macStyle 這幾個 flag 也改過來。

或是按照下面的 diff 改(行號不一定相同)。

18c18
&< &
---
&> &
30c30
&< &
---
&> &
59c59
&< &
---
&> &
84c84
&< Regular --- &> Bold
132c132
&< Regular --- &> Bold
177c177
&< Regular --- &> Bold

修改完畢後,將它們合併回原字體

ttx -m SourceHanSansCN-Bold.otf SourceHanSansCN-Bold.ttx

大功告成!接下來如法炮製繁體、日文等就可以了!全部修改完成後,按照(1)(2)中的步驟安裝就可以了。

(4) 結論

綜上,我可以毫不誇張地說這是我目前遇到的 Android 修改最方便的高質量中文字體。而且最重要的是沒有那些「合成字體」的版權問題。

強烈推薦每一個對字體有要求的 Android 用戶替換!

注釋

[注1] 其實在非網頁環境下 fallback 是有一定問題的,比如知乎客戶端的列表中,若涉及國際音標則無法顯示,然而點開答案後音標正常,應該是答案界面使用了 WebView 所致。

[注2] &這是另一個問題,應該能通過安裝 思源黑體 (Source Han Sans) 的各個版本有什麼不同?
里提到的那個未正式發布的各地區字形)的全字數版本解決,不過這只是權宜之計,因為根本原因還是 Android 的 fallback
問題。&
(註:1.001 版已包括這個版本,OTF[不是Subset OTF]版即是。然而,它在 Android
上的兼容性竟遠不如 Subset OTF版。)


Android 7 下手動添加全套字重的 Noto Sans CJK


補充一下,此方法經試驗對Android 4.4的MIUI有效。其他ROM有變磚的風險。

實際上Android 4.4是支持.otf格式的字體的。最簡單的方法,把下載到的SourceHanSansCN-Regular.otf放入根目錄systemfonts,再打開根目錄etcfallback_fonts.xml,在接近文檔底部的地方找到DroidSansFallback.ttf這個欄位,修改成思源黑體的文件名。保存重啟即可。

補充:

建議不修改DroidSansFallback欄位,而是在以下代碼的前面

&

&

&DroidSansFallback.ttf&

&

&

添加如下代碼:

&

&

&SourceHanSansCN-Regular.otf&

&

&

保存,並重啟手機。


思源系列字體

適用於安卓5.x以上,在MIUI5.1/7.0、原生(AOSP、魔趣、Lineage os)上測試。

思源黑體: http://t.cn/R6YGppY

思源宋體: http://t.cn/R6Rxvz8

訪問以上網站可以不用下載即看到字體實際顯示效果。

Emoji One: http://t.cn/RQ4P3Cj

我所做的更改及說明:

〇、支持網站所描述的所有特性。如:多字重,地區語言子集字元等。

一、使用思源黑體作為默認顯示字體,除非特殊調用,你看到的用戶界面是黑體。

二、西文Light字重字體與GitHub上不同,添加了一個字元用來修復鎖屏時間顯示問題。

三、xml內添加眾多聲明,以提供全字重的支持,及襯線字體(宋體)的網頁或應用沒調用。

3-1、你可以訪問一些微信文章過某些大佬博客,它們一般調用襯線體。如 http://t.cn/RQ4P30Z

3-2、聲明如下:聲明思源黑體為蘋方黑體、華文黑體、微軟雅黑、Windows默認字體等。聲明思源宋體為華文宋體、Windows默認宋體等。

四、將Emoji表情符號替換為Emoji One Color 2.3

五、添加一些Unicode字元子集。如:古埃及象形文字字體、古華夏象形文字字體、一些小語種語言字體及Unicode特殊符號。

圖片依次為:思源黑體、思源宋體、思源宋體、二者混合以及思源黑體截圖。

鏈接如下: http://t.cn/RQ4P3l4

使用方法:你可以放心地使用它,當然你也可以先備份你的系統。

解壓後,將system/fonts內所有文件複製到根目錄/system/fonts,替換並將許可權設置為0644(rw-r-r)。將system/etc內fonts.xml複製到根目錄/system/etc,替換並將許可權設置為0644(rw-r-r)。

重啟系統即可。


如果想模仿Flyme4.0的字體(思源黑體),可以看看這個帖子,現Flyme3的系統,親測比樓上匿名用戶的回答的好用許多,看上去渾然一體。

鏈接:MX4字體修改版

——————————————

2月15日修改:

上面的鏈接裡面的百度雲網盤好像已經失效了。我昨天MX3刷機了(Flyme3.7.3A),字體又折騰了好久:自己從魅族官網上下個Samsung Note 3刷Flyme 4的刷機包裡面提取出字體文件(因為魅族自己的更新包是bin文件沒法解開(…)。經試驗,那裡面的SourceHanSansCN-Normal和Roboto-Light放在一起看上去字重感覺還好。)順便把Roboto字體全都換成了新版的,和Android 一樣。

附上整個flyme 4的整個fonts文件夾壓縮包下載地址:fonts.zip_from flyme4.0.zip_免費高速下載


抖個機靈……

請使用Android5.0以上系統……

PS:@豆腐君 目前安卓6.0以上可以改成這樣:

&
&NotoSansCJK-Light.ttc&
&NotoSansCJK-Regular.ttc&
&NotoSansCJK-Medium.ttc&
&NotoSansCJK-Bold.ttc&
&
&
&NotoSansCJK-Light.ttc&
&NotoSansCJK-Regular.ttc&
&NotoSansCJK-Medium.ttc&
&NotoSansCJK-Bold.ttc&
&
&
&NotoSansCJK-Light.ttc&
&NotoSansCJK-Regular.ttc&
&NotoSansCJK-Medium.ttc&
&NotoSansCJK-Bold.ttc&
&
&
&NotoSansCJK-Light.ttc&
&NotoSansCJK-Regular.ttc&
&NotoSansCJK-Medium.ttc&
&NotoSansCJK-Bold.ttc&
&

Bug:

在非中文狀態下某些應用會顯示為日語字體


最基本的替換:

1、需要 root 許可權以及可以瀏覽 root 目錄的文件管理器(比如 re 管理器)

2、下載 ttf 版本的字體文件,選擇合適字重(個人認為 Regular 比較合適)。

Google和Adobe合體開發開源的【思源黑體】.ttf下載

(可以直接將原版 otf 文件改擴展名為 ttf 使用,但在我手機的 4.2.1 版本上會出現字體筆畫粗細不均的情況,換 4.4.2 的版本後則無此問題)

3、將字體文件重命名為 DroidSansFallback.ttf ,替換文件 /system/fonts/DroidSansFallback.ttf,並更改許可權為 211 (211許可權是什麼意思 re管理器如何修改211許可權方法概述)

樓下,可以試試 mx4 提取的字體,是魅族轉換好的 ttf:Flyme4.0字體包.zip_免費高速下載

謝另一位匿名用戶提醒,我確實不知道這是不是從 mx4 提取出來的,不過效果確實比第一個好很多,可能魅族之後又更新了字體。


同問。

思源黑體下載下來通常是OTF格式,android默認使用ttf格式。

經多次試驗,格式轉換已經不是問題了,直接將思源黑體各字體的文件後綴更改為ttf即可,勿需用什麼轉換軟體。(目前經轉換軟體轉換後均會丟失細節,完全無感)

但是,將更換後綴的字體文件導入android使用仍然存在問題,即所謂行距問題,會出現上移,間距增大,割裂等效果。

補充1:正在試樓上提供的新文件包,謝謝!~

補充2:經測試,樓上提供的MX4轉換好的字體文件還是存在同樣的問題。1.字體經過轉換,已經失真;2.導入到android後出現行距問題。

行距問題可能是字體設計、設置之類的問題,需要專業人士處理吧。


root以後用刷機精靈可以更換系統字體,它提供了思源黑體的選項。


本人用的就是flyme4的mx3,受不了思源黑體的摧殘,於是換成了蘭亭准黑+漢儀旗黑的組合,頓時感覺猛的一陣舒服


實際解決方案是讓人噴飯的簡單……

1.下載這個帖子的文件 http://bbs.gfan.com/android-7702653-1-1.html

2.安裝 愛字體

3.解壓,將整個「思源黑體」文件夾放在ifont/custom目錄下

4.進入愛字體程序,進入我的字體,選擇思源黑體

經測試,完美。


推薦閱讀:

對於這段話,你怎麼看?
如何優雅地使用MIUI?
Android L 正式版會使用思源黑體么?目前Android 4.4的默認字體是什麼?
Android 上思源黑體為何筆畫粗細不均?
簡訊驗證碼安全嗎?

TAG:Android | 思源黑體 |