SELinux নীতি তৈরি করুন

এই পৃষ্ঠায় SELinux পলিসি কীভাবে তৈরি হয় তা আলোচনা করা হয়েছে। SELinux পলিসি কোর AOSP পলিসি (প্ল্যাটফর্ম) এবং ডিভাইস-নির্দিষ্ট পলিসি (ভেন্ডর)-এর সমন্বয়ে গঠিত হয়। অ্যান্ড্রয়েড ৪.৪ থেকে অ্যান্ড্রয়েড ৭.০ পর্যন্ত SELinux পলিসি তৈরির প্রক্রিয়াটি সমস্ত sepolicy খণ্ডাংশকে একত্রিত করে রুট ডিরেক্টরিতে একক ফাইল তৈরি করত। এর ফলে, প্রতিবার পলিসি পরিবর্তনের সময় SoC ভেন্ডর এবং ODM নির্মাতাদের boot.img (নন-A/B ডিভাইসের জন্য) অথবা system.img (A/B ডিভাইসের জন্য) ফাইল পরিবর্তন করতে হতো।

অ্যান্ড্রয়েড ৮.০ এবং এর পরবর্তী সংস্করণগুলোতে প্ল্যাটফর্ম এবং ভেন্ডর পলিসি আলাদাভাবে তৈরি করা হয়। এসওসি (SoC) এবং ওইএম (OEM)-রা পলিসির নিজ নিজ অংশ আপডেট করতে পারে, তাদের নিজস্ব ইমেজ (যেমন vendor.img এবং boot.img ) তৈরি করতে পারে এবং তারপর প্ল্যাটফর্ম আপডেট থেকে স্বাধীনভাবে সেই ইমেজগুলো আপডেট করতে পারে।

তবে, যেহেতু মডিউলারাইজড SELinux পলিসি ফাইলগুলো /vendor পার্টিশনে সংরক্ষিত থাকে, তাই init প্রসেসকে অবশ্যই system এবং ভেন্ডর পার্টিশনগুলো আগে মাউন্ট করতে হয়, যাতে এটি ঐ পার্টিশনগুলো থেকে SELinux ফাইলগুলো পড়তে পারে এবং কার্নেলে লোড করার আগে সেগুলোকে system ডিরেক্টরিতে থাকা কোর SELinux ফাইলগুলোর সাথে মার্জ করতে পারে।

উৎস ফাইল

SELinux বিল্ড করার লজিক এই ফাইলগুলোতে রয়েছে:

  • external/selinux : বাহ্যিক SELinux প্রজেক্ট, যা SELinux পলিসি ও লেবেল কম্পাইল করার জন্য হোস্ট কমান্ড লাইন ইউটিলিটি তৈরি করতে ব্যবহৃত হয়।
    • external/selinux/libselinux : অ্যান্ড্রয়েড এক্সটার্নাল libselinux প্রজেক্টের শুধুমাত্র একটি উপসেট এবং কিছু অ্যান্ড্রয়েড-নির্দিষ্ট কাস্টমাইজেশন ব্যবহার করে। বিস্তারিত জানতে, external/selinux/README.android দেখুন।
    • external/selinux/libsepol :
      • chkcon : প্রদত্ত বাইনারি পলিসির (হোস্ট এক্সিকিউটেবল) জন্য একটি সিকিউরিটি কনটেক্সট বৈধ কিনা তা নির্ধারণ করে।
      • libsepol : বাইনারি নিরাপত্তা নীতিসমূহ পরিচালনা করার জন্য SELinux লাইব্রেরি (হোস্ট স্ট্যাটিক/শেয়ার্ড লাইব্রেরি, টার্গেট স্ট্যাটিক লাইব্রেরি)।
    • external/selinux/checkpolicy : SELinux পলিসি কম্পাইলার (হোস্ট এক্সিকিউটেবল: checkpolicy , checkmodule , এবং dispol )। এটি libsepol উপর নির্ভরশীল।
  • system/sepolicy : কোর অ্যান্ড্রয়েড SELinux পলিসি কনফিগারেশন, যার মধ্যে কনটেক্সট এবং পলিসি ফাইল অন্তর্ভুক্ত। প্রধান sepolicy বিল্ড লজিকও এখানে রয়েছে ( system/sepolicy/Android.mk )।

system/sepolicy তে থাকা ফাইলগুলো সম্পর্কে আরও বিস্তারিত জানতে, Key files দেখুন।

অ্যান্ড্রয়েড ৭.x এবং এর নিচের সংস্করণ

এই অংশে আলোচনা করা হয়েছে কিভাবে Android 7.x এবং এর পূর্ববর্তী সংস্করণগুলোতে SELinux পলিসি তৈরি করা হয়।

অ্যান্ড্রয়েড ৭.x এবং তার নিচের সংস্করণগুলোর জন্য বিল্ড প্রক্রিয়া

কোর AOSP পলিসির সাথে ডিভাইস-নির্দিষ্ট কাস্টমাইজেশন একত্রিত করে SELinux পলিসি তৈরি করা হয়। এরপর এই সম্মিলিত পলিসিটি পলিসি কম্পাইলার এবং বিভিন্ন চেকারের কাছে পাঠানো হয়। ডিভাইস-নির্দিষ্ট কাস্টমাইজেশন করা হয় ডিভাইস-নির্দিষ্ট Boardconfig.mk ফাইলে সংজ্ঞায়িত BOARD_SEPOLICY_DIRS ভেরিয়েবলের মাধ্যমে। এই গ্লোবাল বিল্ড ভেরিয়েবলটিতে ডিরেক্টরিগুলোর একটি তালিকা থাকে, যা অতিরিক্ত পলিসি ফাইলগুলো খোঁজার ক্রম নির্দিষ্ট করে দেয়।

উদাহরণস্বরূপ, একটি নির্দিষ্ট ডিভাইসের জন্য চূড়ান্ত SELinux কনফিগারেশন তৈরি করতে, একজন SoC ভেন্ডর এবং একজন ODM প্রত্যেকে একটি করে ডিরেক্টরি যোগ করতে পারে—একটি SoC-নির্দিষ্ট সেটিংসের জন্য এবং অন্যটি ডিভাইস-নির্দিষ্ট সেটিংসের জন্য:

  • BOARD_SEPOLICY_DIRS += device/ SoC /common/sepolicy
  • BOARD_SEPOLICY_DIRS += device/ SoC / DEVICE /sepolicy

ডিভাইসে file_contexts.bin ফাইলটি তৈরি করার জন্য system/sepolicy এবং BOARD_SEPOLICY_DIRS এ থাকা file_contexts ফাইলগুলোর বিষয়বস্তু একত্রিত করা হয়:

অ্যান্ড্রয়েড ৭.x এর জন্য SELinux বিল্ড লজিক

চিত্র ১. SELinux বিল্ড লজিক।

sepolicy ফাইলটি একাধিক উৎস ফাইল নিয়ে গঠিত:

  • security_classes , initial_sids , *.te ফাইল, genfs_contexts এবং port_contexts ক্রমানুসারে সংযুক্ত করে policy.conf প্লেইন টেক্সট ফাইলটি তৈরি করা হয়।
  • প্রতিটি ফাইলের (যেমন security_classes ) বিষয়বস্তু হলো system/sepolicy/ এবং BOARDS_SEPOLICY_DIRS অধীনে থাকা একই নামের ফাইলগুলোর সংযোগ।
  • policy.conf ফাইলটি সিনট্যাক্স যাচাইয়ের জন্য SELinux কম্পাইলারে পাঠানো হয় এবং ডিভাইসে sepolicy হিসেবে বাইনারি ফরম্যাটে কম্পাইল করা হয়।

    যে ফাইলসমূহ SELinux পলিসি ফাইল তৈরি করে  অ্যান্ড্রয়েড ৭.x এর জন্য
    চিত্র ২. SELinux পলিসি ফাইল।

SELinux ফাইল

কম্পাইল করার পর, 7.x এবং তার পূর্ববর্তী সংস্করণে চালিত অ্যান্ড্রয়েড ডিভাইসগুলিতে সাধারণত নিম্নলিখিত SELinux-সম্পর্কিত ফাইলগুলি থাকে:

  • selinux_version
  • sepolicy : পলিসি ফাইলগুলো (যেমন security_classes , initial_sids , এবং *.te ) একত্রিত করার পরের বাইনারি আউটপুট।
  • file_contexts
  • property_contexts
  • seapp_contexts
  • service_contexts
  • system/etc/mac_permissions.xml

আরও বিস্তারিত জানতে, Implement SELinux দেখুন।

SELinux প্রারম্ভিকীকরণ

সিস্টেম বুট আপ হওয়ার সময়, SELinux পারমিসিভ মোডে থাকে (এনফোর্সিং মোডে নয়)। init প্রসেসটি নিম্নলিখিত কাজগুলো সম্পাদন করে:

  • /sys/fs/selinux/load এর মাধ্যমে র‍্যামডিস্ক থেকে sepolicy ফাইলগুলো কার্নেলে লোড করা হয়।
  • SELinux-কে এনফোর্সিং মোডে পরিবর্তন করে।
  • SELinux ডোমেইন নিয়মটি নিজের উপর প্রয়োগ করার জন্য re-exec() চালানো হয়।

বুট টাইম কমানোর জন্য, যত তাড়াতাড়ি সম্ভব init প্রসেসের উপর re-exec() অপারেশনটি সম্পাদন করুন।

অ্যান্ড্রয়েড ৮.০ এবং উচ্চতর

অ্যান্ড্রয়েড ৮.০-তে, সামঞ্জস্যতা বজায় রেখে স্বাধীনভাবে প্ল্যাটফর্ম এবং ভেন্ডর পলিসি আপডেট করার সুযোগ দিতে SELinux পলিসিকে প্ল্যাটফর্ম এবং ভেন্ডর উপাদানে বিভক্ত করা হয়েছে।

ভেন্ডর পলিসি লেখকদের কাছে নির্দিষ্ট টাইপ ও অ্যাট্রিবিউট রপ্তানি করার জন্য প্ল্যাটফর্ম পলিসিকে আরও দুটি অংশে বিভক্ত করা হয়: প্ল্যাটফর্ম প্রাইভেট এবং প্ল্যাটফর্ম পাবলিক। একটি নির্দিষ্ট প্ল্যাটফর্ম সংস্করণের জন্য প্ল্যাটফর্ম পাবলিক টাইপ/অ্যাট্রিবিউটগুলো স্থিতিশীল এপিআই (API) হিসেবে বজায় রাখার নিশ্চয়তা দেওয়া হয়। প্ল্যাটফর্ম ম্যাপিং ফাইল ব্যবহার করে একাধিক সংস্করণের জন্য পূর্ববর্তী প্ল্যাটফর্ম পাবলিক টাইপ/অ্যাট্রিবিউটের সাথে সামঞ্জস্যতা নিশ্চিত করা যেতে পারে।

অ্যান্ড্রয়েড ৮.০ এর জন্য বিল্ড প্রক্রিয়া

অ্যান্ড্রয়েড ৮.০-এর SELinux পলিসি /system এবং /vendor এর অংশবিশেষ একত্রিত করে তৈরি করা হয়। এটি যথাযথভাবে সেট আপ করার লজিকটি /platform/system/sepolicy/Android.bp ফাইলে রয়েছে।

নীতিমালাটি নিম্নলিখিত স্থানগুলিতে বিদ্যমান:

অবস্থান ধারণ করে
system/sepolicy/public প্ল্যাটফর্ম সেপলিসি এপিআই
system/sepolicy/private প্ল্যাটফর্ম বাস্তবায়নের বিবরণ (বিক্রেতারা উপেক্ষা করতে পারেন)
system/sepolicy/vendor পলিসি এবং কনটেক্সট ফাইল যা ভেন্ডররা ব্যবহার করতে পারে (ভেন্ডররা উপেক্ষা করতে পারে)
BOARD_SEPOLICY_DIRS বিক্রেতার নীতি
BOARD_ODM_SEPOLICY_DIRS (অ্যান্ড্রয়েড ৯ এবং উচ্চতর সংস্করণ) ওডিএম সেপলিসি
SYSTEM_EXT_PUBLIC_SEPOLICY_DIRS (অ্যান্ড্রয়েড ১১ এবং উচ্চতর সংস্করণ) system_ext সেপলিসি এপিআই
SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS (অ্যান্ড্রয়েড ১১ এবং উচ্চতর সংস্করণ) system_ext বাস্তবায়নের বিবরণ (বিক্রেতারা উপেক্ষা করতে পারেন)
PRODUCT_PUBLIC_SEPOLICY_DIRS (অ্যান্ড্রয়েড ১১ এবং উচ্চতর সংস্করণ) পণ্য সেপলিসি এপিআই
PRODUCT_PRIVATE_SEPOLICY_DIRS (অ্যান্ড্রয়েড ১১ এবং উচ্চতর সংস্করণ) পণ্য বাস্তবায়নের বিবরণ (বিক্রেতারা উপেক্ষা করতে পারেন)

বিল্ড সিস্টেম এই পলিসিটি গ্রহণ করে এবং সংশ্লিষ্ট পার্টিশনে system , system_ext , product , vendor , এবং odm পলিসি কম্পোনেন্টগুলো তৈরি করে। এর ধাপগুলো হলো:

  1. পলিসিগুলোকে SELinux Common Intermediate Language (CIL) ফরম্যাটে রূপান্তর করুন, বিশেষত:
    • পাবলিক প্ল্যাটফর্ম নীতি ( system , system_ext , product )
    • সম্মিলিত ব্যক্তিগত ও সরকারি নীতি
    • জনসাধারণ, বিক্রেতা এবং BOARD_SEPOLICY_DIRS নীতি
  2. ভেন্ডর পলিসির অংশ হিসেবে জনসাধারণের দ্বারা প্রদত্ত পলিসিটির সংস্করণ তৈরি করুন। উৎপাদিত পাবলিক CIL পলিসিটি ব্যবহার করে সম্মিলিত পাবলিক ও ভেন্ডর এবং BOARD_SEPOLICY_DIRS পলিসিকে অবহিত করুন যে, এর কোন অংশগুলোকে প্ল্যাটফর্ম পলিসির সাথে সংযুক্ত অ্যাট্রিবিউটে পরিণত করতে হবে।
  3. প্ল্যাটফর্ম এবং ভেন্ডর অংশগুলোকে সংযুক্ত করে একটি ম্যাপিং ফাইল তৈরি করুন। প্রাথমিকভাবে, এটি শুধু পাবলিক পলিসির টাইপগুলোকে ভেন্ডর পলিসির সংশ্লিষ্ট অ্যাট্রিবিউটগুলোর সাথে সংযুক্ত করে; পরবর্তীতে এটি ভবিষ্যতের প্ল্যাটফর্ম সংস্করণগুলোতে রক্ষণাবেক্ষণ করা ফাইলের ভিত্তিও প্রদান করে, যা এই প্ল্যাটফর্ম সংস্করণকে লক্ষ্য করে তৈরি ভেন্ডর পলিসির সাথে সামঞ্জস্যতা সক্ষম করে।
  4. পলিসি ফাইলগুলো একত্রিত করুন (ডিভাইস-ভিত্তিক এবং প্রি-কম্পাইলড উভয় সমাধান বর্ণনা করুন)।
    1. ম্যাপিং, প্ল্যাটফর্ম এবং বিক্রেতা নীতি একত্রিত করুন।
    2. আউটপুট বাইনারি পলিসি ফাইল কম্পাইল করুন।

প্ল্যাটফর্ম জননীতি

প্ল্যাটফর্মের পাবলিক সেপলিসির মধ্যে system/sepolicy/public অধীনে সংজ্ঞায়িত সবকিছু অন্তর্ভুক্ত। প্ল্যাটফর্মটি ধরে নিতে পারে যে পাবলিক পলিসির অধীনে সংজ্ঞায়িত টাইপ এবং অ্যাট্রিবিউটগুলো একটি নির্দিষ্ট প্ল্যাটফর্ম সংস্করণের জন্য স্থিতিশীল এপিআই (API)। এটি সেপলিসির সেই অংশ গঠন করে যা প্ল্যাটফর্ম দ্বারা এক্সপোর্ট করা হয়, যার উপর ভিত্তি করে ভেন্ডর (অর্থাৎ, ডিভাইস) পলিসি ডেভেলপাররা অতিরিক্ত ডিভাইস-নির্দিষ্ট পলিসি লিখতে পারেন।

PLATFORM_SEPOLICY_VERSION বিল্ড ভেরিয়েবল দ্বারা সংজ্ঞায়িত, ভেন্ডর ফাইলগুলো যে পলিসির ভার্সনের উপর ভিত্তি করে লেখা হয়, সেই অনুযায়ী টাইপগুলোর ভার্সন নির্ধারণ করা হয়। এরপর ভার্সনযুক্ত পাবলিক পলিসিটি ভেন্ডর পলিসির সাথে এবং (এর মূল রূপে) প্ল্যাটফর্ম পলিসিতে অন্তর্ভুক্ত করা হয়। সুতরাং, চূড়ান্ত পলিসিতে প্রাইভেট প্ল্যাটফর্ম পলিসি, বর্তমান প্ল্যাটফর্মের পাবলিক পলিসি, ডিভাইস-নির্দিষ্ট পলিসি, এবং যে প্ল্যাটফর্ম ভার্সনের উপর ভিত্তি করে ডিভাইস পলিসিটি লেখা হয়েছিল, সেই ভার্সনযুক্ত পাবলিক পলিসি অন্তর্ভুক্ত থাকে।

প্ল্যাটফর্ম ব্যক্তিগত সেপলিসি

প্ল্যাটফর্ম প্রাইভেট সেপলিসির মধ্যে /system/sepolicy/private এর অধীনে সংজ্ঞায়িত সবকিছু অন্তর্ভুক্ত থাকে। পলিসির এই অংশটি প্ল্যাটফর্মের কার্যকারিতার জন্য প্রয়োজনীয় প্ল্যাটফর্ম-অনলি টাইপ, পারমিশন এবং অ্যাট্রিবিউট গঠন করে। এগুলো ভেন্ডর এবং ডিভাইস পলিসি লেখকদের কাছে এক্সপোর্ট করা হয় না। নন-প্ল্যাটফর্ম পলিসি লেখকদের অবশ্যই প্ল্যাটফর্ম প্রাইভেট সেপলিসিতে সংজ্ঞায়িত টাইপ, অ্যাট্রিবিউট এবং নিয়মের উপর ভিত্তি করে তাদের পলিসি এক্সটেনশন লেখা উচিত নয়। অধিকন্তু, এই নিয়মগুলো পরিবর্তন করার অনুমতি রয়েছে অথবা শুধুমাত্র ফ্রেমওয়ার্ক-ভিত্তিক আপডেটের অংশ হিসেবে এগুলো অদৃশ্য হয়ে যেতে পারে।

প্ল্যাটফর্ম ব্যক্তিগত ম্যাপিং

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

অ্যান্ড্রয়েড ১১ এবং উচ্চতর

এই অংশে আলোচনা করা হয়েছে কিভাবে অ্যান্ড্রয়েড ১১ এবং এর পরবর্তী সংস্করণগুলোতে SELinux পলিসি তৈরি করা হয়।

সিস্টেম_এক্সট এবং পণ্য সেপলিসি

অ্যান্ড্রয়েড ১১-এ system_ext পলিসি এবং product পলিসি যুক্ত করা হয়েছে। platform sepolicy-এর মতোই, system_ext পলিসি এবং product পলিসিকে public policy এবং private policy-তে বিভক্ত করা হয়েছে।

পাবলিক পলিসি ভেন্ডরের কাছে রপ্তানি করা হয়। টাইপ এবং অ্যাট্রিবিউটগুলো স্থিতিশীল এপিআই (API) হয়ে ওঠে, এবং ভেন্ডর পলিসি পাবলিক পলিসিতে থাকা টাইপ ও অ্যাট্রিবিউটগুলোকে রেফার করতে পারে। টাইপগুলোকে PLATFORM_SEPOLICY_VERSION অনুযায়ী ভার্সন করা হয়, এবং ভার্সনযুক্ত পলিসিটি ভেন্ডর পলিসিতে অন্তর্ভুক্ত করা হয়। মূল পলিসিটি system_ext এবং product পার্টিশনের প্রতিটিতে অন্তর্ভুক্ত থাকে।

প্রাইভেট পলিসিতে system_ext এবং product পার্টিশনের কার্যকারিতার জন্য প্রয়োজনীয় system_ext -only ও product -only টাইপ, পারমিশন এবং অ্যাট্রিবিউট অন্তর্ভুক্ত থাকে। প্রাইভেট পলিসি ভেন্ডরের কাছে অদৃশ্য থাকে, যার অর্থ হলো এই নিয়মগুলো অভ্যন্তরীণ এবং এগুলো পরিবর্তন করা যায়।

সিস্টেম_এক্সট এবং পণ্য ম্যাপিং

system_ext এবং product তাদের নির্ধারিত পাবলিক টাইপগুলো vendor-এ রপ্তানি করতে পারে। তবে, সামঞ্জস্যতা বজায় রাখার দায়িত্ব প্রত্যেক পার্টনারের। সামঞ্জস্যতার জন্য, পার্টনাররা তাদের নিজস্ব ম্যাপিং ফাইল সরবরাহ করতে পারে, যা পূর্ববর্তী ভার্সনগুলোর ভার্সনযুক্ত অ্যাট্রিবিউটগুলোকে বর্তমান পাবলিক সেপলিসিতে ব্যবহৃত কংক্রিট টাইপগুলোর সাথে ম্যাপ করে।

  • system_ext জন্য একটি ম্যাপিং ফাইল ইনস্টল করতে, কাঙ্ক্ষিত ম্যাপিং তথ্য সম্বলিত একটি CIL ফাইল {SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil এ রাখুন, এবং তারপর system_ext_{ver}.cil PRODUCT_PACKAGES এ যোগ করুন।
  • product জন্য একটি ম্যাপিং ফাইল ইনস্টল করতে, কাঙ্ক্ষিত ম্যাপিং তথ্য সম্বলিত একটি CIL ফাইল {PRODUCT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil এ রাখুন, এবং তারপরে product_{ver}.cil PRODUCT_PACKAGES এ যোগ করুন।

এমন একটি উদাহরণ দেখুন যা একটি রেডবুল ডিভাইসের product পার্টিশনের ম্যাপিং ফাইল যোগ করে।

প্রি-কম্পাইলড SELinux নীতি

init , SELinux চালু করার আগে, পার্টিশনগুলো ( system , system_ext , product , vendor এবং odm ) থেকে সমস্ত CIL ফাইল সংগ্রহ init এবং সেগুলোকে বাইনারি পলিসিতে কম্পাইল করে, যে ফরম্যাটটি কার্নেলে লোড করা যায়। যেহেতু কম্পাইলেশনে সময় লাগে (সাধারণত ১-২ সেকেন্ড), তাই CIL ফাইলগুলো বিল্ড টাইমে প্রি-কম্পাইল করে /vendor/etc/selinux/precompiled_sepolicy অথবা /odm/etc/selinux/precompiled_sepolicy তে রাখা হয়, সাথে ইনপুট CIL ফাইলগুলোর sha256 হ্যাশও থাকে। রানটাইমে, init হ্যাশগুলো তুলনা করে পরীক্ষা করে দেখে যে কোনো পলিসি ফাইল আপডেট হয়েছে কিনা। যদি কোনো পরিবর্তন না হয়ে থাকে, init প্রি-কম্পাইল করা পলিসিটি লোড করে। অন্যথায়, init তাৎক্ষণিকভাবে কম্পাইল করে এবং প্রি-কম্পাইল করা পলিসির পরিবর্তে সেটি ব্যবহার করে।

আরও নির্দিষ্টভাবে বললে, নিম্নলিখিত সমস্ত শর্ত পূরণ হলে প্রি-কম্পাইলড পলিসি ব্যবহৃত হয়। এখানে, {partition} সেই পার্টিশনকে বোঝায় যেখানে প্রি-কম্পাইলড পলিসিটি বিদ্যমান: হয় vendor অথবা odm

  • /system/etc/selinux/plat_sepolicy_and_mapping.sha256 এবং /{partition}/etc/selinux/precompiled_sepolicy.plat_sepolicy_and_mapping.sha256 উভয়ই বিদ্যমান এবং অভিন্ন।
  • /system_ext/etc/selinux/system_ext_sepolicy_and_mapping.sha256 এবং /{partition}/etc/selinux/precompiled_sepolicy.system_ext_sepolicy_and_mapping.sha256 উভয়ই বিদ্যমান নেই। অথবা উভয়ই বিদ্যমান এবং অভিন্ন।
  • /product/etc/selinux/product_sepolicy_and_mapping.sha256 এবং /{partition}/etc/selinux/precompiled_sepolicy.product_sepolicy_and_mapping.sha256 উভয়ই বিদ্যমান নেই। অথবা উভয়ই বিদ্যমান এবং অভিন্ন।

এগুলোর কোনোটি ভিন্ন হলে, init ডিভাইসের কম্পাইলেশন পাথে ফিরে যায়। আরও বিস্তারিত জানতে system/core/init/selinux.cpp দেখুন।