Triển khai phông chữ tùy chỉnh

Trong Android 11 trở xuống, việc 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 của nhà cung cấp (trong phân vùng /product/fonts hoặc /system/fonts ) yêu cầu cập nhật hệ thống từ 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 cài đặt trên thiết bị mà không cần cập nhật hệ thống.

Android 12 có ba quy trình tương tác; 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ữ cài đặt phông chữ hệ thống mới nhất cho mỗi người dùng.

FontUpdater là một trình cập nhật phông chữ có thể cắm được, được tin cậy bằng cách kiểm tra signature|privileged . FontUpdater giao tiếp với FontManagerService để nhận, cài đặt, xóa hoặc cập nhật cài đặt phông chữ hệ thống hiện tại. FontUpdater có thể truyền nội dung tệp phông chữ mới bằng cơ chế liên lạc giữa các quá trình (IPC). FontManagerService lưu nội dung vào một vị trí lưu trữ có thể đọc được trên thế giới, chẳng hạn như trong tệp /data/fonts . Kho lưu trữ này được bảo vệ. Nó chỉ có thể được viết bởi FontManagerService , theo chính sách SELinux.

Khi lớp Application khởi chạy, nó chuyển các cài đặt phông chữ hệ thống dưới dạng đối số của phương thức bindApplication ; sau đó nó sẽ khởi tạo cài đặt phông chữ để quy trình ứng dụng sử dụng.

Tùy 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 để luôn cập nhật phông chữ biểu tượng cảm xúc trên thiết bị. Cá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 xóa tệp NotoColorEmoji.ttf khỏi phân vùng /system và đừng xóa nó khỏi /system/etc/fonts.xml . Hãy lưu ý ba cách sau để bạn có thể tùy 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 nhãn hiệu OEM.
  2. Sửa đổi tệp NotoColorEmoji.ttf cho nhu cầu thị trường địa phương của bạn.
  3. Thay thế hoặc sửa đổi các tập tin phông chữ khác.

Nếu bạn không sửa đổi phông chữ biểu tượng cảm xúc trong AOSP thì bạn không cần phải thực hiện hành động nào. Nếu bạn muốn tùy chỉnh phông chữ biểu tượng cảm xúc, hãy sử dụng 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 nhãn 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 nhãn hiệu OEM của bạn, 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ữ:

  1. Đặt phông chữ của riêng bạn, được gọi là OEMCustomEmoji.ttf , trong phân vùng /system .
  2. Sửa đổi /system/etc/fonts.xml như trong đoạn 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 thị trường địa phương

Hãy làm theo các bước sau để tùy chỉnh cho phù hợp với nhu cầu thị trường địa phương của bạn:

  1. 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 .
  2. Đặt nó trước tệp NotoColorEmoji.ttf ban đầu.

Sau khi bạn thực hiện bước 2, hình tượng đã sửa đổi được Modified\NotoColorEmoji.ttf hỗ trợ sẽ hiển thị thay vì NotoColorEmoji.ttf ban đầu. Google khuyến nghị như sau:

  • Chỉ có glyph cần thiết trong phông chữ này.
  • Ủy quyền các hình tượng chưa được sửa đổi vào tệp NotoColorEmoji.ttf gốc để thiết bị của bạn nhận được mọi bản sửa lỗi thiết kế được thực hiện trong các bản phát hành biểu tượng cảm xúc trong tương lai.

Xóa hình tượng trưng: Để xóa hình tượng trưng 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 hình tượng đích là cờ khu vực, hãy chỉ định ID hình tượng là mã quốc gia không xác định. (Sử dụng country code = "ZZ" .)

Tạo hình tượng đậu phụ: Bạn có thể chỉ định rõ ràng ID hình đậu phụ nếu bạn muốn sử dụng ID đó. Khi bạn chỉ định glyphID = 0 , ứng dụng liên quan sẽ hiểu rằng "glyph không có sẵn". 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, việc tùy chỉnh tương tự như sửa đổi các tệp TTF cho nhu cầu 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 khi chạy sẽ bị bỏ qua và không được cập nhật. Google bỏ qua các phông chữ không xác định trong thiết bị của bạn. Điều này bao gồm 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ữ được Google thực hiện trong GMS Core nhưng cơ chế cập nhật phông chữ chung được mở cho tất cả các OEM. OEM có thể cài đặt các trình cập nhật phông chữ bổ sung bằng cách sử dụng các bước trong Đáp ứng các điều kiện tiên quyết , Ký các tệp phông chữThực hiện cập nhật phông chữ trong thời gian chạy .

Đáp ứng đ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 Linux fs-verity . 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ị của bạn.

Ký tên tập tin phông chữ

Vì các tệp phông chữ là tài nguyên rủi ro nên chúng phải được xác minh bằng các khóa đáng tin cậy. Xem xét cẩn thận tất cả các tệp phông chữ sẽ được cập nhật và ký bằng khóa riêng của bạn. Chữ ký phải tương thích với fs-verity .

Thực hiện cập nhật phông chữ thời gian chạy

Ứng dụng Hệ thống FontManger 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ữ hệ thống được cài đặt mới nhất và khả năng cập nhật các tệp phông chữ có chữ ký. Để gọi các ứng dụng cập nhật, hãy thêm UPDATE_FONT signature|privileged vào danh sách cho phép ứng dụng của bạn và vào bảng kê khai của bạn .

Cung cấp UPDATE_FONT signature|privileged cho chức năng cập nhật ứng dụng của bạn.