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

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

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

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

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

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

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

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

পিক্সেল ডিভাইসের জন্য কার্নেল ডাউনলোড এবং কম্পাইল করার বিষয়ে বিস্তারিত জানার জন্য, পিক্সেল কার্নেল তৈরি করা দেখুন।

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

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

Android 13 Bazel এর সাথে বিল্ডিং কার্নেল চালু করেছে।

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

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

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

build.sh (উত্তরাধিকার) দিয়ে তৈরি করুন

অ্যান্ড্রয়েড 12-এ বা তার নিচের শাখাগুলির জন্য বা ক্লিফ ছাড়া শাখাগুলির জন্য:

build/build.sh

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

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

Android 13 build.sh প্রতিস্থাপন করে Bazel (Kleaf) এর সাথে বিল্ডিং কার্নেল চালু করেছে।

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

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

বেজেল দিয়ে অ্যান্ড্রয়েড কার্নেল তৈরির বিষয়ে আরও বিশদ বিবরণের জন্য, দেখুন। ক্লিফ - বেজেল দিয়ে অ্যান্ড্রয়েড কার্নেল তৈরি করা

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

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

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

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

অ্যান্ড্রয়েড 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

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

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

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

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

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

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

আপনি Cuttlefish ডিভাইসে আপনার পছন্দের আর্কিটেকচারে কার্নেল চালাতে পারেন।

কার্নেল আর্টিফ্যাক্টগুলির একটি নির্দিষ্ট সেট সহ একটি কাটলফিশ ডিভাইস বুট করতে, প্যারামিটার হিসাবে লক্ষ্য কার্নেল আর্টিফ্যাক্টগুলির সাথে 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

আরও তথ্যের জন্য, Cuttlefish-এর উপর কার্নেল তৈরি করুন দেখুন।

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

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

build.sh (উত্তরাধিকার) দিয়ে কার্নেল বিল্ড কাস্টমাইজ করুন

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

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

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

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

অ্যান্ড্রয়েড 13 এবং নীচে, নিম্নলিখিত দেখুন।

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

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

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

উদাহরণস্বরূপ, ক্লিফের সাথে, আপনি এর সাথে GKI বুট চিত্র তৈরি করতে পারেন:

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

build/build.sh (লেগ্যাসি) দিয়ে, আপনি GKI বুট ইমেজ তৈরি করতে পারেন:

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

GKI বুট চিত্রটি $DIST_DIR এ অবস্থিত।

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

init_boot পার্টিশন ছাড়া ডিভাইসের জন্য, আপনার একটি ramdisk বাইনারি প্রয়োজন, যেটি আপনি একটি GKI বুট ইমেজ ডাউনলোড করে আনপ্যাক করে পেতে পারেন। সংশ্লিষ্ট Android রিলিজ থেকে যেকোন 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 বিল্ড আর্টিফ্যাক্ট ডাউনলোড করতে পারেন এবং সেটিকে আপনার রামডিস্ক বাইনারি হিসেবে ব্যবহার করতে পারেন।

যখন আপনার কাছে একটি 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-ভিত্তিক আর্কিটেকচারের সাথে কাজ করেন, তাহলে 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 এ অবস্থিত।