Android 系统字体

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一类名称,总之体积最大的那个是我们需要替换的。个人是对字体要求比较高的,也喜欢针对中日韩文字使用独立粗体,因此我针对独立粗体又进行了探索,收获见下:
  • 1

进入/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 
---------------------------------------------------------------------
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133

附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、附:

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

这里写图片描述



原文:https://blog.csdn.net/rjdeng/article/details/48545313#t0

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值