تفعيل حزمة VNDK

تتطلب مجموعة تطوير أصلية للمورّدين (VNDK) إجراء عدة تغييرات على قاعدة الرموز البرمجية لفصل الاهتمامات بين المورّد والنظام. استخدِم الدليل التالي لتفعيل VNDK في قاعدة رموز برمجية خاصة بمورّد أو مصنّع معدات أصلية.

إنشاء مكتبات النظام

يحتوي نظام التصميم على عدة أنواع من العناصر، بما في ذلك المكتبات (المشترَكة أو الثابتة أو عناوين الملفات) والبرامج الثنائية.

إنشاء مكتبات النظام

الشكل 1: مكتبات نظام التصميم

  • يتم استخدام مكتبات 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. لإدارة هذه العناوين، نفِّذ أحد الإجراءات التالية:

  • أزِل الاعتمادية على private/android_filesystem_config.h من خلال استبدال جميع وحدات ماكرو AID_* باستدعاءات getgrnam/ getpwnam إذا أمكن ذلك. على سبيل المثال:
    • تتغيّر قيمة (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.