فعال کردن VNDK

«کیت توسعه بومی فروشنده» (VNDK) برای جدا کردن نگرانی‌های بین فروشنده و سیستم، به چندین تغییر در پایگاه کد نیاز دارد. از راهنمای زیر برای فعال کردن VNDK در پایگاه کد فروشنده/سازنده اصلی استفاده کنید.

ساختن کتابخانه‌های سیستم

سیستم ساخت شامل چندین نوع شیء ازجمله کتابخانه‌ها (مشترک، ایستا، یا سرصفحه) و فایل‌های اجرایی است.

ساختن کتابخانه‌های سیستم

شکل ۱. کتابخانه‌های سیستم را بسازید.

  • core کتابخانه توسط تصویر سیستم، در تصویر سیستم استفاده می‌شود. ‫vendor،‏ vendor_available،‏ vndk، یا vndk-sp کتابخانه نمی‌توانند از این کتابخانه‌ها استفاده کنند.
    cc_library {
        name: "libThatIsCore",
        ...
    }
  • کتابخانه‌های vendor-only (یا proprietary) توسط تصویر فروشنده، در تصویر فروشنده استفاده می‌شوند.
    cc_library {
        name: "libThatIsVendorOnly",
        proprietary: true,
        # or: vendor: true, # (for things in AOSP)
        ...
    }
  • vendor_available کتابخانه توسط تصویر فروشنده استفاده می‌شود، در تصویر فروشنده (ممکن است حاوی موارد تکراری core باشد).
    cc_library {
        name: "libThatIsVendorAvailable",
        vendor_available: true,
        ...
    }
  • ‫vndk کتابخانه توسط تصویر فروشنده در تصویر سیستم استفاده می‌شود.
    cc_library {
        name: "libThatIsVndk",
        vendor_available: true,
        vndk: {
            enabled: true,
        }
        ...
    }
  • ‫vndk-sp کتابخانه توسط تصویر فروشنده و همچنین به‌طور غیرمستقیم توسط تصویر سیستم استفاده می‌شود.
    cc_library {
        name: "libThatIsVndkSp",
        vendor_available: true,
        vndk: {
            enabled: true,
            support_system_process: true,
        }
        ...
    }
  • ‫llndk کتابخانه توسط سیستم و تصاویر فروشنده استفاده می‌شود.
    cc_library {
        name: "libThatIsLlndk",
        llndk: {
            symbol_file: "libthatisllndk.map.txt"
        }
        ...
    }

وقتی کتابخانه‌ای به‌عنوان vendor_available:true علامت‌گذاری می‌شود، دو بار ساخته می‌شود:

  • یک‌بار برای پلاتفرم (و بنابراین در /system/lib نصب شده است)
  • یک‌بار برای فروشنده (و بنابراین در /vendor/lib یا VNDK APEX نصب می‌شود)

نسخه‌های فروشنده کتابخانه‌ها با -D__ANDROID_VNDK__ ساخته شده است. اجزای سیستم خصوصی که ممکن است در نسخه‌های آینده Android به‌طور قابل‌توجهی تغییر کنند با این پرچم غیرفعال می‌شوند. علاوه‌براین، کتابخانه‌های مختلف مجموعه متفاوتی از سرایندها (مثل liblog) را صادر می‌کنند. گزینه‌های مختص به گونه فروشنده هدف را می‌توان در فایل Android.bp در اینجا مشخص کرد:

target: { vendor: { … } }

فعال کردن VNDK برای پایگاه کد

برای فعال کردن VNDK برای پایگاه کد:

  1. با محاسبه اندازه‌های موردنیاز برای پارتیشن‌های vendor.img و system.img، واجدشرایط بودن را تعیین کنید.
  2. BOARD_VNDK_VERSION=current را فعال کنید. می‌توانید به BoardConfig.mk اضافه کنید یا مستقیماً با آن مؤلفه بسازید (برای مثال، m -j BOARD_VNDK_VERSION=current MY-LIB).

پس‌از فعال کردن BOARD_VNDK_VERSION=current، سیستم ساخت الزامات سرصفحه و وابستگی زیر را اعمال می‌کند.

مدیریت وابستگی‌ها

شیء vendor که به عنصر core وابسته است و در vndk یا به‌عنوان شیء vendor وجود ندارد باید بااستفاده از یکی از گزینه‌های زیر حل‌وفصل شود:

  • وابستگی را می‌توان برداشت.
  • اگر core متعلق به vendor باشد، می‌تواند به‌عنوان vendor_available یا vendor علامت‌گذاری شود.
  • تغییری که شیء اصلی را بخشی از vndk می‌کند ممکن است به Google ارسال شود.

علاوه‌براین، اگر یک عنصر core به عنصر vendor وابستگی داشته باشد، عنصر vendor باید به عنصر core تبدیل شود یا وابستگی باید به روش دیگری برداشته شود (برای مثال، با برداشتن وابستگی یا با انتقال وابستگی به عنصر vendor).

مدیریت سرایندها

وابستگی‌های سرایند سراسری باید برداشته شود تا سیستم ساخت بتواند بفهمد سرایندها را با -D__ANDROID_VNDK__ بسازد یا بدون آن. برای مثال، سرصفحه‌های libutils مانند utils/StrongPointer.h همچنان می‌توانند بااستفاده از کتابخانه سرصفحه libutils_headers دردسترس باشند.

برخی‌از سرایندها (مثل unistd.h) دیگر نمی‌توانند به‌صورت انتقالی اضافه شوند اما می‌توانند به‌صورت محلی اضافه شوند.

درنهایت، بخش عمومی private/android_filesystem_config.h به cutils/android_filesystem_config.h منتقل شد. برای مدیریت این سرایندها، یکی از این کارها را انجام دهید:

  • با جایگزین کردن همه AID_* کلان‌ها با getgrnam/ getpwnam تماس‌ها درصورت امکان، وابستگی به private/android_filesystem_config.h را بردارید. برای مثال:
    • ‫(uid_t)AID_WIFI به getpwnam("wifi")->pw_uid تبدیل می‌شود.
    • ‫(gid_t)AID_SDCARD_R به getgrnam("sdcard_r")->gr_gid تبدیل می‌شود.
    برای جزئیات بیشتر، به private/android_filesystem_config.h مراجعه کنید.
  • برای AIS سخت‌رمزی، cutils/android_filesystem_config.h را اضافه کنید.