বিল্ডিং কার্নেল

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

আপনি Repo ব্যবহার করে আরও সাম্প্রতিক কার্নেল উত্সগুলি অর্জন করতে পারেন; আপনার সোর্স চেকআউটের রুট থেকে build/build.sh চালিয়ে আরও কনফিগারেশন ছাড়াই সেগুলি তৈরি করুন।

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

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

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

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

নিম্নলিখিত সারণী এই পদ্ধতির মাধ্যমে উপলব্ধ কার্নেলের জন্য BRANCH নাম তালিকাভুক্ত করে।

যন্ত্র AOSP গাছে বাইনারি পথ রেপো শাখা
পিক্সেল 6 (ওরিওল)
Pixel 6 Pro (Raven)
device/google/raviole-kernel android-gs-raviole-5.10-android12L
Pixel 5a (বারবেট) device/google/barbet-kernel android-msm-barbet-4.19-android12L
Pixel 5 (রেডফিন)
Pixel 4a (5G) (ব্র্যাম্বল)
device/google/redbull-kernel android-msm-redbull-4.19-android12L
Pixel 4a (সানফিশ) device/google/sunfish-kernel android-msm-sunfish-4.14-android12L
পিক্সেল 4 (শিখা)
Pixel 4 XL (প্রবাল)
device/google/coral-kernel android-msm-coral-4.14-android12L
Pixel 3a (সারগো)
Pixel 3a XL (বোনিটো)
device/google/bonito-kernel android-msm-bonito-4.9-android12L
Pixel 3 (ব্লুলাইন)
Pixel 3 XL (ক্রসশ্যাচ)
device/google/crosshatch-kernel android-msm-crosshatch-4.9-android12
পিক্সেল 2 (ওয়ালে)
Pixel 2 XL (টাইমেন)
device/google/wahoo-kernel android-msm-wahoo-4.4-android10-qpr3
পিক্সেল (সেলফিশ)
পিক্সেল এক্সএল (মার্লিন)
device/google/marlin-kernel android-msm-marlin-3.18-pie-qpr2
হাইকি960 ডিভাইস/লিনারো/হাইকি-কারনেল hikey-linaro-android-4.14
hikey-linaro-android-4.19
common-android12-5.4
বিগল x15 ডিভাইস/ti/beagle_x15-কারনেল omap-beagle-x15-android-4.14
omap-beagle-x15-android-4.19
অ্যান্ড্রয়েড কমন কার্নেল N/A common-android-4.4
common-android-4.9
common-android-4.14
common-android-4.19
common-android-4.19-স্থিতিশীল
common-android11-5.4
common-android12-5.4
common-android12-5.10
সাধারণ-অ্যান্ড্রয়েড-মেইনলাইন

কার্নেল বিল্ডিং

তারপর এটি দিয়ে কার্নেল তৈরি করুন:

build/build.sh

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

GKI মডিউল তৈরি করা

অ্যান্ড্রয়েড 11 GKI চালু করেছে, যা কার্নেলটিকে একটি Google-রক্ষণাবেক্ষণ করা কার্নেল চিত্র এবং বিক্রেতা রক্ষণাবেক্ষণ-মডিউলগুলিতে আলাদা করে, যা আলাদাভাবে তৈরি করা হয়েছে।

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

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

অ্যান্ড্রয়েড 12 কাটলফিশ এবং গোল্ডফিশ একত্রিত হয়, তাই তারা একই কার্নেল ভাগ করে: virtual_device । সেই কার্নেলের মডিউলগুলি তৈরি করতে, এই বিল্ড কনফিগারেশনটি ব্যবহার করুন:

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

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

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

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

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

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

export TARGET_PREBUILT_KERNEL=DIST_DIR/Image.lz4-dtb

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

একটি বুট ইমেজ তৈরি এবং বুট করার প্রক্রিয়াটিকে স্ট্রীমলাইন করার জন্য সাম্প্রতিকতম ডিভাইসগুলিতে একটি বুটলোডার এক্সটেনশন রয়েছে।

ফ্ল্যাশিং ছাড়া কার্নেল বুট করতে:

adb reboot bootloader
fastboot boot Image.lz4-dtb

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

কার্নেল বিল্ড কাস্টমাইজ করা হচ্ছে

বিল্ড প্রক্রিয়া এবং ফলাফল পরিবেশের পরিবর্তনশীল দ্বারা প্রভাবিত হতে পারে। তাদের বেশিরভাগই ঐচ্ছিক এবং প্রতিটি কার্নেল শাখা একটি সঠিক ডিফল্ট কনফিগারেশন সহ আসা উচিত। সবচেয়ে ঘন ঘন ব্যবহৃত বেশী এখানে তালিকাভুক্ত করা হয়. একটি সম্পূর্ণ (এবং আপ-টু-ডেট) তালিকার জন্য, 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

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

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

ভেরিয়েবল POST_DEFCONFIG_CMDS একটি বিবৃতিতে সেট করুন যা স্বাভাবিক make defconfig ধাপ সম্পন্ন হওয়ার পরে মূল্যায়ন করা হয়। যেহেতু build.config ফাইলগুলি বিল্ড এনভায়রনমেন্টে সোর্স করা হয়, তাই build.config এ সংজ্ঞায়িত ফাংশনগুলিকে পোস্ট-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

একটি বুট ইমেজ নির্মাণ

কার্নেল বিল্ড এনভায়রনমেন্ট ব্যবহার করে একটি বুট ইমেজ তৈরি করা সম্ভব। এটি করার জন্য আপনার একটি রামডিস্ক বাইনারি প্রয়োজন, যেটি আপনি একটি GKI বুট ইমেজ ডাউনলোড করে আনপ্যাক করে পেতে পারেন। সংশ্লিষ্ট Android রিলিজ থেকে যেকোন GKI বুট ইমেজ কাজ করবে।

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

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

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

যখন আপনার কাছে একটি ramdisk বাইনারি থাকে এবং আপনি এটিকে কার্নেল বিল্ডের রুট ডিরেক্টরিতে 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-ভিত্তিক আর্কিটেকচারের সাথে কাজ করেন, তাহলে bzImage Image দিয়ে এবং 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 এ অবস্থিত।