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

এই পৃষ্ঠাটি অ্যান্ড্রয়েড ডিভাইসের জন্য কাস্টম কার্নেল তৈরির প্রক্রিয়ার বিবরণ দেয়। এই নির্দেশাবলী আপনাকে সঠিক উৎস নির্বাচন, কার্নেল তৈরি এবং অ্যান্ড্রয়েড ওপেন সোর্স প্রজেক্ট (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

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

যন্ত্র AOSP গাছে বাইনারি পথ রেপো শাখা
Pixel 7 (প্যান্থার)
Pixel 7 Pro (চিতা)
device/google/pantah-kernel android-gs-pantah-5.10-android13-qpr2
Pixel 6a (ব্লুজে) device/google/bluejay-kernel android-gs-bluejay-5.10-android13-qpr2
পিক্সেল 6 (ওরিওল)
Pixel 6 Pro (Raven)
device/google/raviole-kernel android-gs-raviole-5.10-android13-qpr2
Pixel 5a (বারবেট)
Pixel 5 (redfin)
Pixel 4a (5G) (ব্র্যাম্বল)
device/google/redbull-kernel android-msm-redbull-4.19-android13-qpr2
Pixel 4a (সানফিশ) device/google/sunfish-kernel android-msm-sunfish-4.14-android13-qpr2
পিক্সেল 4 (শিখা)
Pixel 4 XL (প্রবাল)
device/google/coral-kernel android-msm-coral-4.14-android13
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
common-android13-5.10
বিগল 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
common-android13-5.10
common-android13-5.15
common-android14-5.15
common-android14-6.1
সাধারণ-অ্যান্ড্রয়েড-মেইনলাইন

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

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

build/build.sh

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

বেজেল (ক্লিফ) সহ বিল্ডিং

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

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

tools/bazel build //common:kernel_aarch64_dist

একটি বিতরণ তৈরি করতে, চালান:

tools/bazel run //common:kernel_aarch64_dist -- --dist_dir=$DIST_DIR

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

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

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

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

virtual_device মডিউলগুলি তৈরি করতে, চালান:

tools/bazel build //common-modules/virtual-device:virtual_device_x86_64_dist

একটি বিতরণ তৈরি করতে, চালান:

tools/bazel run //common-modules/virtual-device:virtual_device_x86_64_dist -- --dist_dir=$DIST_DIR

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

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

ডিভাইস এবং কার্নেলের জন্য ক্লিফ সমর্থন

নিম্নলিখিত সারণী পৃথক ডিভাইস কার্নেলের জন্য Kleaf সমর্থন তালিকাভুক্ত করে। তালিকাবিহীন ডিভাইসের জন্য, অনুগ্রহ করে ডিভাইস প্রস্তুতকারকের সাথে যোগাযোগ করুন।

যন্ত্র রেপো শাখা ক্লিফ সমর্থন build/build.sh সমর্থন
অ্যান্ড্রয়েড কমন কার্নেল
db845c
ভার্চুয়াল ডিভাইস (x86_64, arm64)
ভার্চুয়াল ডিভাইস (i686, আর্ম)
রকপি৪
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
অ্যান্ড্রয়েড কমন কার্নেল common-android13-5.10
common-android13-5.15
✅ (অফিসিয়াল)
অ্যান্ড্রয়েড কমন কার্নেল common-android14-5.15
common-android14-6.1
সাধারণ-অ্যান্ড্রয়েড-মেইনলাইন
db845c common-android13-5.10
db845c common-android13-5.15 ✅ (অফিসিয়াল)
db845c common-android14-5.15
common-android14-6.1
সাধারণ-অ্যান্ড্রয়েড-মেইনলাইন
ভার্চুয়াল ডিভাইস (x86_64, arm64) common-android13-5.10
common-android13-5.15
✅ (অফিসিয়াল) ⚠️ (অসংযত) 2
ভার্চুয়াল ডিভাইস (x86_64, arm64) common-android14-5.15
common-android14-6.1
সাধারণ-অ্যান্ড্রয়েড-মেইনলাইন
ভার্চুয়াল ডিভাইস (i686, আর্ম) common-android13-5.10
common-android13-5.15
ভার্চুয়াল ডিভাইস (i686, আর্ম) common-android14-5.15
common-android14-6.1
সাধারণ-অ্যান্ড্রয়েড-মেইনলাইন
রকপি৪ common-android13-5.10
common-android13-5.15
রকপি৪ common-android14-5.15
common-android14-6.1
সাধারণ-অ্যান্ড্রয়েড-মেইনলাইন
হাইকি960 hikey-linaro-android-4.14
hikey-linaro-android-4.19
common-android12-5.4
common-android13-5.10
fips140 মডিউল common-android12-5.10
common-android13-5.10
common-android13-5.15
fips140 মডিউল common-android14-5.15

1 "অফিসিয়াল" এর মানে হল যে এটি কার্নেল তৈরি করার অফিসিয়াল উপায়, যদিও বিকল্প উপায়টি কার্নেল তৈরি করতেও ব্যবহার করা যেতে পারে।

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

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

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

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

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/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/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 -- --dist_dir=$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 এ অবস্থিত।