Android添加系统字体fonts

本文详细介绍了如何在Android系统中预置新字体,包括创建fonts_customization.xml文件、添加ttf文件以及在编译mk中引用。通过修改Android.mk和配置文件,开发者可以为设备添加自定义字体供应用使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一、product下预置新字体

系统源生提供了定制化增加字体文件的方式,可以在不修改源生代码的情况下进行定制增加。

product下的预置参考了google提供的预置方式。
Adding Custom Fonts | Android Open Source Project
模板代码文件为custom-fonts.zip文件

方案的主要工作是:

  • 将定制的fonts_customization.xml配置文件编译到系统中。
  • 将自定义的字体ttf文件编译到系统中。

在这里插入图片描述

1.预置fonts_customization.xml文件

mydevice_overlay/fonts/Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := fonts_customization.xml
LOCAL_MODULE_CLASS := ETC
LOCAL_PREBUILT_MODULE_FILE := $(LOCAL_PATH)/fonts_customization.xml
LOCAL_PRODUCT_MODULE := true

include $(BUILD_PREBUILT)

mydevice_overlay/fonts/fonts.mk

PRODUCT_PACKAGES := \
    fonts_customization.xml \

$(call inherit-product-if-exists, vendor/XXX/fonts/oem-lobster/fonts.mk)

mydevice_overlay/fonts/fonts_customization.xml
这个文件是增加了一个名为lobster的字体,使用的字体文件为Lobster-Regular.ttf

<fonts-modification version="1">
        <family customizationType="new-named-family" name="lobster">
                <font weight="400" style="normal">Lobster-Regular.ttf</font>
        </family>
</fonts-modification>

2.预置ttf文件

/fonts/oem-lobster/fonts.mk

PRODUCT_PACKAGES := \
    Lobster-Regular.ttf \

/fonts/oem-lobster/Android.mk

LOCAL_PATH := $(call my-dir)

# Build the rest of font files as prebuilt.
# $(1): The source file name in LOCAL_PATH.
#       It also serves as the module name and the dest file name.
define build-one-font-module
$(eval include $(CLEAR_VARS))\
$(eval LOCAL_MODULE := $(1))\
$(eval LOCAL_SRC_FILES := $(1))\
$(eval LOCAL_MODULE_CLASS := ETC)\
$(eval LOCAL_MODULE_TAGS := optional)\
$(eval LOCAL_MODULE_PATH := $(TARGET_OUT_PRODUCT)/fonts)\
$(eval LOCAL_PRODUCT_MODULE := true) \
$(eval include $(BUILD_PREBUILT))
endef

font_src_files := \
    Lobster-Regular.ttf \

$(foreach f, $(font_src_files), $(call build-one-font-module, $(f)))

build-one-font-module :=
font_src_files :=

上传/fonts/oem-lobster/Lobster-Regular.ttf文件

3.在系统的编译mk中添加对此新增mk的引用

例如/device/common/common.mk

$(call inherit-product-if-exists, vendor/XXX/fonts/mydevice_overlay/fonts/fonts.mk)

二、字体使用

之后,在应用中便能够使用lobster字体了

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="text"
        android:fontFamily="lobster"/>
<think>嗯,用户想在Android中动态添加系统字体,但不知道怎么做,需要教程。首先,我需要确认Android是否支持动态添加系统字体。根据我的知识,Android系统字体通常是预装在系统中的,应用可以通过Typeface类来使用这些字体。但动态添加系统字体可能涉及到系统级别的权限,普通应用可能无法做到,因为这会需要修改系统文件或者有root权限。 用户的问题可能有两种情况:一种是想要在应用内动态加载自定义字体,而不是系统字体;另一种是确实想要修改系统字体,这可能需要系统权限或者特定的设备。根据常规需求,前者更常见,所以可能需要先澄清用户的需求。但用户明确提到“动态添加系统字体”,可能指的是后者。不过,普通应用通常没有权限去修改系统字体,所以可能需要确认是否有其他方法。 接下来,我需要查找相关资料。根据Android开发者文档,应用可以通过将字体文件放在assets或res/font目录下,然后使用Typeface加载。例如,使用Typeface.createFromAsset()方法。但这是应用内使用自定义字体,并不是系统级别的。 关于动态添加系统字体,可能需要使用系统API或者有系统签名权限。例如,某些设备制造商或系统应用可能有权限添加字体。另外,从Android 8.0(API 26)开始,支持可下载字体,通过Google的字体提供商,但这也是应用级别的,不是系统全局的。 可能用户混淆了应用内字体系统字体。所以,在回答时应该先区分这两种情况。如果用户确实需要修改系统字体,可能需要root权限,或者使用系统API,但普通应用无法做到。因此,建议用户如何在应用内动态加载字体,并说明系统字体的限制。 另外,检查是否有相关引用内容。用户提供的引用中,引用[1]提到了字体回退,可能与字体渲染有关,但不直接回答如何添加系统字体。引用[2]提到MapKit框架,与Android无关。因此,可能需要忽略这些引用,或者指出它们不相关。 总结回答步骤: 1. 解释系统字体和应用内字体的区别。 2. 说明动态添加系统字体的限制,需要系统权限。 3. 提供应用内动态加载自定义字体的方法,包括代码示例。 4. 提到可下载字体Android 8.0+)作为替代方案。 5. 提醒用户系统字体修改的可行性问题,可能需要root。 可能还需要生成相关问题,比如如何应用自定义字体、可下载字体的使用等。</think>要在Android应用中动态加载自定义字体(非系统级),可通过以下步骤实现: ### 一、应用内字体加载实现步骤 1. **准备字体文件** - 将.ttf或.otf文件放入`app/src/main/assets/fonts/`目录 2. **动态加载字体** ```kotlin val typeface = Typeface.createFromAsset(assets, "fonts/your_font.ttf") textView.typeface = typeface ``` 3. **缓存优化(API 26+)** ```kotlin val font = ResourcesCompat.getFont(context, R.font.your_font) textView.typeface = font ``` ### 二、系统字体修改限制 1. 需要系统签名权限 2. 需修改`/system/fonts/`目录 3. 需要设备root权限 4. 必须触发系统字体缓存更新 ### 三、替代方案:可下载字体(API 26+) ```xml <font-family android:fontProviderAuthority="com.google.android.gms.fonts" android:fontProviderPackage="com.google.android.gms" android:fontProviderQuery="Your Font Name" android:fontProviderCerts="@array/com_google_android_gms_fonts_certs"/> ``` [^1]: 注意字体文件的兼容性和版权限制
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值