Mengimplementasikan font kustom

Mulai Android 15, font variabel dirender saat runtime dengan efisiensi dan perincian yang lebih baik. Dengan update ini, vendor harus menambahkan konfigurasi font variabel baru ke font_fallback.xml, bukan fonts.xml, karena fonts.xml tidak digunakan lagi. Lihat Dukungan untuk font variabel untuk mengetahui informasi selengkapnya.

Di Android 11 dan yang lebih rendah, memperbarui file font yang diinstal di perangkat di AOSP (di partisi /system/fonts) atau partisi vendor (di partisi /product/fonts atau /system/fonts) memerlukan update sistem dari OEM. Persyaratan ini memiliki dampak signifikan pada kompatibilitas emoji. Di Android 12, Anda dapat menggunakan layanan sistem FontManager untuk mengelola file font yang diinstal dan mengupdate file font yang diinstal di perangkat tanpa update sistem.

Android 12 memiliki tiga interaksi proses; FontManagerService, Font Updater, dan Application.

FontManagerService adalah sistem pengelolaan pusat di server sistem. FontManagerService menyimpan setelan font sistem terbaru per pengguna.

FontUpdater adalah pengupdate font yang dapat di-plug dan dipercaya oleh pemeriksaan izin signature|privileged. FontUpdater berkomunikasi dengan FontManagerService untuk mendapatkan, menginstal, menghapus, atau memperbarui setelan font sistem saat ini. FontUpdater dapat meneruskan konten file font baru dengan mekanisme komunikasi antar-proses (IPC). FontManagerService menyimpan konten ke lokasi penyimpanan yang dapat dibaca secara global, seperti di file /data/fonts. Penyimpanan ini dilindungi. File ini dapat ditulis oleh FontManagerService saja, berdasarkan kebijakan SELinux.

Saat diluncurkan, class Application akan meneruskan setelan font sistem sebagai argumen metode bindApplication; lalu menginisialisasi setelan font untuk digunakan oleh proses aplikasi.

Dukungan untuk font variabel

Mulai Android 15, konfigurasi font variabel ditentukan di font_fallback.xml menggunakan format berikut:

<family lang="und-Ethi" supportedAxes="wght,ital">
    <font>NotoSansEthiopic-VF.ttf</font>
</family>

Dalam format ini, font variabel memiliki semua atribut font statis dengan atribut supportedAxes tambahan. Atribut supportedAxes adalah daftar tag sumbu yang didukung yang dipisahkan koma. Dengan Android 15, hanya sumbu wght dan ital yang dapat ditentukan.

Jika atribut supportedAxes tidak ditentukan, node font berfungsi sebagai font statis dari satu instance font variabel yang ditentukan dengan turunan axis.

Jika atribut supportedAxes ditentukan, sistem akan membuat instance font secara dinamis untuk nilai ketebalan dan gaya yang diberikan saat runtime.

Developer dapat menggunakan android.graphics.fonts.SystemFonts#getAvailableFonts Java API atau ASystemFontIterator_open NDK API untuk mendapatkan daftar file font yang diinstal sistem. Untuk mengetahui informasi tentang API developer yang mendukung update ini, lihat Improved OpenType Variable Font API dan buildVariableFamily.

Menyesuaikan font

Beberapa OEM menginstal atau mengganti file font di AOSP untuk menampilkan merek mereka. Android 12 mendukung fungsi ini, tetapi menambahkan persyaratan untuk terus mengupdate font emoji di perangkat. OEM yang tidak mengubah atau mengupdate file font emoji tidak perlu menggunakan fitur ini.

Google memperbarui file font, terutama file NotoColorEmoji melalui GMS Core, jadi jangan ubah atau hapus file NotoColorEmoji.ttf dari partisi /system, dan jangan hapus dari /frameworks/base/data/fonts/fonts.xml. Perhatikan tiga cara berikut yang dapat Anda lakukan untuk menyesuaikan font:

  1. Ganti file NotoColorEmoji.ttf dengan font emoji bermerek OEM.
  2. Ubah file NotoColorEmoji.ttf untuk kebutuhan pasar lokal Anda.
  3. Mengganti atau mengubah file font lainnya.

Jika Anda tidak mengubah font emoji di AOSP, Anda tidak perlu melakukan tindakan apa pun. Jika Anda ingin menyesuaikan font emoji, gunakan petunjuk di bagian berikut.

Ganti NotoColorEmoji.ttf dengan font emoji bermerek OEM

Untuk mengganti file NotoColorEmoji.ttf dengan file font emoji bermerek OEM Anda, tempatkan font emoji tepat sebelum rantai penggantian font:

  1. Tempatkan font Anda sendiri, yang disebut OEMCustomEmoji.ttf, di partisi /system.
  2. Ubah /frameworks/base/data/fonts/fonts.xml (dan /frameworks/base/data/fonts/font-fallback.xml di Android 15 dan yang lebih tinggi) seperti dalam kode berikut:

    <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>
    

Mengubah NotoColorEmoji.ttf untuk kebutuhan pasar lokal

Ikuti langkah-langkah berikut untuk menyesuaikan kebutuhan pasar lokal Anda:

  1. Buat file NotoColorEmoji Anda sendiri dengan nama yang berbeda; misalnya, beri nama Modified\_NotoColorEmoji.ttf.
  2. Letakkan sebelum file NotoColorEmoji.ttf asli.

Setelah Anda melakukan langkah 2, glif yang diubah yang didukung oleh Modified\NotoColorEmoji.ttf akan ditampilkan, bukan NotoColorEmoji.ttf asli. Google merekomendasikan hal berikut:

  • Hanya memiliki glif yang diperlukan dalam font ini.
  • Delegasikan glif yang tidak dimodifikasi ke file NotoColorEmoji.ttf asli sehingga perangkat Anda menerima perbaikan desain yang dilakukan dalam rilis emoji mendatang.

Menghapus glif: Untuk menghapus glif dari file NotoColorEmoji.ttf, ikuti langkah 1 dan 2, lalu tentukan glyph ID = 0 di cmap Anda.

Menggunakan bendera regional: Jika glyph target adalah bendera regional, tentukan ID glyph sebagai kode negara yang tidak diketahui. (Gunakan country code = "ZZ".)

Membuat glif tahu: Anda dapat menentukan ID glif tahu secara eksplisit jika ingin menggunakannya. Saat Anda menentukan glyphID = 0, aplikasi terkait menafsirkannya sebagai “glyph tidak tersedia”. Misalnya, saat Anda menggunakan atribut ini, aplikasi Paint#hasGlyph akan menampilkan false.

Mengganti atau mengubah file font lainnya

Untuk mengganti atau mengubah font lain, penyesuaiannya mirip dengan penyesuaian untuk mengubah file TTF untuk kebutuhan pasar lokal. File font tidak dikenal yang diperbarui di AOSP saat runtime akan diabaikan, dan tidak diperbarui. Google mengabaikan font yang tidak dikenal di perangkat Anda. Hal ini mencakup file font yang diubah dari font asli di AOSP.

Meskipun update font dilakukan oleh Google di GMS Core, mekanisme update font umum terbuka untuk semua OEM. OEM dapat menginstal updater font tambahan menggunakan langkah-langkah dalam Persyaratan rapat, Menandatangani file font, dan Membuat update font runtime.

Memenuhi prasyarat

Mekanisme update font menggunakan fitur kernel Linux fs-verity. Verifikasi bahwa perangkat Anda mematuhi fs-verity dan sertakan sertifikat di perangkat Anda.

Menandatangani file font

Karena file font adalah resource berisiko, file tersebut harus diverifikasi dengan kunci tepercaya. Tinjau dengan cermat semua file font yang akan diperbarui, dan tandatangani dengan kunci pribadi Anda. Tanda tangan harus kompatibel denganfs-verity.

Membuat pembaruan font runtime

Aplikasi sistem FontManager melakukan update font. Aplikasi FontManager memberikan status font sistem yang diinstal terbaru dan kemampuan untuk mengupdate file font dengan tanda tangan. Untuk memanggil update aplikasi, tambahkan izin UPDATE_FONT signature|privileged ke daftar aplikasi yang diizinkan, dan ke manifes Anda.

Berikan izin UPDATE_FONT signature|privileged ke fungsi pengupdate aplikasi Anda.