Android替換字體時(shí)需要注意的一些問(wèn)題
一、Android字體簡(jiǎn)述
Android是一個(gè)典型的Linux內(nèi)核的操作系統(tǒng)。在Android系統(tǒng)中,主要有DroidSans和DroidSerif兩大字體陣營(yíng),從名字就可以看出來(lái),前者是無(wú)襯線字體,后者是襯線字體。具體來(lái)說(shuō),一共是這幾個(gè)字體文件:(位于 /system/fonts 目錄下,需要root權(quán)限查看)
- DroidSans-Bold.ttf 粗體的無(wú)襯線字體(拉丁字母等)
- DroidSans.ttf 常規(guī)的無(wú)襯線字體(拉丁字母等)
- DroidSansFallback.ttf 常規(guī)的無(wú)襯線字體(中文字符等)
- DroidSansMono.ttf 等寬的無(wú)襯線字體(拉丁字母等)
- DroidSerif-Bold.ttf 粗體的襯線字體(拉丁字母等)
- DroidSerif-BoldItalic.ttf 粗體+斜體的襯線字體(拉丁字母等)
- DroidSerif-Italic.ttf 斜體的襯線字體(拉丁字母等)
- DroidSerif-Regular.ttf 常規(guī)的襯線字體(拉丁字母等)
除了這些字體文件,有些修改版本的 ROM,比如 CyanogenMod 5.0.8 ,還會(huì)有 Clockopia.ttf 之類的文件,從名字就可以看出這是顯示數(shù)字時(shí)鐘時(shí)用的字體。
上面提到的這些字體中,除了 DroidSansFallback.tff ,其它的一律不包含中文字體。而 DroidSansFallback 中的中文字體,是一種類似于文泉驛微米黑的字體,只是它的字庫(kù)非常小,字符數(shù)量很少,估計(jì)只有 GB2312 的字符集,稍少見(jiàn)一些的字都是不包含的,比如我同學(xué)名字里有“祎”這個(gè)字,在聯(lián)系人里就顯示為一個(gè)方框。
二、替換字體
這樣的小字庫(kù)是不能令人滿意的,而且,這種字體看久也覺(jué)得厭了,特別是在 iReader (Android電子書閱讀軟件)中看久了,就會(huì)覺(jué)得筆劃越來(lái)越粗,長(zhǎng)時(shí)間看了就疲勞了。那么替換字體也就顯得很自然了。Android用的是標(biāo)準(zhǔn)的TrueType字體,因此只要把電腦里滿意的字體改名后直接復(fù)制到 /system/fonts 目錄下,用root權(quán)限覆蓋掉原來(lái)的字體文件就好了。
其他文章中提到過(guò),我嘗試了替換字體,我一開(kāi)始是用的真正的Unicode的微米黑字體(這個(gè)字體的大小是4MB,系統(tǒng)原來(lái)的是3MB)替換的。但是有一些奇怪的問(wèn)題。具體表述如下:
- 只替換DroidSansFallback.ttf,則一些嘗試調(diào)用DroidSans和DroidSans-Bold的地方的字體都會(huì)顯示為方框,整個(gè)手機(jī)只有英文字體和一小部分的中文字體可以顯示,其它大部分都是方框。
- 如果把 DroidSansFallback, DroidSans, DroidSans-Bold 三個(gè)字體文件都替換,則不會(huì)有方框,但是系統(tǒng)里再也區(qū)分不出粗體與普通字體了。而且還要考慮到字體文件大小的問(wèn)題,有些版本的ROM刷了之后 /system 下的剩余空間是很小的,放三個(gè)大字體根本不現(xiàn)實(shí)。(后面要提到的麗黑是8MB,蘭亭黑是7M,雅黑則是14MB到20MB不等)
- 最詭異的來(lái)了,替換字體后,剛開(kāi)機(jī)是沒(méi)有問(wèn)題的,問(wèn)題就在過(guò)了一段時(shí)間后,所有的字體都會(huì)消失!所謂消失,就是所有該有字的地方都變成了空白,空白一片。這種情況出現(xiàn)的沒(méi)有任何先兆,一般是開(kāi)機(jī)用了一段時(shí)間就會(huì)有這種情況出現(xiàn)。如圖:
這種事情真是非常的令人討厭,我還因?yàn)檫@件事情誤格式化過(guò)一次microSD卡。(因?yàn)榭床灰?jiàn)按鈕上的字)
三、問(wèn)題何在?
出現(xiàn)了這種問(wèn)題,自然要想辦法去解決。我仔細(xì)觀察回想了一下,一般都是開(kāi)機(jī)之后運(yùn)行了一些比較耗RAM的程序才會(huì)出現(xiàn)這種問(wèn)題。比如開(kāi)機(jī)之后運(yùn)行Opera Mini 5,打開(kāi)12個(gè)標(biāo)簽以上,右上角的時(shí)間字體就會(huì)消失,Action Bar里的文字也會(huì)同時(shí)消失,這種問(wèn)題就重現(xiàn)了。考慮到RAM用了多了之后字體就消失了,我推斷事情是這樣的:開(kāi)機(jī)載入了字體,放在RAM里,但是這種新替換的字體比系統(tǒng)自帶的字體文件體積大很多,所以需要更多的RAM,而在運(yùn)行了一些大程序之后,RAM不夠了,字體文件就被踢出了RAM。
真的是這樣嗎?我當(dāng)時(shí)認(rèn)為的確是這樣的,所以我干脆決定不用新字體了,就用老字體吧,就把之前備份的老字體文件全部用Root Explorer覆蓋回去了,重啟。現(xiàn)在應(yīng)該沒(méi)問(wèn)題了吧?我故意運(yùn)行了幾個(gè)大程序……結(jié)果問(wèn)題又重現(xiàn)了。
這就奇怪了,最早用老字體是從來(lái)沒(méi)有這個(gè)問(wèn)題的,換了新字體之后問(wèn)題出現(xiàn),但是用備份文件恢復(fù)到老字體,怎么還是有問(wèn)題呢?
在后來(lái)相當(dāng)長(zhǎng)的一段時(shí)間內(nèi),我一直想不通這件事情,甚至還憤怒地把DroidSansFallback.ttf給刪除了……當(dāng)然,開(kāi)機(jī)不能了。
重新用update.zip恢復(fù)了一下,冷靜下來(lái)思考,替換前和替換后有什么是改變了的呢?在Root Explorer再仔細(xì)看看……似乎是權(quán)限改變了!
Linux文件系統(tǒng)里的文件都是有權(quán)限的,且與Windows文件系統(tǒng)里的權(quán)限概念有一些區(qū)別。三個(gè)權(quán)限者,Owner, Group, World(Other),每人都有三項(xiàng)權(quán)限,分別是 Read(r), Write(w) 和 Execute(x) 。其中代表Read的數(shù)字為4,代表Write的數(shù)字為2,代表Execute的數(shù)字為1,這樣就可以用1-7的自然數(shù)還表示不同的權(quán)限。比如R+W就是6,R+W+X就是7,R+X就是5,等等。三個(gè)權(quán)限者分別排列,就有了755,777等這樣的代表權(quán)限組合的數(shù)字。
Linux的這套權(quán)限系統(tǒng)可以用chmod命令來(lái)修改,但是在Root Explorer里修改起來(lái)更加方便一些。
長(zhǎng)按文件,然后就有一個(gè)Permissions的選項(xiàng),點(diǎn)擊之,打開(kāi)的窗口里就可以改權(quán)限了,當(dāng)然前提是 mount as r/w。
如下面左圖,這是 /system/fonts 目錄下原生的一個(gè)文件,而右圖則是從 /sdcard 里復(fù)制進(jìn)去的文件,對(duì)照兩張圖就可以看出權(quán)限發(fā)生了改變。(由644變成了075)
從圖中可以看到,原來(lái)的文件對(duì)于User來(lái)說(shuō)是有R/W權(quán)限的,而從 /sdcard 里復(fù)制進(jìn)來(lái)的文件對(duì)于User是沒(méi)有R/W權(quán)限的。這就是問(wèn)題所在了!這也很容易解釋,為什么最早不會(huì)有字體消失問(wèn)題,然后替換了字體(從外面復(fù)制進(jìn)來(lái)權(quán)限不正確的字體)后字體就消失了,但是用備份文件恢復(fù)(重新又從外面復(fù)制進(jìn)來(lái)字體)后,字體消失問(wèn)題還是存在!這是因?yàn)樵趶?fù)制過(guò)程中,由于文件系統(tǒng)的不統(tǒng)一(ext2和FAT32),導(dǎo)致權(quán)限錯(cuò)亂。
四、如何解決?
知道了問(wèn)題的所在,解決起來(lái)就非常容易了——在替換完字體之后不要急著重啟,一定要對(duì)照其它的文件,把新復(fù)制進(jìn)來(lái)的那些文件的權(quán)限改成正確的644!
五、特別關(guān)照
- 字體是放在 /system/fonts 目錄下的,這個(gè)目錄屬于 /system 分區(qū),因此你先要確保 /system 分區(qū)的剩余空間是夠的。
- /system 分區(qū)剩余空間不夠怎么辦?那就刪除自帶的程序。由于我做了Apps2SD,所以我的 /data 分區(qū)( /sd-ext 分區(qū))的剩余空間是足夠的,那么就可以把系統(tǒng)自帶的程序移到 /sd-ext 下面?怎么移動(dòng)呢?參照這篇文章:《如何把Android自帶程序移動(dòng)到其它分區(qū)以騰出 /system 分區(qū)的空間》。
- 對(duì)于屏幕顯示來(lái)說(shuō),還是無(wú)襯線字體比較適合,襯線字體么,還是讓它們?cè)谟∷⑸习l(fā)揮作用吧。我看到有一些人把那些“華康少女簡(jiǎn)體”之類的手寫襯線字體當(dāng)作Android的默認(rèn)字體……這實(shí)在是不恰當(dāng)?shù)男袨椤km然一開(kāi)始會(huì)覺(jué)得很驚艷,但是時(shí)間長(zhǎng)了之后眼睛會(huì)疲勞,對(duì)視力并不好。所以還是要選無(wú)襯線字體的好。
六、字體推薦
看上面這四幅圖,前三張是我在Android上實(shí)際截圖得到的,分別是用蘭亭黑、麗黑、雅黑作為默認(rèn)字體。最后一張是Windows 7里微軟雅黑字體的顯示效果。需要注意的是,雖然我的系統(tǒng)里以注冊(cè)表方式加載了GDI++,但是我在截那張圖的時(shí)候是用GDI++Inject把Notepad.exe的GDI++模塊卸載掉的,所以最后一張圖是沒(méi)有任何額外渲染的本來(lái)效果。
都說(shuō)實(shí)踐出真知,通過(guò)這次替換我才真正嘗試出了最適合Android的字體。同一個(gè)字體,在不同的系統(tǒng)里、以不同的方式渲染,顯示出來(lái)的效果也是有很大不同的。比如蘭亭黑在Ubuntu下面好看的,在Android下就很一般,麗黑是Mac OS X的默認(rèn)字體,有多漂亮大家肯定都見(jiàn)到過(guò),但是在Android上的顯示效果呢?筆劃粗大、粘連,看得時(shí)間長(zhǎng)了很容易眼疲勞。而微軟雅黑這款MS花了重金打造的字體呢?它的Windows下的顯示效果……說(shuō)真的,很差。至少不用第三方字體渲染的情況下很糟糕,可是,當(dāng)我抱著試試看的態(tài)度把它復(fù)制到Android之后,我才發(fā)現(xiàn)它的顯示效果如此之好:字面大、筆劃清晰、結(jié)構(gòu)平穩(wěn)、構(gòu)架勻稱……簡(jiǎn)直是Android下的極品字體啊。
這樣的字體哪里有?心動(dòng)的同學(xué)就不要到網(wǎng)上去搜索了,網(wǎng)上很多是修改版本的,雖然字體小,但是具體改了什么東西我就不清楚了,我不能保證它能像圖中顯示的那么好看,所以……大家可以像我一樣,從Windows 7的字體目錄里復(fù)制。(默認(rèn)是 C:\Windows\Fonts )
(全文完)