Android 12-এ bootconfig প্রয়োগ করা

Android 12-এ, bootconfig ফিচার Android 11 ও এর আগের যেকোনও ভার্সনে ব্যবহৃত androidboot.* কার্নেল cmdline বিকল্পকে প্রতিস্থাপন করে। bootconfig ফিচার হল এমন একটি মেকানিজম যার মাধ্যমে কনফিগারেশন সংক্রান্ত বিবরণ বিল্ড ও বুটলোডার থেকে Android 12-এ পাঠানো হয়।

এই ফিচার Android ইউজার-স্পেসের কনফিগারেশন প্যারামিটারকে কার্নেলের প্যারামিটার থেকে আলাদা করার উপায় প্রদান করে। bootconfig ফাইলে দীর্ঘ androidboot.* কার্নেল প্যারামিটার সরিয়ে নিলে, কার্নেল cmdline-এ জায়গা তৈরি হয় এবং ভবিষ্যতে আরও কিছু যোগ করার জন্য এটি উপলভ্য হয়।

কার্নেল ও Android ইউজার-স্পেস, দুটিতেই bootconfig কাজ করতে হবে।

  • এই সুবিধা আছে এমন প্রথম রিলিজ: Android 12
  • প্রথম কার্নেল ভার্সন যাতে এই সাপোর্ট আছে: 12-5.4.xx কার্নেল

12-5.10.xx কার্নেল ভার্সন সহ লঞ্চ করা নতুন ডিভাইসের জন্য bootconfig ফিচার প্রয়োগ করুন। আপনি ডিভাইস আপগ্রেড করলে এটি প্রয়োগ করার প্রয়োজন নেই।

উদাহরণ ও সোর্স

এই বিভাগে উদাহরণ ও সোর্স কোড দেখার সময় মনে রাখবেন যে bootconfig কোডের ফর্ম্যাট Android 11 ও তার আগের ভার্সনে ব্যবহৃত কার্নেল cmdline-এর ফর্ম্যাটের থেকে সামান্যই আলাদা। তবে, আপনার ব্যবহারের জন্য নিম্নলিখিত পার্থক্যটি গুরুত্বপূর্ণ:

  • প্যারামিটারগুলিকে নিউলাইন এস্কেপ সিকোয়েন্স \n দিয়ে আলাদা করতে হবে, স্পেস দিয়ে নয়।

বুটলোডারের উদাহরণ

বুটলোডার সংক্রান্ত উদাহরণের জন্য, Cuttlefish U-boot রেফারেন্স বুটলোডার ইমপ্লিমেন্টেশন দেখুন। রেফারেন্সে থাকা দুটি কমিট নিচে তালিকাভুক্ত করা হল। প্রথম আপরেভ লেটেস্ট ভার্সনে বুট হেডার ভার্সন সাপোর্ট করে। উদাহরণে, প্রথম কমিট ভার্সন সাপোর্টকে আপডেট (বা আপরেভ) করে পরবর্তী ভার্সন, v4-এ নিয়ে যায়। দ্বিতীয় দুটি কাজ করে; এটি bootconfig হ্যান্ডলিং যোগ করে এবং রানটাইমে প্যারামিটার যোগ করার প্রক্রিয়া দেখায়:

বিল্ডের উদাহরণ

ভেন্ডর বুট হেডার v4 সহ mkbootimg বিল্ড করার জন্য পরিবর্তনvendor_boot.img দেখায় এমন বিল্ডের উদাহরণ পেতে, mkbootimg changes for bootconfig দেখুন। নিম্নলিখিত কাজগুলি করতে Cuttlefish-এ হওয়া পরিবর্তনগুলি দেখুন:

প্রয়োগ

পার্টনারদের অবশ্যই তাদের বুটলোডারকে সহায়তা করতে হবে এবং তাদের বিল্ড-টাইম androidboot.* প্যারামিটারগুলি কার্নেল cmdline থেকে বুটকনফিগার ফাইলে সরাতে হবে। এই পরিবর্তন প্রয়োগ করার সবচেয়ে ভালো উপায় হল, তা ধাপে ধাপে করা; ধাপে ধাপে প্রসেস অনুসরণ করা সংক্রান্ত তথ্যের জন্য ধাপে ধাপে প্রয়োগ ও যাচাইকরণ বিভাগটি দেখুন।

আপনার কাছে এমন পরিবর্তন থাকলে যা androidboot.* প্যারামিটারের জন্য /proc/cmdline ফাইল সার্চ করে, সেগুলিকে পরিবর্তে /proc/bootconfig ফাইলে পয়েন্ট করুন। ro.boot.* প্রপার্টি নতুন bootconfig ভ্যালুর সাথে সেট করা হয়েছে, তাই সেইসব প্রপার্টি ব্যবহার করে কোডের জন্য আপনাকে পরিবর্তন করতে হবে না।

পরিবর্তনগুলি তৈরি করুন

প্রথমে, আপনার বুট হেডার ভার্সন আপগ্রেড করে ভার্সন ৪-এ নিয়ে যান:

- BOARD_BOOT_HEADER_VERSION := 3

+ BOARD_BOOT_HEADER_VERSION := 4

bootconfig kernel cmdline প্যারামিটার যোগ করুন। এর ফলে কার্নেল bootconfig বিভাগটি খোঁজে:

BOARD_KERNEL_CMDLINE += bootconfig

bootconfig প্যারামিটারগুলি BOARD_BOOTCONFIG ভেরিয়েবলের প্যারামিটার থেকে তৈরি করা হয়, অনেকটা যেভাবে কার্নেল cmdline BOARD\_KERNEL\_CMDLINE থেকে তৈরি করা হয়।

যেকোনও androidboot.* প্যারামিটার যেমন আছে তেমন সরানো যেতে পারে, নিম্নলিখিত উদাহরণের মতো:

- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing

+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing

বুটলোডারে পরিবর্তন

কার্নেলে যাওয়ার আগে বুটলোডার initramfs সেট-আপ করে। কার্নেল বুট কনফিগারেশন বুটকনফিগ বিভাগ সার্চ করে এবং এটি initramfs,-এর একেবারে শেষে আছে কিনা তা দেখে নেয়, সাথে প্রত্যাশিত ট্রেলারও আছে কিনা তা দেখে নেয়।

বুটল লোডার, ভেন্ডর বুট ইমেজ হেডার থেকে vendor_boot.img লেআউট সংক্রান্ত তথ্য পায়।

bootconfig মেমরি অ্যালোকেশন লেআউটের ডায়াগ্রাম

ছবি ১. Android 12 bootconfig মেমরি অ্যালোকেশন

মেমরিতে বুটলোডার বুটকনফিগার বিভাগ তৈরি করে। bootconfig বিভাগে নিম্নলিখিত বিষয়গুলির জন্য মেমরি অ্যালোকেশন থাকে:

  • প্যারামিটার
  • ৪ বি সাইজ parameters size
  • ৪ বি সাইজ parameters checksum
  • ১২ বাইট bootconfig ম্যাজিক স্ট্রিং (#BOOTCONFIG\n)

প্যারামিটার দুটি সোর্স থেকে আসে: বিল্ড করার সময় জানা প্যারামিটার এবং বিল্ড করার সময় জানা যায় না এমন প্যারামিটার। অজানা প্যারামিটার যোগ করতে হবে।

বিল্ড টাইমে পরিচিত প্যারামিটারগুলি বুটকনফিগারেশন বিভাগের vendor_boot ইমেজের শেষে প্যাকেজ করা হয়। সেকশনের সাইজ ভেন্ডর বুট হেডার ফিল্ডে vendor_bootconfig_size (বাইট হিসেবে) স্টোর করা থাকে।

বিল্ড টাইমে যেসব প্যারামিটার জানা যায় না সেগুলি শুধু রানটাইমে বুটলোডারেই জানা যায়। bootconfig ট্রেলার প্রয়োগ করার আগে এগুলি bootconfig প্যারামিটার বিভাগের শেষে যোগ করতে হবে।

bootconfig ট্রেলার প্রয়োগ করার পরে কোনও প্যারামিটার যোগ করতে হলে, ট্রেলারটি ওভাররাইট করে আবার প্রয়োগ করুন।

ইনক্রিমেন্টাল ইমপ্লিমেন্টেশন ও যাচাইকরণ

এই বিভাগে দেওয়া প্রসেস অনুসরণ করে bootconfig ফিচার ইনক্রিমেন্টাল হিসেবে প্রয়োগ করুন। bootconfig প্যারামিটার যোগ করার সময় কার্নেল cmdline প্যারামিটার অপরিবর্তিত রাখুন।

যাচাইকরণ সহ ইনক্রিমেন্টাল প্রয়োগের জন্য এইসব ধাপ অনুসরণ করুন:

  1. বুটলোডার ও বিল্ডে পরিবর্তন করুন, তারপর নিম্নলিখিত কাজগুলি করুন:
    1. নতুন bootconfig প্যারামিটার যোগ করতে BOARD_BOOTCONFIG ভেরিয়েবল ব্যবহার করুন।
    2. কার্নেল cmdline প্যারামিটারগুলি যেমন আছে তেমনই রাখুন, যাতে ডিভাইসটি সঠিকভাবে বুট করা চালিয়ে যেতে পারে। এর ফলে ডিবাগিং ও যাচাইকরণ অনেক সহজ হয়ে যায়।
  2. /proc/bootconfig-এর কন্টেন্ট চেক করে আপনার কাজ যাচাই করুন। ডিভাইস বুট করার পরে নতুন যোগ করা প্যারামিটার দেখতে পাচ্ছেন কিনা তা যাচাই করুন।
  3. BOARD_BOOTCONFIG ভেরিয়েবল ও বুটলোডার ব্যবহার করে, কার্নেল cmdline থেকে androidboot.* প্যারামিটারকে bootconfig-এ সরান।
  4. /proc/bootconfig-এ প্রতিটি প্যারামিটার আছে কিনা এবং সেগুলি /proc/cmdline-এ নেই কিনা তা যাচাই করুন। আপনি এটি যাচাই করতে পারলে, আপনার প্রয়োগ সফল হয়েছে।

OTA আপগ্রেড ও ডাউনগ্রেড করার সময় যেসব বিষয় বিবেচনা করতে হবে

Android-এর বিভিন্ন ভার্সন বা কার্নেলের বিভিন্ন ভার্সনের মধ্যে OTA আপগ্রেড ও ডাউনগ্রেড ম্যানেজ করার সময় বিশেষ সতর্কতা অবলম্বন করা উচিত।

Android 12 হল প্রথম ভার্সন যা bootconfig সাপোর্ট করে। এর আগের কোনও ভার্সনে ডাউনগ্রেড করলে, bootconfig-এর পরিবর্তে kernel cmdline প্যারামিটার ব্যবহার করতে হবে।

কার্নেল ভার্সন 12-5.4 এবং তার পরবর্তী ভার্সনে bootconfig কাজ করে। এর আগের যেকোনও ভার্সনে(11-5.4 সহ) ডাউনগ্রেড করলে, কার্নেল cmdline প্যারামিটার অবশ্যই ব্যবহার করতে হবে।

Android 11 ও তার আগের যেকোনও ভার্সন থেকে Android 12 ও তার পরের যেকোনও ভার্সনে আপগ্রেড করলে কার্নেল কমান্ড লাইন প্যারামিটার ব্যবহার করা চালিয়ে যাওয়া যাবে। কার্নেল ভার্সন আপগ্রেড করার ক্ষেত্রেও একই পদ্ধতি অনুসরণ করতে হবে।

সমস্যার সমাধান

যাচাই করার ধাপটি সম্পূর্ণ করার সময়, /proc/bootconfig-এ প্রত্যাশিত প্যারামিটার দেখতে না পেলে logcat-এ কার্নেল লগ চেক করুন। কার্নেল কাজ করলে, বুটকনফিগের জন্য সবসময় একটি লগ এন্ট্রি থাকে।

লগ আউটপুটের উদাহরণ

$ adb logcat | grep bootconfig
02-24 17:00:07.610     0     0 I Load bootconfig: 128 bytes 9 nodes

আপনি যদি কোনও সমস্যা লগ দেখতে পান, তাহলে bootconfig লোড করতে কোনও সমস্যা হয়েছে। বিভিন্ন ধরনের সমস্যা দেখতে, init/main.c দেখুন।