Kể từ Android 15, các phông chữ thay đổi sẽ được kết xuất trong thời gian chạy với hiệu quả và độ chi tiết cao hơn. Với bản cập nhật này, nhà cung cấp phải thêm các cấu hình phông chữ biến đổi mới vào font_fallback.xml
thay vì fonts.xml
, vì fonts.xml
sẽ không được dùng nữa.
Hãy xem bài viết Hỗ trợ phông chữ biến đổi để biết thêm thông tin.
Trên Android 11 trở xuống, việc cập nhật tệp phông chữ do thiết bị cài đặt trong AOSP (trong phân vùng /system/fonts
) hoặc phân vùng của nhà cung cấp (trong phân vùng /product/fonts
hoặc /system/fonts
) yêu cầu bản cập nhật hệ thống của nhà sản xuất thiết bị gốc (OEM). Yêu cầu này có tác động đáng kể đến khả năng tương thích của biểu tượng cảm xúc. Trong Android 12, bạn có thể sử dụng dịch vụ hệ thống FontManager
để quản lý các tệp phông chữ đã cài đặt và cập nhật các tệp phông chữ đã cài đặt trên thiết bị mà không cần cập nhật hệ thống.
Android 12 có 3 hoạt động tương tác với quy trình; FontManagerService
, Font Updater
và Application
.
FontManagerService
là hệ thống quản lý trung tâm trong máy chủ hệ thống.
FontManagerService
lưu trữ chế độ cài đặt phông chữ hệ thống mới nhất cho mỗi người dùng.
FontUpdater
là trình cập nhật phông chữ có thể cắm được tin cậy trong quy trình kiểm tra quyền signature|privileged
. FontUpdater
giao tiếp với FontManagerService
để tải, cài đặt, xoá hoặc cập nhật các chế độ cài đặt phông chữ hiện tại của hệ thống. FontUpdater
có thể truyền nội dung tệp phông chữ mới bằng cơ chế giao tiếp giữa các quy trình (IPC). FontManagerService
lưu nội dung vào một vị trí lưu trữ có thể đọc được trên toàn cầu, chẳng hạn như trong các tệp /data/fonts
. Bộ nhớ này được bảo vệ. Chỉ FontManagerService
mới có thể ghi tệp này theo chính sách SELinux.
Khi lớp Application
chạy, lớp này sẽ truyền các chế độ cài đặt phông chữ của hệ thống làm đối số của phương thức bindApplication
; sau đó, lớp này sẽ khởi chạy các chế độ cài đặt phông chữ để quy trình ứng dụng sử dụng.
Hỗ trợ các phông chữ có thể thay đổi
Kể từ Android 15, các cấu hình phông chữ biến sẽ được chỉ định trong font_fallback.xml
bằng định dạng sau:
<family lang="und-Ethi" supportedAxes="wght,ital">
<font>NotoSansEthiopic-VF.ttf</font>
</family>
Ở định dạng này, phông chữ biến có tất cả các thuộc tính của phông chữ tĩnh cùng với thuộc tính supportedAxes
bổ sung. Thuộc tính supportedAxes
là một danh sách được phân tách bằng dấu phẩy gồm các thẻ trục được hỗ trợ. Với Android 15, bạn chỉ có thể chỉ định các trục wght
và ital
.
Nếu bạn không chỉ định thuộc tính supportedAxes
, thì nút font
sẽ hoạt động như một phông chữ tĩnh của một thực thể duy nhất của phông chữ biến thể được chỉ định bằng các nút con axis
.
Nếu bạn chỉ định thuộc tính supportedAxes
, hệ thống sẽ tự động tạo một bản sao phông chữ cho giá trị kiểu và độ đậm trong thời gian chạy.
Nhà phát triển có thể sử dụng API Java android.graphics.fonts.SystemFonts#getAvailableFonts
hoặc API NDK ASystemFontIterator_open
để nhận danh sách các tệp phông chữ do hệ thống cài đặt. Để biết thông tin về các API dành cho nhà phát triển hỗ trợ bản cập nhật này, hãy xem API Phông chữ biến thể OpenType được cải thiện và buildVariableFamily
.
Tuỳ chỉnh phông chữ
Một số OEM cài đặt hoặc thay thế các tệp phông chữ trong AOSP để hiển thị thương hiệu của họ. Android 12 hỗ trợ chức năng này, nhưng bổ sung thêm các yêu cầu để cập nhật phông chữ biểu tượng cảm xúc trên thiết bị. Các nhà sản xuất thiết bị gốc (OEM) không sửa đổi hoặc cập nhật tệp phông chữ biểu tượng cảm xúc không cần sử dụng tính năng này.
Google cập nhật các tệp phông chữ, đặc biệt là các tệp NotoColorEmoji
thông qua GMS Core, vì vậy, đừng sửa đổi hoặc xoá tệp NotoColorEmoji.ttf
khỏi phân vùng /system
và đừng xoá tệp đó khỏi /frameworks/base/data/fonts/fonts.xml
.
Lưu ý 3 cách sau đây để bạn có thể tuỳ chỉnh phông chữ:
- Thay thế tệp
NotoColorEmoji.ttf
bằng phông chữ biểu tượng cảm xúc mang thương hiệu OEM. - Sửa đổi tệp
NotoColorEmoji.ttf
cho phù hợp với nhu cầu của thị trường địa phương. - Thay thế hoặc sửa đổi các tệp phông chữ khác.
Nếu không sửa đổi phông chữ biểu tượng cảm xúc trong AOSP (Dự án nguồn mở Android) thì bạn không cần làm gì cả. Nếu bạn muốn tuỳ chỉnh phông chữ biểu tượng cảm xúc, hãy làm theo hướng dẫn trong các phần sau.
Thay thế NotoColorEmoji.ttf bằng phông chữ biểu tượng cảm xúc mang thương hiệu OEM
Để thay thế tệp NotoColorEmoji.ttf
bằng tệp phông chữ biểu tượng cảm xúc mang thương hiệu OEM, hãy đặt phông chữ biểu tượng cảm xúc ngay trước chuỗi dự phòng phông chữ:
- Đặt phông chữ của riêng bạn, có tên là
OEMCustomEmoji.ttf
, vào phân vùng/system
. Sửa đổi
/frameworks/base/data/fonts/fonts.xml
(và/frameworks/base/data/fonts/font-fallback.xml
trong Android 15 trở lên) như trong mã sau:<family lang="ko"> <font weight="400" style="normal" index="1">NotoSansCJK-Regular.ttc</font> </family> <!-- ADD FOLLOWING LINE --> <family lang="und-Zsye"> <font weight="400" style="normal">OEMCustomEmoji.ttf</font> </family> <!-- END OF MODIFICATION --> <family lang="und-Zsye"> <font weight="400" style="normal">NotoColorEmoji.ttf</font> </family> <family lang="und-Zsym"> <font weight="400" style="normal">NotoSansSymbols-Regular-Subsetted2.ttf</font> </family>
Sửa đổi NotoColorEmoji.ttf cho nhu cầu của thị trường địa phương
Hãy làm theo các bước sau để điều chỉnh cho phù hợp với nhu cầu tại thị trường địa phương của bạn:
- Tạo tệp
NotoColorEmoji
của riêng bạn với một tên khác; ví dụ: đặt tên làModified\_NotoColorEmoji.ttf
. - Đặt tệp này trước tệp
NotoColorEmoji.ttf
gốc.
Sau khi bạn thực hiện bước 2, ký tự đã sửa đổi được Modified\NotoColorEmoji.ttf
hỗ trợ sẽ xuất hiện thay vì NotoColorEmoji.ttf
ban đầu.
Google đề xuất những việc sau:
- Chỉ có ký tự cần thiết trong phông chữ này.
- Uỷ quyền các ký tự chưa sửa đổi cho tệp
NotoColorEmoji.ttf
ban đầu để thiết bị nhận mọi bản sửa lỗi thiết kế được đưa ra trong các bản phát hành biểu tượng cảm xúc sau này.
Xoá ký tự: Để xoá ký tự khỏi tệp NotoColorEmoji.ttf
, hãy làm theo bước 1 và 2, đồng thời chỉ định glyph ID = 0
trong cmap.
Sử dụng cờ theo khu vực: Nếu ký tự mục tiêu là cờ theo khu vực, hãy chỉ định mã ký tự là mã quốc gia không xác định. (Sử dụng country code = "ZZ"
.)
Tạo chữ tượng hình đậu phụ: Bạn có thể chỉ định rõ ràng mã nhận dạng ký tự đậu phụ nếu muốn sử dụng mã nhận dạng này. Khi bạn chỉ định glyphID = 0
, ứng dụng liên quan sẽ diễn giải rằng là "không có Dagger". Ví dụ: khi bạn sử dụng thuộc tính này, ứng dụng Paint#hasGlyph
sẽ trả về false
.
Thay thế hoặc sửa đổi các tệp phông chữ khác
Để thay thế hoặc sửa đổi các phông chữ khác, cách tuỳ chỉnh cũng tương tự như cách sửa đổi tệp TTF cho nhu cầu của thị trường địa phương. Các tệp phông chữ không xác định được cập nhật trong AOSP (Dự án nguồn mở Android) trong thời gian chạy sẽ bị bỏ qua và không được cập nhật. Google sẽ bỏ qua các phông chữ không xác định trong thiết bị của bạn. Trong đó bao gồm cả các tệp phông chữ đã được sửa đổi từ phông chữ gốc trong AOSP.
Mặc dù việc cập nhật phông chữ do Google thực hiện trong GMS Core, nhưng cơ chế cập nhật phông chữ chung áp dụng cho tất cả các OEM. Nhà sản xuất thiết bị gốc (OEM) có thể cài đặt trình cập nhật phông chữ bổ sung bằng cách làm theo các bước trong phần Điều kiện tiên quyết, Ký tệp phông chữ và Cập nhật phông chữ trong thời gian chạy.
Đáp ứng các điều kiện tiên quyết
Cơ chế cập nhật phông chữ sử dụng tính năng nhân fs-verity
của Linux. Xác minh rằng thiết bị của bạn tuân thủ fs-verity
và đưa chứng chỉ vào thiết bị.
Ký tệp phông chữ
Vì tệp phông chữ là tài nguyên tiềm ẩn rủi ro, nên bạn phải xác minh các tệp này bằng các khoá đáng tin cậy.
Xem xét kỹ tất cả các tệp phông chữ cần cập nhật và ký bằng khoá riêng tư của bạn. Chữ ký phải tương thích vớifs-verity
.
Cập nhật phông chữ trong thời gian chạy
Ứng dụng hệ thống FontManager
thực hiện cập nhật phông chữ. Ứng dụng FontManager
cung cấp trạng thái phông chữ mới nhất của hệ thống và khả năng cập nhật các tệp phông chữ bằng chữ ký. Để gọi các ứng dụng cập nhật, hãy thêm quyền UPDATE_FONT signature|privileged
vào danh sách cho phép của ứng dụng và vào tệp kê khai.
Cung cấp quyền UPDATE_FONT signature|privileged
cho chức năng cập nhật của ứng dụng.