הטמעת גופנים מותאמים אישית

החל מגרסה 15 של Android, גופנים משתנים עוברים עיבוד בזמן הריצה בצורה יעילה ומפורטת יותר. בעקבות העדכון הזה, ספקים צריכים להוסיף הגדרות חדשות של גופנים משתנים אל font_fallback.xml במקום אל fonts.xml, כי fonts.xml יוצא משימוש. מידע נוסף זמין במאמר תמיכה בגופנים משתנים.

ב-Android 11 ובגרסאות ישנות יותר, כדי לעדכן את קובצי הגופן שמותקנים במכשיר ב-AOSP (במחיצה /system/fonts) או במחיצות של הספק (במחיצות /product/fonts או /system/fonts), נדרש עדכון מערכת מה-OEM. הדרישה הזו משפיעה באופן משמעותי על תאימות האמוג'י. ב-Android 12 אפשר להשתמש בשירות המערכת FontManager כדי לנהל קובצי גופנים מותקנים ולעדכן קובצי גופנים שמותקנים במכשיר בלי עדכון מערכת.

ב-Android 12 יש שלוש אינטראקציות בין תהליכים: FontManagerService,‏ Font Updater ו-Application.

FontManagerService היא מערכת הניהול המרכזית בשרת המערכת. FontManagerService שומר את הגדרות הגופן העדכניות ביותר של המערכת לכל משתמש.

FontUpdater הוא עדכון גופנים שניתן לחבר, שמאומת על ידי בדיקת הרשאה של signature|privileged. ה-FontUpdater מתקשר עם ה-FontManagerService כדי לקבל, להתקין, להסיר או לעדכן את הגדרות הגופן הנוכחיות של המערכת. ה-FontUpdater יכול להעביר תוכן של קובץ גופן חדש באמצעות מנגנונים של תקשורת בין תהליכים (IPC). ה-FontManagerService שומר את התוכן במיקום אחסון שגלוי לכולם, למשל בקבצים /data/fonts. האחסון הזה מאובטח. רק לחשבון FontManagerService יש הרשאה לכתוב אותו, בהתאם למדיניות של SELinux.

כשהקלאס Application מופעל, הוא מעביר את הגדרות הגופן של המערכת כארגומנטים של שיטת bindApplication, ולאחר מכן מאתחלל את הגדרות הגופן לשימוש בתהליך האפליקציה.

תמיכה בגופנים משתנים

החל מגרסה 15 של Android, הגדרות של גופנים משתנים מצוינות ב-font_fallback.xml בפורמט הבא:

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

בפורמט הזה, לגופן משתנה יש את כל המאפיינים של גופן סטטי, יחד עם מאפיין supportedAxes נוסף. מאפיין supportedAxes הוא רשימה של תגי צירים נתמכים, מופרדים בפסיקים. ב-Android 15 אפשר לציין רק את הצירים wght ו-ital.

אם לא מציינים את המאפיין supportedAxes, הצומת font פועל כגופן סטטי של מופע יחיד של גופן משתנה שצוין באמצעות הצאצאים axis.

אם מציינים את המאפיין supportedAxes, המערכת יוצרת באופן דינמי מופע של גופן לערך הנתון של העובי והסגנון בזמן הריצה.

מפתחים יכולים להשתמש ב-Java API‏ android.graphics.fonts.SystemFonts#getAvailableFonts או ב-NDK API‏ ASystemFontIterator_open כדי לקבל רשימה של קובצי הגופנים שמותקנים במערכת. מידע על ממשקי API למפתחים שתומכים בעדכון הזה זמין במאמרים Improved OpenType Variable Font API ו-buildVariableFamily.

התאמה אישית של גופנים

יצרני ציוד מקורי מסוימים מתקינים או מחליפים קובצי גופנים ב-AOSP כדי להציג את המותגים שלהם. מערכת Android 12 תומכת בפונקציה הזו, אבל מוסיפה דרישות כדי לוודא שגופנים של אמוג'י יהיו מעודכנים במכשירים. יצרני ציוד מקורי שלא משנים או מעדכנים את קובצי הגופנים של הסמלי ה-emoji לא צריכים להשתמש בתכונה הזו.

Google מעדכנת את קובצי הגופנים, במיוחד את קובצי NotoColorEmoji דרך GMS Core, לכן אל תשנו או תסירו את הקובץ NotoColorEmoji.ttf מהמחיצה /system ואל תסירו אותו מ-/frameworks/base/data/fonts/fonts.xml. אלה שלוש הדרכים להתאים אישית את הגופנים:

  1. מחליפים את הקובץ NotoColorEmoji.ttf בגופן אמוג'י ממותג של יצרן ציוד מקורי (OEM).
  2. משנים את הקובץ NotoColorEmoji.ttf בהתאם לצרכים של השוק המקומי.
  3. להחליף או לשנות קובצי גופנים אחרים.

אם אתם לא משנים גופנים של אמוג'י ב-AOSP, אין צורך לבצע פעולה כלשהי. כדי להתאים אישית את הגופנים של סמלי האמוג'י, יש לפעול לפי ההוראות שבקטעים הבאים.

החלפת NotoColorEmoji.ttf בגופנים של אמוג'י ממותגים של יצרן ציוד מקורי (OEM)

כדי להחליף את הקובץ NotoColorEmoji.ttf בקובץ של גופני האמוג'י שלכם עם המותג של היצרן, צריך להוסיף את קובץ הגופנים של האמוג'י לפני שרשרת חלופות הגופנים:

  1. מעבירים את הגופן שלכם, שנקרא OEMCustomEmoji.ttf, למחיצה /system.
  2. משנים את הערך של /frameworks/base/data/fonts/fonts.xml (ואת הערך של /frameworks/base/data/fonts/font-fallback.xml ב-Android מגרסה 15 ואילך) לפי הקוד הבא:

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

שינוי קובץ NotoColorEmoji.ttf בהתאם לצרכים של השוק המקומי

כדי להתאים אישית את האפשרויות בהתאם לצרכים של השוק המקומי, פועלים לפי השלבים הבאים:

  1. יוצרים קובץ NotoColorEmoji משלכם בשם אחר, למשל Modified\_NotoColorEmoji.ttf.
  2. צריך להוסיף אותו לפני הקובץ המקורי NotoColorEmoji.ttf.

אחרי ביצוע שלב 2, הגליף המותאם שנתמך ב-Modified\NotoColorEmoji.ttf יופיע במקום NotoColorEmoji.ttf המקורי. Google ממליצה על הפעולות הבאות:

  • רק הגליף הנדרש נמצא בגופן הזה.
  • להקצות גליפים ללא שינוי לקובץ NotoColorEmoji.ttf המקורי, כדי שהמכשירים יקבלו תיקוני עיצוב שייערכו במהדורות עתידיות של אמוג'י.

הסרת גליפים: כדי להסיר גליפים מקובץ NotoColorEmoji.ttf, פועלים לפי שלבים 1 ו-2 ומציינים glyph ID = 0 ב-cmap.

שימוש בדגל אזורי: אם הגליף היעד הוא דגל אזורי, צריך לציין את מזהה הגליף כקוד מדינה לא ידוע. (משתמשים ב-country code = "ZZ").

יצירת גליף של tofu: אם רוצים להשתמש בגליף של tofu, אפשר לציין את המזהה שלו באופן מפורש. כשמציינים את הערך glyphID = 0, האפליקציה הרלוונטית מפרשת את זה כ'הגליף לא זמין'. לדוגמה, כשמשתמשים במאפיין הזה, האפליקציה Paint#hasGlyph מחזירה את הערך false.

החלפה או שינוי של קובצי גופנים אחרים

כדי להחליף או לשנות גופנים אחרים, התהליך דומה לתהליך השינוי של קובצי ה-TTF בהתאם לצרכים של השוק המקומי. קבצי גופנים לא מוכרים שמתעדכנים ב-AOSP בזמן הריצה מתעלמים ולא מתעדכנים. Google מתעלמת מגופנים לא מוכרים במכשיר. כולל קובצי גופנים שעברו שינוי מהגופנים המקוריים ב-AOSP.

Google מבצעת את עדכוני הגופנים ב-GMS Core, אבל מנגנון העדכון הכללי של הגופנים פתוח לכל יצרני הציוד המקורי (OEM). יצרני ציוד מקורי יכולים להתקין עדכוני גופנים נוספים לפי השלבים המפורטים בקטע עמידה בדרישות המוקדמות, חתימה על קובצי גופנים וביצוע עדכוני גופנים בסביבת זמן הריצה.

עמידה בדרישות מוקדמות

מנגנון עדכון הגופנים משתמש בתכונה fs-verity של ליבה Linux. מוודאים שהמכשיר תואם ל-fs-verity וכוללים את האישור במכשיר.

חתימה על קובצי גופנים

מכיוון שקובצי גופנים הם משאבים מסוכנים, צריך לאמת אותם באמצעות מפתחות מהימנים. בודקים היטב את כל קובצי הגופנים שרוצים לעדכן, ומחתימים עליהם באמצעות המפתח הפרטי. החתימה צריכה להיות תואמת ל-fs-verity.

עדכון גופנים בזמן ריצה

אפליקציית המערכת FontManager מבצעת עדכוני גופנים. באפליקציה FontManager מוצג סטטוס הגופן העדכני ביותר שמותקן במערכת, ואפשר לעדכן קבצי גופן באמצעות חתימות. כדי לקרוא לאפליקציות לעדכון, צריך להוסיף את ההרשאה UPDATE_FONT signature|privileged לרשימת ההיתרים של האפליקציות ולמניפסט.

מעניקים את ההרשאה UPDATE_FONT signature|privileged לפונקציית העדכון של האפליקציה.