কাস্টম ফন্ট বাস্তবায়ন

অ্যান্ড্রয়েড ১৫ থেকে, ভ্যারিয়েবল ফন্টগুলো রানটাইমে আরও ভালো দক্ষতা ও সূক্ষ্মতার সাথে রেন্ডার করা হয়। এই আপডেটের ফলে, ভেন্ডরদের অবশ্যই fonts.xml এর পরিবর্তে font_fallback.xml এ নতুন ভ্যারিয়েবল ফন্ট কনফিগারেশন যোগ করতে হবে, কারণ fonts.xml ফাইলটি এখন আর ব্যবহার করা হয় না। আরও তথ্যের জন্য ‘Support for variable fonts’ দেখুন।

অ্যান্ড্রয়েড ১১ এবং এর নিচের সংস্করণগুলোতে, AOSP-তে ( /system/fonts পার্টিশনে) অথবা ভেন্ডর পার্টিশনে ( /product/fonts বা /system/fonts পার্টিশনে) ডিভাইসে ইনস্টল করা ফন্ট ফাইল আপডেট করার জন্য OEM-এর একটি সিস্টেম আপডেটের প্রয়োজন হয়। এই প্রয়োজনীয়তা ইমোজি সামঞ্জস্যের উপর একটি উল্লেখযোগ্য প্রভাব ফেলে। অ্যান্ড্রয়েড ১২-এ আপনি FontManager সিস্টেম সার্ভিসটি ব্যবহার করে ইনস্টল করা ফন্ট ফাইলগুলো পরিচালনা করতে এবং কোনো সিস্টেম আপডেট ছাড়াই ডিভাইসে ইনস্টল করা ফন্ট ফাইলগুলো আপডেট করতে পারবেন।

অ্যান্ড্রয়েড ১২-এ তিনটি প্রসেস ইন্টারঅ্যাকশন রয়েছে; FontManagerService , Font Updater এবং Application

FontManagerService হলো সিস্টেম সার্ভারের কেন্দ্রীয় ব্যবস্থাপনা সিস্টেম। FontManagerService ব্যবহারকারী-ভিত্তিক সর্বশেষ সিস্টেম ফন্ট সেটিংস সংরক্ষণ করে।

FontUpdater হলো একটি প্লাগেবল ফন্ট আপডেটার যা একটি signature|privileged পারমিশন চেকের মাধ্যমে বিশ্বস্ত হিসেবে স্বীকৃত। বর্তমান সিস্টেম ফন্ট সেটিংস পেতে, ইনস্টল করতে, সরাতে বা আপডেট করতে FontUpdater FontManagerService সাথে যোগাযোগ করে। FontUpdater আন্তঃপ্রক্রিয়া যোগাযোগ (IPC) পদ্ধতির মাধ্যমে নতুন ফন্ট ফাইলের বিষয়বস্তু পাঠাতে পারে। FontManagerService এই বিষয়বস্তু একটি বিশ্ব-পাঠযোগ্য স্টোরেজ লোকেশনে, যেমন /data/fonts ফাইলে, সংরক্ষণ করে। এই স্টোরেজটি সুরক্ষিত। SELinux পলিসি অনুযায়ী, শুধুমাত্র FontManagerService ই এটিতে লিখতে পারে।

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 অ্যাট্রিবিউটটি নির্দিষ্ট করা থাকে, তাহলে সিস্টেম রানটাইমে প্রদত্ত ওয়েট এবং স্টাইল মানের জন্য ডায়নামিকভাবে একটি ফন্ট ইনস্ট্যান্স তৈরি করে।

ডেভেলপাররা সিস্টেমে ইনস্টল করা ফন্ট ফাইলগুলির একটি তালিকা পেতে android.graphics.fonts.SystemFonts#getAvailableFonts জাভা এপিআই অথবা ASystemFontIterator_open এনডিকে এপিআই ব্যবহার করতে পারেন। এই আপডেট সমর্থনকারী ডেভেলপার এপিআইগুলির তথ্যের জন্য, Improved OpenType Variable Font API এবং buildVariableFamily দেখুন।

ফন্ট কাস্টমাইজ করুন

কিছু OEM তাদের ব্র্যান্ড দেখানোর জন্য AOSP-তে ফন্ট ফাইল ইনস্টল বা প্রতিস্থাপন করে। অ্যান্ড্রয়েড ১২ এই কার্যকারিতা সমর্থন করে, তবে ডিভাইসগুলিতে ইমোজি ফন্ট আপডেট রাখার জন্য কিছু শর্ত যোগ করে। যেসব OEM ইমোজি ফন্ট ফাইল পরিবর্তন বা আপডেট করে না, তাদের এই ফিচারটি ব্যবহার করার প্রয়োজন নেই।

গুগল জিএমএস কোর (GMS Core)-এর মাধ্যমে ফন্ট ফাইলগুলো, বিশেষ করে NotoColorEmoji ফাইলগুলো আপডেট করে, তাই /system পার্টিশন থেকে NotoColorEmoji.ttf ফাইলটি পরিবর্তন বা অপসারণ করবেন না এবং /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 (এবং Android 15 ও তার পরবর্তী সংস্করণগুলোতে /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 ফাইলের আগে রাখুন।

ধাপ ২ সম্পন্ন করার পর, মূল NotoColorEmoji.ttf এর পরিবর্তে Modified\NotoColorEmoji.ttf দ্বারা সমর্থিত পরিবর্তিত গ্লিফটি প্রদর্শিত হবে। গুগল নিম্নলিখিত পরামর্শ দেয়:

  • এই ফন্টে শুধু প্রয়োজনীয় গ্লিফটি রাখুন।
  • অপরিবর্তিত গ্লিফগুলিকে মূল NotoColorEmoji.ttf ফাইলে অর্পণ করুন, যাতে ভবিষ্যতের ইমোজি রিলিজগুলিতে করা যেকোনো ডিজাইন সংশোধন আপনার ডিভাইসগুলি পেয়ে যায়।

গ্লিফ অপসারণ: NotoColorEmoji.ttf ফাইল থেকে গ্লিফ অপসারণ করতে, ধাপ ১ এবং ২ অনুসরণ করুন, এবং আপনার cmap-এ glyph ID = 0 নির্দিষ্ট করুন।

আঞ্চলিক পতাকা ব্যবহার করুন: যদি লক্ষ্য গ্লিফটি একটি আঞ্চলিক পতাকা হয়, তাহলে গ্লিফ আইডিটি একটি অজানা দেশের কোড হিসাবে উল্লেখ করুন। ( country code = "ZZ" ব্যবহার করুন।)

একটি টোফু গ্লিফ তৈরি করুন: আপনি যদি একটি টোফু গ্লিফ ব্যবহার করতে চান, তবে আপনি স্পষ্টভাবে একটি টোফু গ্লিফ আইডি উল্লেখ করতে পারেন। যখন আপনি glyphID = 0 উল্লেখ করেন, তখন সংশ্লিষ্ট অ্যাপটি এটিকে “গ্লিফটি উপলব্ধ নয়” হিসেবে ব্যাখ্যা করে। উদাহরণস্বরূপ, যখন আপনি এই অ্যাট্রিবিউটটি ব্যবহার করেন, তখন Paint#hasGlyph অ্যাপটি false রিটার্ন করে।

অন্যান্য ফন্ট ফাইলগুলি প্রতিস্থাপন বা পরিবর্তন করুন

অন্যান্য ফন্ট প্রতিস্থাপন বা পরিবর্তন করার জন্য, কাস্টমাইজেশন পদ্ধতিটি স্থানীয় বাজারের চাহিদা অনুযায়ী TTF ফাইল পরিবর্তন করার পদ্ধতির মতোই। রানটাইমে AOSP-তে আপডেট হওয়া অজানা ফন্ট ফাইলগুলিকে উপেক্ষা করা হয় এবং সেগুলি আপডেট করা হয় না। গুগল আপনার ডিভাইসের অজানা ফন্টগুলিকে উপেক্ষা করে। এর মধ্যে সেইসব ফন্ট ফাইলও অন্তর্ভুক্ত, যেগুলি AOSP-তে মূল ফন্ট থেকে পরিবর্তন করা হয়েছিল।

যদিও GMS Core-এ ফন্ট আপডেট Google করে থাকে, সাধারণ ফন্ট আপডেট প্রক্রিয়াটি সকল OEM-এর জন্য উন্মুক্ত। OEM-রা ‘পূর্বশর্ত পূরণ’ , ‘ফন্ট ফাইল স্বাক্ষর করা’ , এবং ‘রানটাইম ফন্ট আপডেট করা’- তে বর্ণিত ধাপগুলো অনুসরণ করে অতিরিক্ত ফন্ট আপডেটার ইনস্টল করতে পারে।

পূর্বশর্ত পূরণ করুন

ফন্ট আপডেট প্রক্রিয়াটি fs-verity লিনাক্স কার্নেল বৈশিষ্ট্য ব্যবহার করে। আপনার ডিভাইসটি fs-verity অনুবর্তী কিনা তা যাচাই করুন এবং আপনার ডিভাইসে সার্টিফিকেটটি অন্তর্ভুক্ত করুন।

সাইন ফন্ট ফাইল

যেহেতু ফন্ট ফাইলগুলো ঝুঁকিপূর্ণ রিসোর্স, তাই এগুলো অবশ্যই বিশ্বস্ত কী (key) দিয়ে যাচাই করতে হবে। আপডেট করা হবে এমন সমস্ত ফন্ট ফাইল সাবধানে পর্যালোচনা করুন এবং আপনার প্রাইভেট কী দিয়ে স্বাক্ষর করুন। স্বাক্ষরটি অবশ্যই fs-verity সামঞ্জস্যপূর্ণ হতে হবে।

রানটাইম ফন্ট আপডেট করুন

FontManager সিস্টেম অ্যাপটি ফন্ট আপডেট করে। FontManager অ্যাপটি ইনস্টল করা সর্বশেষ সিস্টেম ফন্টের অবস্থা জানায় এবং সিগনেচারসহ ফন্ট ফাইল আপডেট করার সুবিধা প্রদান করে। আপডেট অ্যাপ কল করতে, আপনার অ্যাপের allowlist- এ এবং আপনার manifest-এ UPDATE_FONT signature|privileged পারমিশনটি যোগ করুন।

আপনার অ্যাপের আপডেটার ফাংশনে UPDATE_FONT signature|privileged পারমিশন প্রদান করুন।