ویژگی های هسته را به عنوان ماژول های GKI پیکربندی کنید

این صفحه نحوه پیکربندی یک ویژگی جدید هسته به عنوان یک ماژول GKI یا پیکربندی یک ویژگی داخلی هسته موجود به عنوان یک ماژول GKI را پوشش می‌دهد.

پیکربندی یک ویژگی جدید به عنوان ماژول GKI

  1. برای ویژگی جدید، gki_defconfig را ویرایش کنید و مورد پیکربندی ویژگی هسته مورد نیاز را از n به m ( =m ) تنظیم کنید. این تنظیم را هم در arch/arm64/configs/gki_defconfig و هم arch/x86/configs/gki_defconfig تنظیم کنید.

  2. فایل‌های KO ( .ko ) تولید شده برای این ویژگی را به بخش _COMMON_GKI_MODULES_LIST از فایل زیر اضافه کنید. فایل‌ها را به ترتیب مرتب شده اضافه کنید. اگر از تمام فایل‌های تولید شده مطمئن نیستید، ساخت با شکست مواجه می‌شود و تمام فایل‌های KO لازم برای اضافه شدن به لیست را فهرست می‌کند.

    • در android17-6.18 و بالاتر، موارد را به common/bazel/modules_private.bzl اضافه کنید.
    • در android16-6.12 و پایین‌تر، آیتم‌ها را به common/modules.bzl اضافه کنید.
  3. برای اندروید ۱۴، همان مجموعه فایل‌های KO از مرحله ۲ را که به ترتیب صعودی برای جستجوی دودویی در زمان اجرا مرتب شده‌اند، به common/android/gki_{ARCH}_protected_modules اضافه کنید تا ماژول به عنوان یک ماژول GKI محافظت‌شده تعیین شود.

  4. برای اندروید ۱۴ و ۱۵، لیست اکسپورت‌ها را به‌روزرسانی کنید تا اکسپورت‌های تازه اضافه شده در common/android/abi_gki_protected_exports_ ARCHITECTURE را نیز شامل شود. برای مثال، برای به‌روزرسانی لیست، tools/bazel run //common:kernel_aarch64_abi_update_protected_exports for aarch64 را اجرا کنید.

  5. مطمئن شوید که فایل‌های KO که به تازگی از مرحله ۲ اضافه شده‌اند، در فایل‌های out/<androidX-YZ>/dist/system_dlkm.img ‎ و out/ androidX-YZ /dist/system_dlkm_staging_archive.tar.gz ‎ هسته کپی شوند. ماژول‌های موجود در آرشیو system_dlkm_staging_archive.tar.gz ‎ می‌توانند به عنوان ورودی برای تولید system_dlkm.img ‎ در ساخت پلتفرم استفاده شوند.

  6. تغییرات خود را برای بررسی ارسال کنید. ماژول‌های GKI یک ویژگی مختص هسته اندروید هستند، بنابراین نیازی به ارسال وصله‌های تبدیل ماژول به بالادست نیست. با این حال، برای ارسال وصله‌های هسته مشترک اندروید (ACK) باید دستورالعمل‌های دیگری را دنبال کنید.

پیکربندی یک ویژگی داخلی هسته به عنوان یک ماژول GKI

  1. برای یک ویژگی داخلی هسته، gki_defconfig ویرایش کنید و مورد پیکربندی ویژگی هسته مورد نیاز را از y به m ( =m ) تنظیم کنید. این تنظیم را هم در arch/arm64/configs/gki_defconfig و هم arch/x86/configs/gki_defconfig تنظیم کنید.

  2. فایل‌های KO ( .ko ) تولید شده برای این ویژگی را به بخش _COMMON_GKI_MODULES_LIST از فایل زیر اضافه کنید. فایل‌ها را به ترتیب مرتب شده اضافه کنید. اگر از تمام فایل‌های تولید شده مطمئن نیستید، ساخت با شکست مواجه می‌شود و تمام فایل‌های KO لازم برای اضافه شدن به لیست را فهرست می‌کند.

    • در android17-6.18 و بالاتر، موارد را به common/bazel/modules_private.bzl اضافه کنید.
    • در android16-6.12 و پایین‌تر، موارد را به `common/modules.bzl` اضافه کنید.
  3. برای اندروید ۱۴، همان مجموعه فایل‌های KO از مرحله ۲ را که به ترتیب صعودی برای جستجوی دودویی در زمان اجرا مرتب شده‌اند، به common/android/gki_{ARCH}_protected_modules اضافه کنید تا ماژول به عنوان یک ماژول GKI محافظت‌شده تعیین شود.

  4. برای اندروید ۱۴ و ۱۵، لیست اکسپورت‌های محافظت‌شده را به‌روزرسانی کنید تا شامل اکسپورت‌های ماژول تازه اضافه‌شده در common/android/abi_gki_protected_exports_{ARCH} با استفاده از tools/bazel run //common:kernel_aarch64_abi_update_protected_exports for aarch64 نیز بشود.

  5. مطمئن شوید که فایل‌های ماژول KO که به تازگی از مرحله ۲ تبدیل شده‌اند، در فایل‌های out/<androidX-YZ>/dist/system_dlkm.img ‎ و out/ androidX-YZ /dist/system_dlkm_staging_archive.tar.gz ‎ هسته کپی شده‌اند. ماژول‌های موجود در آرشیو system_dlkm_staging_archive.tar.gz ‎ می‌توانند به عنوان ورودی برای تولید system_dlkm.img ‎ در ساخت پلتفرم استفاده شوند.

  6. تغییرات خود را برای بررسی ارسال کنید. ماژول‌های GKI یک ویژگی مختص هسته اندروید هستند، بنابراین نیازی به ارسال وصله‌های تبدیل ماژول به بالادست نیست. با این حال، برای ارسال وصله‌های هسته مشترک اندروید (ACK) باید دستورالعمل‌های دیگر را دنبال کنید.

تبدیل یک ماژول GKI محافظت‌شده به ماژول محافظت‌نشده

  1. برای اندروید ۱۵ و بالاتر، ماژولی که از حالت محافظت‌شده به حالت محافظت‌نشده تبدیل می‌شود را به لیست _COMMON_UNPROTECTED_MODULES_LIST در فایل زیر اضافه کنید:

    • در android17-6.18 و بالاتر، موارد را به common/bazel/modules_private.bzl اضافه کنید.
    • در android16-6.12 و پایین‌تر، آیتم‌ها را به common/modules.bzl اضافه کنید.
  2. برای اندروید ۱۴، ماژولی که از حالت محافظت‌شده به حالت محافظت‌نشده تبدیل می‌شود را از فهرست ماژول‌های محافظت‌شده در common/android/gki_protected_modules حذف کنید.

  3. برای اندروید ۱۴ و ۱۵، لیست اکسپورت‌های محافظت‌شده را به‌روزرسانی کنید تا آنهایی که از ماژول محافظت‌نشده‌ی تازه تبدیل‌شده در common/android/abi_gki_protected_exports_{ARCH} حذف شده‌اند، با استفاده از tools/bazel run //common:kernel_aarch64_abi_update_protected_exports for aarch64 حذف شوند.

  4. تغییرات خود را برای بررسی ارسال کنید. ماژول‌های GKI یک ویژگی مختص هسته اندروید هستند، بنابراین نیازی به ارسال وصله‌های تبدیل ماژول به بالادست نیست. با این حال، برای ارسال وصله‌های هسته مشترک اندروید (ACK) باید دستورالعمل‌های دیگر را دنبال کنید.

راهنمای سریع رفع نقض نماد ماژول‌های GKI

وقتی ماژول‌های بدون امضا، نماد حفاظتی موجود برای ماژول‌های GKI را نقض می‌کنند، ممکن است در حین بارگذاری ماژول با دو نوع خطا مواجه شوند که منجر به خرابی می‌شود.

۱. ماژول بدون امضا با استفاده از نماد محافظت‌شده

خطا:

module: Protected symbol: some_kernel_function (err -13)

علت:

فایل module.ko یک ماژول فروشنده‌ی بدون امضا است و تلاش می‌کند تا نماد صادر شده‌ی ماژول GKI به some_kernel_function را در حین بارگیری، بدون اینکه در فهرست نمادهای فروشنده قرار گیرد، حل کند.

وضوح تصویر:

اگر module.ko یک ماژول GKI محافظت‌شده نباشد، به‌روزرسانی فهرست نمادها با گنجاندن some_kernel_function در فهرست نمادهای فروشنده، خطا را برطرف می‌کند. روش دیگر، استفاده از نسخه GKI از module.ko .

۲. ماژول بدون امضا که نماد محافظت‌شده را صادر می‌کند

خطا:

module: exports protected symbol some_kernel_function

علت:

ماژولی که some_kernel_function را صادر می‌کند، یک ماژول GKI محافظت‌شده است و module.ko احتمالاً یک نسخه سفارشی بدون امضا از آن ماژول است. وقتی module.ko سعی می‌کند some_kernel_function که فقط توسط یک ماژول GKI امضا شده قابل صادر شدن است، صادر کند، بارگیری با این پیام ناموفق می‌شود.

وضوح تصویر:

اگر ماژول بدون امضا یک نسخه سفارشی باشد، می‌توان با استفاده از نسخه GKI ماژولی که some_kernel_function صادر می‌کند، این مشکل را اصلاح کرد.