Android 系统字体

转载:https://blog.csdn.net/rjdeng/article/details/48545313

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没有相应的风格,所以屏蔽了]

进入/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、字库文件说明:

附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()方法采用调用构造函数,创建类的对象。

扫描二维码关注公众号,回复: 2281846 查看本文章

具体加载那些类,编译的时候会生成文件(这个文件由 frameworks/base/tools/preload 这个个工具生成,会去检测 frameworks/base 下面的类,如果判断加载这个类超过 1250[WritePreloadedClassFile.java] 微秒就会把这个类写入 frameworks/base/preloaded-classes 中。当然这个文件是可以定制的): 
这里写图片描述

android.graphics.Typeface类的静态块代码如下: 
这里写图片描述

Create方法(java)如下: 
这里写图片描述

接着进入JNI: 
这里写图片描述

最终进入: 
这里写图片描述

具体的解析、加载策略在函数: 
loadSystemFontsLocked();

4、附:

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

猜你喜欢

转载自blog.csdn.net/u012588160/article/details/80093861