پیاده سازی فونت های سفارشی

با شروع اندروید 15، فونت های متغیر در زمان اجرا با کارایی و جزئیات بهتر رندر می شوند. با این به‌روزرسانی، فروشندگان باید تنظیمات فونت متغیر جدیدی را به جای fonts.xml به font_fallback.xml اضافه کنند، زیرا fonts.xml در حال منسوخ شدن است. برای اطلاعات بیشتر به پشتیبانی از فونت های متغیر مراجعه کنید.

در Android 11 و پایین‌تر، به‌روزرسانی فایل‌های فونت نصب‌شده در دستگاه در AOSP (در پارتیشن /system/fonts ) یا پارتیشن‌های فروشنده (در پارتیشن‌های /product/fonts یا /system/fonts ) به به‌روزرسانی سیستم از OEM نیاز دارد. این نیاز تاثیر قابل توجهی بر سازگاری ایموجی دارد. در اندروید 12 می توانید از سرویس سیستم FontManager برای مدیریت فایل های فونت نصب شده و به روز رسانی فایل های فونت نصب شده در دستگاه بدون به روز رسانی سیستم استفاده کنید.

اندروید 12 دارای سه تعامل فرآیندی است. FontManagerService ، Font Updater و Application .

FontManagerService سیستم مدیریت مرکزی در سرور سیستم است. FontManagerService آخرین تنظیمات فونت سیستم برای هر کاربر را ذخیره می کند.

FontUpdater یک به‌روزرسانی فونت قابل اتصال است که توسط یک signature|privileged قابل اعتماد است. FontUpdater با FontManagerService برای دریافت، نصب، حذف یا به روز رسانی تنظیمات فونت فعلی سیستم ارتباط برقرار می کند. FontUpdater می تواند محتویات فایل فونت جدید را با مکانیزم های ارتباطات بین فرآیندی (IPC) ارسال کند. FontManagerService محتویات را در یک مکان ذخیره سازی قابل خواندن در جهان ذخیره می کند، مانند فایل های /data/fonts . این انبار محافظت می شود. این را می توان فقط توسط FontManagerService ، توسط خط مشی SELinux نوشت.

هنگامی که کلاس Application راه اندازی می شود، تنظیمات فونت سیستم را به عنوان آرگومان های متد bindApplication ارسال می کند. سپس تنظیمات فونت را برای استفاده در فرآیند برنامه تنظیم می کند.

پشتیبانی از فونت های متغیر

با شروع در Android 15، تنظیمات فونت متغیر در font_fallback.xml با استفاده از قالب زیر مشخص می‌شوند:

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

در این قالب، یک فونت متغیر دارای تمام ویژگی‌های یک فونت ثابت با ویژگی supportedAxes اضافی است. ویژگی supportedAxes لیستی از تگ های محور پشتیبانی شده جدا شده با کاما است. با اندروید 15 فقط می توان محور wght و ital را مشخص کرد.

اگر ویژگی supportedAxes مشخص نشده باشد، گره font به عنوان یک فونت ثابت از یک نمونه واحد از یک فونت متغیر مشخص شده با فرزندان axis کار می کند.

اگر ویژگی supportedAxes مشخص شده باشد، سیستم به صورت پویا یک نمونه فونت برای وزن و مقدار سبک داده شده در زمان اجرا ایجاد می کند.

توسعه دهندگان می توانند از android.graphics.fonts.SystemFonts#getAvailableFonts Java API یا ASystemFontIterator_open NDK API برای دریافت لیستی از فایل های فونت نصب شده در سیستم استفاده کنند. برای کسب اطلاعات در مورد APIهای برنامه‌نویسی که از این به‌روزرسانی پشتیبانی می‌کنند، API قلم متغیر OpenType و buildVariableFamily را ببینید.

سفارشی کردن فونت ها

برخی OEM ها فایل های فونت را در AOSP نصب یا جایگزین می کنند تا مارک های خود را نشان دهند. اندروید 12 از این قابلیت پشتیبانی می کند، اما الزاماتی را برای به روز نگه داشتن فونت های ایموجی در دستگاه ها اضافه می کند. OEM هایی که فایل های فونت ایموجی را اصلاح یا به روز نمی کنند، نیازی به استفاده از این ویژگی ندارند.

Google فایل‌های فونت، به‌ویژه فایل‌های NotoColorEmoji را از طریق GMS Core به‌روزرسانی می‌کند، بنابراین فایل NotoColorEmoji.ttf را از پارتیشن /system تغییر یا حذف نکنید و آن را از /frameworks/base/data/fonts/fonts.xml . به سه روش زیر توجه کنید که می توانید فونت های خود را سفارشی کنید :

  1. فایل NotoColorEmoji.ttf را با یک فونت emoji با مارک OEM جایگزین کنید.
  2. فایل NotoColorEmoji.ttf را برای نیازهای بازار محلی خود تغییر دهید.
  3. فایل های فونت دیگر را جایگزین یا تغییر دهید.

اگر فونت های ایموجی را در AOSP تغییر نمی دهید، نیازی به اقدام ندارید. اگر می‌خواهید فونت‌های ایموجی را سفارشی کنید، از دستورالعمل‌های بخش‌های زیر استفاده کنید.

فونت های ایموجی با مارک OEM را جایگزین NotoColorEmoji.ttf کنید

برای جایگزینی فایل NotoColorEmoji.ttf با فایل فونت‌های emoji با مارک OEM، فونت emoji را درست قبل از زنجیره فونت قرار دهید:

  1. فونت خود را به نام OEMCustomEmoji.ttf در پارتیشن /system قرار دهید.
  2. /frameworks/base/data/fonts/fonts.xml/frameworks/base/data/fonts/font-fallback.xml در اندروید 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 اصلی نشان داده می شود. گوگل موارد زیر را توصیه می کند:

  • فقط گلیف لازم را در این فونت داشته باشید.
  • حروف‌های اصلاح‌نشده را به فایل اصلی NotoColorEmoji.ttf بسپارید تا دستگاه‌های شما هر گونه اصلاحات طراحی ایجاد شده در نسخه‌های اموجی آینده را دریافت کنند.

Remove Glyphs: برای حذف حروف از فایل NotoColorEmoji.ttf ، مراحل 1 و 2 را دنبال کنید و glyph ID = 0 در cmap خود مشخص کنید.

از پرچم منطقه ای استفاده کنید: اگر علامت هدف یک پرچم منطقه ای است، شناسه علامت را به عنوان کد کشور ناشناخته مشخص کنید. ( country code = "ZZ" استفاده کنید.)

یک علامت توفو بسازید: اگر می‌خواهید از آن استفاده کنید، می‌توانید به صراحت یک شناسه علامت توفو را مشخص کنید. وقتی glyphID = 0 مشخص می‌کنید، برنامه مربوطه آن را به‌عنوان «گلیف در دسترس نیست» تفسیر می‌کند. برای مثال، وقتی از این ویژگی استفاده می‌کنید، برنامه Paint#hasGlyph false برمی‌گرداند.

فایل های فونت دیگر را جایگزین یا تغییر دهید

برای جایگزینی یا تغییر فونت‌های دیگر، سفارشی‌سازی شبیه به تغییر فایل‌های TTF برای نیازهای بازار محلی است. فایل های فونت ناشناخته ای که در زمان اجرا در AOSP به روز می شوند نادیده گرفته می شوند و به روز نمی شوند. گوگل فونت های ناشناخته را در دستگاه شما نادیده می گیرد. این شامل فایل‌های فونتی می‌شود که از فونت‌های اصلی در AOSP اصلاح شده‌اند.

اگرچه به روز رسانی فونت توسط گوگل در GMS Core انجام می شود، مکانیسم عمومی به روز رسانی فونت برای همه OEM ها باز است. OEM ها می توانند با استفاده از مراحل پیش نیازهای جلسه ، امضای فایل های فونت و ایجاد به روز رسانی فونت زمان اجرا، به روز رسانی فونت های اضافی را نصب کنند.

پیش نیازها را برآورده کنید

مکانیسم به روز رسانی فونت از ویژگی هسته لینوکس fs-verity استفاده می کند. بررسی کنید که دستگاه شما با fs-verity سازگار است و گواهی را در دستگاه خود قرار دهید.

فایل های فونت را امضا کنید

از آنجایی که فایل های فونت منابع خطرناکی هستند، باید با کلیدهای قابل اعتماد تأیید شوند. همه فایل های فونتی که قرار است به روز شوند را به دقت بررسی کنید و با کلید خصوصی خود امضا کنید. امضا باید با fs-verity سازگار باشد.

به روز رسانی فونت زمان اجرا را انجام دهید

برنامه سیستم FontManager به روز رسانی فونت را انجام می دهد. برنامه FontManager آخرین وضعیت فونت سیستم نصب شده و توانایی به روز رسانی فایل های فونت با امضا را فراهم می کند. برای فراخوانی برنامه‌های به‌روزرسانی، UPDATE_FONT signature|privileged مجوز را به فهرست مجاز برنامه‌ها و به مانیفست خود اضافه کنید.

UPDATE_FONT signature|privileged را برای عملکرد به‌روزرسانی برنامه خود ارائه دهید.