تفعيل حزمة VNDK

يتطلّب Vendor Native Development Kit (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.