如何在 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 的 &
&
&
&
&
前加入
&
&
&
&
&
&
本來以為這麼一做又入改字體的大坑了。但是這次 Android 奇怪的 fallback 機制居然表現得異常完美。
(2) 進階用法
我已經在 Android 上使用思源黑體半個多月,幾乎沒有任何兼容性上的問題,而且神奇地避開了 Android 在字體 fallback 和渲染上的一些小 bug [注1],更加堅定了我將其用作主力字體的信心。Android自 4.1 以來增加了 fallback 時對不同語言可以採用不同的次序的功能,配合 MTLmr3m.ttf
字體,為日語用戶提供了日文漢字字形。於是思源黑體也可以如法炮製:將不同區域的版本拷貝到 /system/fonts 後,在原版的
fallback_fonts.xml 的
&
&
&
&
&
前加入
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
再在之後加入
&
&
&
&
&
&
即可根據語言的不同自動調用相應的地區字形。(我沒有安裝韓文版。)
說幾點問題:- 從上面可以看出語言代碼是區分大小寫的。
- 只有日語能在切換系統界面語言時切換字形;語言設為繁體依然是簡體字形,然而在網頁中卻可以。
- 系統語言設為日語時顯示簡體中文會缺字,無法正確 fallback。[注2]
- 繁體版的逗號太高了,明顯高於居中的位置。
- 網頁中有行距問題,參考下圖:
這麼做本來是沒有問題的,但是萬惡的 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
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] &里提到的那個未正式發布的各地區字形)的全字數版本解決,不過這只是權宜之計,因為根本原因還是 Android 的 fallback
問題。&
上的兼容性竟遠不如 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欄位,而是在以下代碼的前面
&思源系列字體
適用於安卓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 上思源黑體為何筆畫粗細不均?
※簡訊驗證碼安全嗎?