Android 系统字体

来源:互联网 发布:地瓜干块淘宝那家好 编辑:程序博客网 时间:2024/06/05 07:15

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.ttfAndroidClock_Solid.ttf---------------------------------------------------------------------Emoji表情符号AndroidEmoji.ttf ---------------------------------------------------------------------用于锁屏界面(18)Clockopia.ttf ---------------------------------------------------------------------波斯-阿拉伯语字库:誊抄体(758)DroidNaskh-Regular.ttf  DroidNaskhUI-Regular.ttf---------------------------------------------------------------------波斯-阿拉伯语字库:库法体(753)DroidKufi-Bold.ttfDroidKufi-Regular.ttf---------------------------------------------------------------------DroidNaskh-Bold.ttfDroidNaskh-Regular.ttfDroidNaskhUI-Regular.ttf---------------------------------------------------------------------亚美尼亚语(95)DroidSansArmenian.ttf ---------------------------------------------------------------------系统拉丁文字体:在ICS上已经被重新指向到Roboto字体(901)[旧版Android的默认字型]DroidSans.ttfDroidSans-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.ttfDroidSerif-Bold.ttf DroidSerif-Italic.ttfDroidSerif-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.ttfRobotoCondensed-Bold.ttfRobotoCondensed-Italic.ttfRobotoCondensed-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、附:

这里写图片描述
这里写图片描述
这里写图片描述

1 1