কার্নেল তৈরি করুন

এই পৃষ্ঠায় অ্যান্ড্রয়েড ডিভাইসের জন্য কাস্টম কার্নেল তৈরির প্রক্রিয়া বিস্তারিতভাবে বর্ণনা করা হয়েছে। এই নির্দেশাবলী আপনাকে সঠিক সোর্স নির্বাচন, কার্নেল বিল্ড করা এবং অ্যান্ড্রয়েড ওপেন সোর্স প্রজেক্ট (AOSP) থেকে তৈরি একটি সিস্টেম ইমেজে এর ফলাফল অন্তর্ভুক্ত করার প্রক্রিয়ায় পথ দেখাবে।

সোর্স এবং বিল্ড টুল ডাউনলোড করুন

সাম্প্রতিক কার্নেলগুলোর জন্য, সোর্স, টুলচেইন এবং বিল্ড স্ক্রিপ্ট ডাউনলোড করতে repo ব্যবহার করুন। কিছু কার্নেলের (যেমন, পিক্সেল ৩ কার্নেল) জন্য একাধিক গিট রিপোজিটরি থেকে সোর্সের প্রয়োজন হয়, আবার অন্যগুলোর (যেমন, সাধারণ কার্নেল) জন্য শুধুমাত্র একটি সোর্সই যথেষ্ট। repo পদ্ধতি ব্যবহার করলে সোর্স ডিরেক্টরির সঠিক সেটআপ নিশ্চিত হয়।

উপযুক্ত শাখার সোর্সগুলো ডাউনলোড করুন:

mkdir android-kernel && cd android-kernel
repo init -u https://android.googlesource.com/kernel/manifest -b BRANCH
repo sync

পূর্ববর্তী `repo init` কমান্ডের সাথে ব্যবহারযোগ্য রিপো ব্রাঞ্চগুলির ( BRANCH ) তালিকার জন্য, কার্নেল ব্রাঞ্চ এবং তাদের বিল্ড সিস্টেম দেখুন।

পিক্সেল ডিভাইসের জন্য কার্নেল ডাউনলোড ও কম্পাইল করার বিস্তারিত তথ্যের জন্য, “বিল্ডিং পিক্সেল কার্নেলস” দেখুন।

কার্নেল তৈরি করুন

বেজেল (ক্লিফ) দিয়ে তৈরি করুন

অ্যান্ড্রয়েড ১৩-এ বেজেল (Bazel) ব্যবহার করে কার্নেল বিল্ড করার পদ্ধতি চালু করা হয়েছে।

aarch64 আর্কিটেকচারের জন্য GKI কার্নেলের একটি ডিস্ট্রিবিউশন তৈরি করতে, Android 13-এর আগের নয় এমন একটি Android Common Kernel ব্রাঞ্চ চেক আউট করুন এবং তারপর নিম্নলিখিত কমান্ডটি চালান:

tools/bazel run //common:kernel_aarch64_dist [-- --destdir=$DIST_DIR]

এরপরে কার্নেল বাইনারি, মডিউল এবং সংশ্লিষ্ট ইমেজগুলো $DIST_DIR ডিরেক্টরিতে অবস্থিত থাকে। যদি --destdir নির্দিষ্ট না করা হয়, তাহলে আর্টিফ্যাক্টগুলোর অবস্থান জানতে কমান্ডের আউটপুট দেখুন। বিস্তারিত তথ্যের জন্য, AOSP-এর ডকুমেন্টেশন দেখুন।

build.sh (পুরানো সংস্করণ) দিয়ে বিল্ড করুন

Android 12 বা তার নিচের সংস্করণের ব্রাঞ্চগুলোর জন্য, অথবা Kleaf বিহীন ব্রাঞ্চগুলোর জন্য:

build/build.sh

কার্নেল বাইনারি, মডিউল এবং সংশ্লিষ্ট ইমেজ out/ BRANCH /dist ডিরেক্টরিতে অবস্থিত।

ভার্চুয়াল ডিভাইসের জন্য ভেন্ডর মডিউলগুলো তৈরি করুন

অ্যান্ড্রয়েড ১৩-এ build.sh পরিবর্তে Bazel (Kleaf) দিয়ে কার্নেল বিল্ড করার পদ্ধতি চালু করা হয়েছে।

virtual_device এর মডিউলগুলোর জন্য একটি ডিস্ট্রিবিউশন তৈরি করতে, চালান:

tools/bazel run //common-modules/virtual-device:virtual_device_x86_64_dist [-- --destdir=$DIST_DIR]

Bazel ব্যবহার করে অ্যান্ড্রয়েড কার্নেল তৈরি করার বিষয়ে আরও বিস্তারিত জানতে, দেখুন: Kleaf - Building Android Kernels with Bazel

স্বতন্ত্র আর্কিটেকচারগুলোর জন্য Kleaf সমর্থনের বিশদ বিবরণের জন্য, ডিভাইস এবং কার্নেলগুলোর জন্য Kleaf সমর্থন দেখুন।

build.sh (legacy) ব্যবহার করে ভার্চুয়াল ডিভাইসের জন্য ভেন্ডর মডিউলগুলি তৈরি করুন।

অ্যান্ড্রয়েড ১২-এ কাটলফিশ এবং গোল্ডফিশ একত্রিত হয়েছে, তাই তারা একই কার্নেল ( virtual_device ) ব্যবহার করে। সেই কার্নেলের মডিউলগুলো বিল্ড করতে, এই বিল্ড কনফিগারেশনটি ব্যবহার করুন:

BUILD_CONFIG=common-modules/virtual-device/build.config.virtual_device.x86_64 build/build.sh

অ্যান্ড্রয়েড ১১-এ GKI চালু করা হয়েছে, যা কার্নেলকে দুটি অংশে বিভক্ত করে: একটি গুগল-পরিচালিত কার্নেল ইমেজ এবং অন্যটি ভেন্ডর-পরিচালিত মডিউল, যেগুলো আলাদাভাবে বিল্ড করা হয়।

এই উদাহরণটি একটি কার্নেল ইমেজ কনফিগারেশন দেখায়:

BUILD_CONFIG=common/build.config.gki.x86_64 build/build.sh

এই উদাহরণটি একটি মডিউল কনফিগারেশন দেখায় (কাটলফিশ এবং এমুলেটর):

BUILD_CONFIG=common-modules/virtual-device/build.config.cuttlefish.x86_64 build/build.sh

কার্নেল চালান

নিজস্বভাবে তৈরি কার্নেল চালানোর একাধিক উপায় রয়েছে। নিচে বিভিন্ন উন্নয়ন পরিস্থিতির জন্য উপযুক্ত কিছু পরিচিত উপায় উল্লেখ করা হলো।

অ্যান্ড্রয়েড ইমেজ বিল্ডে এম্বেড করুন

Image.lz4-dtb AOSP ট্রি-এর মধ্যে সংশ্লিষ্ট কার্নেল বাইনারি অবস্থানে কপি করুন এবং বুট ইমেজটি রি-বিল্ড করুন।

বিকল্পভাবে, make bootimage (অথবা বুট ইমেজ তৈরি করে এমন অন্য যেকোনো make কমান্ড লাইন) ব্যবহার করার সময় TARGET_PREBUILT_KERNEL ভেরিয়েবলটি সংজ্ঞায়িত করুন। এই ভেরিয়েবলটি সমস্ত ডিভাইস দ্বারা সমর্থিত, কারণ এটি device/common/populate-new-device.sh এর মাধ্যমে সেট আপ করা হয়। উদাহরণস্বরূপ:

export TARGET_PREBUILT_KERNEL=DIST_DIR/Image.lz4-dtb

ফাস্টবুট দিয়ে কার্নেল ফ্ল্যাশ এবং বুট করুন

অধিকাংশ আধুনিক ডিভাইসে বুট ইমেজ তৈরি ও বুট করার প্রক্রিয়াকে সহজ করার জন্য একটি বুটলোডার এক্সটেনশন থাকে।

ফ্ল্যাশ না করে কার্নেল বুট করতে:

adb reboot bootloader
fastboot boot Image.lz4-dtb

এই পদ্ধতি ব্যবহার করলে কার্নেল আসলে ফ্ল্যাশ হয় না এবং রিবুটের পর তা স্থায়ী থাকে না।

কাটলফিশে কার্নেল চালান

আপনি কাটলফিশ ডিভাইসগুলোতে আপনার পছন্দের আর্কিটেকচারের কার্নেল চালাতে পারেন।

একটি নির্দিষ্ট কার্নেল আর্টিফ্যাক্ট সেট দিয়ে কোনো কাটলফিশ ডিভাইস বুট করতে, টার্গেট কার্নেল আর্টিফ্যাক্টগুলোকে প্যারামিটার হিসেবে দিয়ে cvd create কমান্ডটি চালান। নিচের উদাহরণ কমান্ডটি common-android14-6.1 কার্নেল ম্যানিফেস্ট থেকে arm64 টার্গেটের জন্য কার্নেল আর্টিফ্যাক্ট ব্যবহার করে।

cvd create \
    -kernel_path=/$PATH/$TO/common-android14-6.1/out/android14-6.1/dist/Image \
    -initramfs_path=/$PATH/$TO/common-android14-6.1/out/android14-6.1/dist/initramfs.img

আরও তথ্যের জন্য, কাটলফিশে কার্নেল তৈরি করুন দেখুন।

কার্নেল বিল্ড কাস্টমাইজ করুন

Kleaf বিল্ডের জন্য কার্নেল বিল্ডগুলো কাস্টমাইজ করতে, Kleaf ডকুমেন্টেশন দেখুন।

build.sh (legacy) ব্যবহার করে কার্নেল বিল্ড কাস্টমাইজ করুন।

build/build.sh ক্ষেত্রে, বিল্ড প্রক্রিয়া এবং এর ফলাফল এনভায়রনমেন্ট ভেরিয়েবল দ্বারা প্রভাবিত হতে পারে। এগুলোর বেশিরভাগই ঐচ্ছিক এবং প্রতিটি কার্নেল ব্রাঞ্চের সাথে একটি যথাযথ ডিফল্ট কনফিগারেশন থাকা উচিত। সবচেয়ে বেশি ব্যবহৃত ভেরিয়েবলগুলো এখানে তালিকাভুক্ত করা হলো। একটি সম্পূর্ণ (এবং হালনাগাদ) তালিকার জন্য build/build.sh দেখুন।

পরিবেশগত পরিবর্তনশীল বর্ণনা উদাহরণ
BUILD_CONFIG বিল্ড কনফিগারেশন ফাইল, যেখান থেকে আপনি বিল্ড এনভায়রনমেন্ট শুরু করেন। এর অবস্থান অবশ্যই রিপো রুট ডিরেক্টরির সাপেক্ষে নির্ধারণ করতে হবে। ডিফল্ট হিসেবে এটি build.config থাকে।
সাধারণ শস্যদানার জন্য বাধ্যতামূলক।
BUILD_CONFIG=common/build.config.gki.aarch64
CC ব্যবহৃতব্য কম্পাইলার পরিবর্তন করুন। এটি build.config দ্বারা সংজ্ঞায়িত ডিফল্ট কম্পাইলারে ফিরে যায়। CC=clang
DIST_DIR কার্নেল ডিস্ট্রিবিউশনের জন্য মূল আউটপুট ডিরেক্টরি। DIST_DIR=/path/to/my/dist
OUT_DIR কার্নেল বিল্ডের জন্য মূল আউটপুট ডিরেক্টরি। OUT_DIR=/path/to/my/out
SKIP_DEFCONFIG make defconfig এড়িয়ে যান SKIP_DEFCONFIG=1
SKIP_MRPROPER স্কিপ make mrproper SKIP_MRPROPER=1

স্থানীয় বিল্ডের জন্য কাস্টম কার্নেল কনফিগারেশন

অ্যান্ড্রয়েড ১৪ এবং তার পরবর্তী সংস্করণগুলিতে, আপনি কার্নেল কনফিগারেশন কাস্টমাইজ করতে defconfig fragments ব্যবহার করতে পারেন। defconfig fragments সম্পর্কে Kleaf ডকুমেন্টেশন দেখুন।

বিল্ড কনফিগারেশন (লেগ্যাসি) সহ লোকাল বিল্ডের জন্য কাস্টম কার্নেল কনফিগারেশন

অ্যান্ড্রয়েড ১৩ এবং এর নিচের সংস্করণগুলোতে নিম্নলিখিত বিষয়গুলো দেখুন।

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

POST_DEFCONFIG_CMDS ভেরিয়েবলটিকে এমন একটি স্টেটমেন্টে সেট করুন যা সাধারণ make defconfig ধাপটি সম্পন্ন হওয়ার ঠিক পরেই মূল্যায়ন করা হয়। যেহেতু build.config ফাইলগুলি বিল্ড এনভায়রনমেন্টে সোর্স করা হয়, তাই build.config এ সংজ্ঞায়িত ফাংশনগুলিকে post-defconfig কমান্ডের অংশ হিসাবে কল করা যেতে পারে।

একটি সাধারণ উদাহরণ হলো ডেভেলপমেন্টের সময় ক্রসহ্যাচ কার্নেলের জন্য লিঙ্ক টাইম অপটিমাইজেশন (LTO) নিষ্ক্রিয় করা। যদিও LTO প্রকাশিত কার্নেলের জন্য উপকারী, বিল্ড করার সময় এর ওভারহেড উল্লেখযোগ্য হতে পারে। স্থানীয় build.config এ নিম্নলিখিত কোডটুকু যোগ করলে build/build.sh ব্যবহার করার সময় LTO স্থায়ীভাবে নিষ্ক্রিয় হয়ে যায়।

POST_DEFCONFIG_CMDS="check_defconfig && update_debug_config"
function update_debug_config() {
    ${KERNEL_DIR}/scripts/config --file ${OUT_DIR}/.config \
         -d LTO \
         -d LTO_CLANG \
         -d CFI \
         -d CFI_PERMISSIVE \
         -d CFI_CLANG
    (cd ${OUT_DIR} && \
     make O=${OUT_DIR} $archsubarch CC=${CC} CROSS_COMPILE=${CROSS_COMPILE} olddefconfig)
}

কার্নেল সংস্করণগুলি সনাক্ত করুন

আপনি দুটি উৎস থেকে বিল্ড করার জন্য সঠিক সংস্করণটি শনাক্ত করতে পারেন: AOSP ট্রি এবং সিস্টেম ইমেজ।

AOSP ট্রি থেকে কার্নেল সংস্করণ

AOSP ট্রি-তে আগে থেকে তৈরি করা কার্নেল সংস্করণগুলো থাকে। গিট লগ কমিট বার্তার অংশ হিসেবে সঠিক সংস্করণটি প্রকাশ করে:

cd $AOSP/device/VENDOR/NAME
git log --max-count=1

যদি গিট লগে কার্নেল সংস্করণটি তালিকাভুক্ত না থাকে, তবে নিচে বর্ণিত পদ্ধতি অনুযায়ী সিস্টেম ইমেজ থেকে এটি সংগ্রহ করুন।

সিস্টেম ইমেজ থেকে কার্নেল সংস্করণ

সিস্টেম ইমেজে ব্যবহৃত কার্নেল সংস্করণ নির্ধারণ করতে, কার্নেল ফাইলটিতে নিম্নলিখিত কমান্ডটি চালান:

file kernel

Image.lz4-dtb ফাইলগুলির জন্য, চালান:

grep -a 'Linux version' Image.lz4-dtb

একটি বুট ইমেজ তৈরি করুন

কার্নেল বিল্ড এনভায়রনমেন্ট ব্যবহার করে একটি বুট ইমেজ তৈরি করা সম্ভব।

init_boot সহ ডিভাইসগুলির জন্য একটি বুট ইমেজ তৈরি করুন

যেসব ডিভাইসে init_boot পার্টিশন থাকে, সেগুলোতে কার্নেলের সাথেই বুট ইমেজ তৈরি করা হয়। initramfs ইমেজটি বুট ইমেজের মধ্যে এমবেড করা থাকে না।

উদাহরণস্বরূপ, Kleaf ব্যবহার করে আপনি নিম্নলিখিত উপায়ে GKI বুট ইমেজ তৈরি করতে পারেন:

tools/bazel run //common:kernel_aarch64_dist [-- --destdir=$DIST_DIR]

build/build.sh (legacy) ব্যবহার করে, আপনি নিম্নলিখিত কমান্ডের মাধ্যমে GKI বুট ইমেজ তৈরি করতে পারেন:

BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh

GKI বুট ইমেজটি $DIST_DIR এ অবস্থিত।

init_boot ছাড়া ডিভাইসগুলির (লেগ্যাসি) জন্য একটি বুট ইমেজ তৈরি করুন

যেসব ডিভাইসে init_boot পার্টিশন নেই, সেগুলোর জন্য একটি ramdisk বাইনারি প্রয়োজন, যা একটি GKI বুট ইমেজ ডাউনলোড করে আনপ্যাক করার মাধ্যমে পাওয়া যায়। সংশ্লিষ্ট অ্যান্ড্রয়েড রিলিজের যেকোনো GKI বুট ইমেজই কাজ করবে।

tools/mkbootimg/unpack_bootimg.py --boot_img=boot-5.4-gz.img
mv $KERNEL_ROOT/out/ramdisk gki-ramdisk.lz4

টার্গেট ফোল্ডারটি হলো কার্নেল ট্রি-এর শীর্ষ-স্তরের ডিরেক্টরি (বর্তমান ওয়ার্কিং ডিরেক্টরি)।

আপনি যদি AOSP-এর সর্বশেষ রিলিজ ব্রাঞ্চ ব্যবহার করে ডেভেলপ করেন, তাহলে এর পরিবর্তে ci.android.com থেকে aosp_arm64 বিল্ডের ramdisk-recovery.img বিল্ড আর্টিফ্যাক্টটি ডাউনলোড করে সেটিকে আপনার র‍্যামডিস্ক বাইনারি হিসেবে ব্যবহার করতে পারেন।

যখন আপনার কাছে একটি র‍্যামডিস্ক বাইনারি থাকবে এবং আপনি সেটি কার্নেল বিল্ডের রুট ডিরেক্টরিতে থাকা gki-ramdisk.lz4 এ কপি করবেন, তখন নিম্নলিখিত কমান্ডটি চালিয়ে একটি বুট ইমেজ জেনারেট করতে পারবেন:

BUILD_BOOT_IMG=1 SKIP_VENDOR_BOOT=1 KERNEL_BINARY=Image GKI_RAMDISK_PREBUILT_BINARY=gki-ramdisk.lz4 BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh

আপনি যদি x86-ভিত্তিক আর্কিটেকচার নিয়ে কাজ করেন, তাহলে Image পরিবর্তে bzImage এবং aarch64 পরিবর্তে x86_64 ব্যবহার করুন:

BUILD_BOOT_IMG=1 SKIP_VENDOR_BOOT=1 KERNEL_BINARY=bzImage GKI_RAMDISK_PREBUILT_BINARY=gki-ramdisk.lz4 BUILD_CONFIG=common/build.config.gki.x86_64 build/build.sh

ফাইলটি $KERNEL_ROOT/out/$KERNEL_VERSION/dist আর্টিফ্যাক্ট ডিরেক্টরিতে অবস্থিত।

বুট ইমেজটি out/<kernel branch>/dist/boot.img এ অবস্থিত।