0、对Android字库的认识:
Android系统对字体的载入和Linux桌面很像,有一个Priority Order(优先级顺序)的,当然先是西方字符,然后是一些符号字体(包括emoji字体),再就是中日韩字符(DroidSansFallback.ttf包含了全部CJK的字符,但是日文字符有专门的MTLmr3m.ttf来显示,不过Android默认为仅在语言区域为日本(”ja”)的时侯才把MTLmr3m优先于DroidSansFallback)。这个字体载入顺序是以XML格式的配置文件保存在/system/etc下的,一共两个配置文件,分别是system_fonts.xml和fallback_fonts.xml,其中system_fonts.xml基本只有拉丁子母集(指定了常见的Serif、Sans、Times New Roman、Monospace对应的字体),而fallback_fonts.xml则囊括了其它全部语言、符号的字体。
4.x以后最显著的变化是新增了Roboto家族,有Regular/Bold/Italic/BoldItalic四种变体,相比原来的DroidSans多了两个斜体。原来的DroidSans家族还在,但是已经被指向到Roboto家族,再修改原来的文件是无效的。
由于中文字体至今未出现独立斜体和独立粗斜体,因此我在这里建议大家中英文分开替换,这样可以保证英文有斜体和粗斜体,同时中英文有更多种独立搭配。
为了替换英文字体,我们需要准备四个字体(蛮多字体都有独立斜体的,很容易找)分别替换以下四个文件:[OK1000只替换第一个,其他三个屏蔽了]
Roboto-Regular.ttf[家教机只替换了这个,是BBK自己制作的]
Roboto-Italic.ttf[BBK没有相应的风格,所以屏蔽了]
Roboto-Bold.ttf[BBK没有相应的风格,所以屏蔽了]
Roboto-BoldItalic.ttf[BBK没有相应的风格,所以屏蔽了]
针对中文,4.x还是一个DroidSansFallback.ttf来完成。有的固件可能是DroidSansFallbackFull.ttf一类名称,总之体积最大的那个是我们需要替换的。个人是对字体要求比较高的,也喜欢针对中日韩文字使用独立粗体,因此我针对独立粗体又进行了探索,收获见下:
进入/system/etc目录下可以找到fallback_fonts.xml这个文件。这是4.x后对新增语种文字的配置文件,可以用记事本打开进行修改:
在DroidSansFallback.ttf后面另起一行加入:
DroidSansFallback-Bold.ttf
系统字模必须放在/system/fonts/下面,需要使用的字模要配置到/system/etc/system_fonts.xml和/system/etc/fallback_fonts.xml中;
系统优先从system_fonts.xml中列出的字模中查找字模,其次才是fallback_fonts.xml。[Android系统源码的字体配置文件位于
frameworks/base/data/fonts/文件夹下]
1、字库文件说明:
framework/base/data/fonts/
用于显示不同样式时间(16)
AndroidClock.ttf
AndroidClock_Highlight.ttf
AndroidClock_Solid.ttf
---------------------------------------------------------------------
Emoji表情符号
AndroidEmoji.ttf
---------------------------------------------------------------------
用于锁屏界面(18)
Clockopia.ttf
---------------------------------------------------------------------
波斯-阿拉伯语字库:誊抄体(758)
DroidNaskh-Regular.ttf
DroidNaskhUI-Regular.ttf
---------------------------------------------------------------------
波斯-阿拉伯语字库:库法体(753)
DroidKufi-Bold.ttf
DroidKufi-Regular.ttf
---------------------------------------------------------------------
DroidNaskh-Bold.ttf
DroidNaskh-Regular.ttf
DroidNaskhUI-Regular.ttf
---------------------------------------------------------------------
亚美尼亚语(95)
DroidSansArmenian.ttf
---------------------------------------------------------------------
系统拉丁文字体:在ICS上已经被重新指向到Roboto字体(901)[旧版Android的默认字型]
DroidSans.ttf
DroidSans-Bold.ttf
---------------------------------------------------------------------
阿姆哈拉语、提格雷语(埃塞俄比亚)(559)
DroidSansEthiopic-Regular.ttf
DroidSansEthiopic-Bold.ttf
---------------------------------------------------------------------
中文字库,CJK中日韩统一字符,目前系统使用的中文字库(50956)[目前我们用的是这个]
DroidSansFallback.ttf
---------------------------------------------------------------------
在DroidSansFallback字库的基础上增加了一些字符(57557)DroidSansFallbackFull.ttf
---------------------------------------------------------------------
(43628)
DroidSansFallbackLegacy.ttf
---------------------------------------------------------------------
格鲁吉亚语(125)
DroidSansGeorgian.ttf
---------------------------------------------------------------------
希伯来语(151)
DroidSansHebrew-Bold.ttf
DroidSansHebrew-Regular.ttf
---------------------------------------------------------------------
日语(12585)
DroidSansJapanese.ttf
---------------------------------------------------------------------
西里尔和拉丁字母扩充附加(900)
DroidSansMono.ttf
---------------------------------------------------------------------
泰语(100)
DroidSansThai.ttf
---------------------------------------------------------------------
拉丁字母:衬线体(896)
DroidSerif-Regular.ttf
DroidSerif-Bold.ttf
DroidSerif-Italic.ttf
DroidSerif-BoldItalic.ttf
---------------------------------------------------------------------
繁体中文字库():黑体(日本字体公司Motoyafont设计的字体)(7622)
MTLc3m.ttf
---------------------------------------------------------------------
繁体中文字库():圆体(7622)
MTLmr3m.ttf
---------------------------------------------------------------------
ICS上的robot字体:Roboto是随着Android 4.0“雪糕三明治”操作系统引入的一种无衬线字体系列;这个字型家族包含 Regular 和 Thin丶Light丶Regular丶Medium丶Bold丶Black与Condensed版的斜体;可以用于显示欧洲和拉美大多数国家的文字(1037)
Roboto-Regular.ttf[系统默认英文、数字字体]
Roboto-Bold.ttf
Roboto-Italic.ttf
Roboto-BoldItalic.ttf
External/noto-fonts
---------------------------------------------------------------------
(908)
RobotoCondensed-Regular.ttf
RobotoCondensed-Bold.ttf
RobotoCondensed-Italic.ttf
RobotoCondensed-BoldItalic.ttf
---------------------------------------------------------------------
---------------------------------------------------------------------
NanumGothic.ttf 谚文字母(朝鲜语、韩语)
---------------------------------------------------------------------
frameworks\base\data\fonts\openfont\padauk-ttf(JB版本支持)
官方缅甸语字库
padauk.ttf
民间缅甸语字库
ZawgyiOne.ttf
---------------------------------------------------------------------
表情字符
NotoColorEmoji.ttf
---------------------------------------------------------------------
孟加拉语字库
NotoSansBengaliUI-Bold.ttf
NotoSansBengaliUI-Regular.ttf
---------------------------------------------------------------------
印度语字库
NotoSansDevanagariUI-Bold.ttf
NotoSansDevanagariUI-Regular.ttf
---------------------------------------------------------------------
卡纳达语字库(印度)
NotoSansKannadaUI-Bold.ttf
NotoSansKannadaUI-Regular.ttf
---------------------------------------------------------------------
高棉语字库(柬埔寨)
NotoSansKhmerUI-Bold.ttf
NotoSansKhmerUI-Regular.ttf
---------------------------------------------------------------------
老挝语字库
NotoSansLaoUI-Bold.ttf
NotoSansLaoUI-Regular.ttf
---------------------------------------------------------------------
马拉雅拉姆文字库(印度)
NotoSansMalayalamUI-Bold.ttf
NotoSansMalayalamUI-Regular.ttf
---------------------------------------------------------------------
泰米尔语字库(印度、斯里兰卡、新加坡)
NotoSansTamilUI-Bold.ttf
NotoSansTamilUI-Regular.ttf
---------------------------------------------------------------------
泰卢固语(印度)
NotoSansTeluguUI-Bold.ttf
NotoSansTeluguUI-Regular.ttf
---------------------------------------------------------------------
泰语字库
NotoSansThaiUI-Bold.ttf
NotoSansThaiUI-Regular.ttf
---------------------------------------------------------------------
附OK1000机器上的字体库列表:
附OK1000程序解析得到的字体库列表:
2、大概总体流程:
3、字体加载过程:
Android字体由Android2D图形引擎skia实现,并在Zygote的Preloading classes中对系统字体进行load。Android的启动过程中:
进入preload函数:
接着进入preloadClasses函数:
java中Class.forName和classLoader都可用来对类进行加载。前者除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。而classLoader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。Class.forName(name, initialize, loader)带参函数也可控制是否加载static块。并且只有调用了newInstance()方法采用调用构造函数,创建类的对象。
具体加载那些类,编译的时候会生成文件(这个文件由 frameworks/base/tools/preload 这个个工具生成,会去检测 frameworks/base 下面的类,如果判断加载这个类超过 1250[WritePreloadedClassFile.java] 微秒就会把这个类写入 frameworks/base/preloaded-classes 中。当然这个文件是可以定制的):
android.graphics.Typeface类的静态块代码如下:
Create方法(java)如下:
接着进入JNI:
最终进入:
具体的解析、加载策略在函数:
loadSystemFontsLocked();
4、附:
觉得本文对你有用,麻烦点赞或关注或收藏,你的肯定是我创作的无限动力,谢谢!!!