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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

‫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 בקובץ של גופני אמוג'י עם מיתוג של יצרן ציוד מקורי (OEM), צריך להוסיף את גופן האמוג'י ממש לפני שרשרת הגיבוי של הגופנים:

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

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

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

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

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

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

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

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

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

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

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

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