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

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

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

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

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

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

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

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

از اندروید ۱۵ به بعد، پیکربندی‌های متغیر فونت با استفاده از فرمت زیر در فایل font_fallback.xml مشخص می‌شوند:

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

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

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

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

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

سفارشی‌سازی فونت‌ها

برخی از تولیدکنندگان اصلی تجهیزات (OEM) برای نمایش برندهای خود، فایل‌های فونت را در AOSP نصب یا جایگزین می‌کنند. اندروید ۱۲ از این قابلیت پشتیبانی می‌کند، اما الزاماتی را برای به‌روزرسانی فونت‌های ایموجی در دستگاه‌ها اضافه می‌کند. تولیدکنندگان اصلی تجهیزاتی که فایل‌های فونت ایموجی را تغییر یا به‌روزرسانی نمی‌کنند، نیازی به استفاده از این ویژگی ندارند.

گوگل فایل‌های فونت، به خصوص فایل‌های 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 ) را مانند کد زیر تغییر دهید:

    <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 قرار دهید.

بعد از انجام مرحله ۲، گلیف اصلاح‌شده‌ای که توسط Modified\NotoColorEmoji.ttf پشتیبانی می‌شود، به جای NotoColorEmoji.ttf اصلی نمایش داده می‌شود. گوگل موارد زیر را توصیه می‌کند:

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

حذف گلیف‌ها: برای حذف گلیف‌ها از فایل NotoColorEmoji.ttf ، مراحل ۱ و ۲ را دنبال کنید و در cmap خود، glyph ID = 0 قرار دهید.

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

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

جایگزینی یا اصلاح سایر فایل‌های فونت

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

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

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

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

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

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

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

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

به تابع به‌روزرسانی برنامه‌تان، مجوز UPDATE_FONT signature|privileged بدهید.