Triển khai phông chữ tuỳ chỉnh

Kể từ Android 15, các phông chữ biến thể sẽ hiển thị ở 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ấ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ữ thay đổi để biết thêm thông tin.

Trong Android 11 trở xuống, cập nhật các tệp phông chữ được cài đặt trên thiết bị trong AOSP (trong phân vùng /system/fonts) hoặc phân vùng nhà cung cấp (trong /product/fonts hoặc /system/fonts) yêu cầu nhà sản xuất thiết bị gốc phải cập nhật hệ thống. Chiến dịch này có ảnh hưởng đáng kể đến khả năng tương thích của biểu tượng cảm xúc. Ngang bằng Trên Android 12, bạn có thể sử dụng hệ thống FontManager dịch vụ 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 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 UpdaterApplication.

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ữ mới nhất của mỗi người dùng trong hệ thống.

FontUpdater là trình cập nhật phông chữ có thể cắm được 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 phông chữ hiện tại của hệ thống phần cài đặt. FontUpdater có thể truyền nội dung tệp phông chữ mới thông qua quy trình liên quy trình cơ chế truyền thông (IPC). FontManagerService lưu nội dung vào một vị trí lưu trữ dễ đọc trên toàn cầu, chẳng hạn như trong các tệp /data/fonts. Chiến dịch này bộ nhớ dữ liệu được bảo vệ. Chỉ FontManagerService có thể viết mã này, bằng cách Chính sách SELinux.

Khi lớp Application chạy, lớp này sẽ chuyển chế độ cài đặt phông chữ của hệ thống dưới dạng đối số của phương thức bindApplication; sau đó sẽ khởi chạy 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ữ có thể thay đổi sẽ được chỉ định trong font_fallback.xml bằng cách sử dụ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ữ thay đổi có tất cả các thuộc tính của phông chữ tĩnh với thuộc tính supportedAxes bổ sung. Thuộc tính supportedAxes là danh sách các thẻ trục được hỗ trợ được phân tách bằng dấu phẩy. Bằng Trên Android 15, chỉ trục wghtital mới có thể đã chỉ định.

Nếu bạn không chỉ định thuộc tính supportedAxes, nút font sẽ hoạt động như một phông chữ tĩnh của một phiên bản phông chữ biến được chỉ định bằng axis trẻ em.

Nếu bạn chỉ định thuộc tính supportedAxes, hệ thống sẽ tự động tạo một thuộc tính bản sao phông chữ cho giá trị độ đậm và kiểu đã cho trong thời gian chạy.

Nhà phát triển có thể dùng android.graphics.fonts.SystemFonts#getAvailableFonts API Java hoặc ASystemFontIterator_open NDK API để lấy 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 nhà phát triển hỗ trợ bản cập nhật này, hãy xem API phông chữ biến OpenType đã cải tiếnbuildVariableFamily.

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 thêm để cập nhật phông chữ biểu tượng cảm xúc trên thiết bị. 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 chính yếu, do đó đừng sửa đổi hoặc xoá tệp NotoColorEmoji.ttf khỏi Phân vùng /system và không xoá phân vùng đó khỏi /frameworks/base/data/fonts/fonts.xml. Hãy lưu ý ba cách sau để bạn có thể tuỳ chỉnh phông chữ của mình:

  1. 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.
  2. Sửa đổi tệp NotoColorEmoji.ttf cho phù hợp với nhu cầu của thị trường địa phương của bạn.
  3. 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 .

Thay thế NotoColorEmoji.ttf bằng phông chữ biểu tượng cảm xúc mang thương hiệu OEM

Cách 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: đặt phông chữ biểu tượng cảm xúc ngay trước chuỗi dự phòng phông chữ:

  1. Đặt phông chữ của riêng bạn, tên là OEMCustomEmoji.ttf, vào phân vùng /system.
  2. Sửa đổi /frameworks/base/data/fonts/fonts.xml (và /frameworks/base/data/fonts/font-fallback.xml inch 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>
    

Chỉnh sửa NotoColorEmoji.ttf cho nhu cầu tại 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:

  1. Tạo tệp NotoColorEmoji của riêng bạn bằng tên khác; ví dụ: đặt tên nó là Modified\_NotoColorEmoji.ttf.
  2. Đặ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 hỗ trợ bởi Modified\NotoColorEmoji.ttf xuất hiện thay vì NotoColorEmoji.ttf gốc. 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ị của bạn sẽ nhận được mọi bản sửa lỗi thiết kế 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 của bạn.

Sử dụng cờ khu vực: Nếu ký tự mục tiêu là cờ khu vực, hãy chỉ định ký tự dưới dạng mã quốc gia không xác định. (Sử dụng country code = "ZZ".)

Tạo ký tự trên đậu phụ: Bạn có thể chỉ định rõ mã nhận dạng ký tự đậu phụ nếu muốn để sử dụng. Khi bạn chỉ định glyphID = 0, ứng dụng liên quan sẽ diễn giải rằng là "không có ký tự". Ví dụ: khi bạn sử dụng thuộc tính này, thuộc tính Ứng dụng Paint#hasGlyph 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ư đối với sửa đổi tệp TTF cho phù hợp với nhu cầu của thị trường địa phương. Tệp phông chữ không xác định cập nhật trong AOSP (Dự án nguồn mở Android) tại thời gian chạy sẽ bị bỏ qua và không được cập nhật. Google sẽ bỏ qua phông chữ không xác định trong thiết bị của bạn. Bao gồm cả các tệp phông chữ đã được sửa đổi 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 bản cập nhật phông chữ chung dành cho tất cả OEM. OEM có thể cài đặt trình cập nhật phông chữ bổ sung bằng cách sử dụng các bước trong phần Điều kiện tiên quyết cho cuộc họp, 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à có chứng chỉ này trong thiết bị của bạn.

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ữ sẽ được cập nhật và ký bằng khoá riêng tư. Chữ ký phải tương thích với fs-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 phông chữ tệp có chữ ký. Để gọi ứng dụng cập nhật, hãy thêm Quyền của UPDATE_FONT signature|privileged đối với danh sách ứng dụng được phép, và vào tệp kê khai.

Cấp quyền UPDATE_FONT signature|privileged cho trình cập nhật ứng dụng .