التوافق مع نظام إصدار VNDK

في الإصدار Android 8.1 والإصدارات الأحدث، تم دمج نظام التصميم مع VNDK. فعندما يتم تفعيل دعم VNDK، ويتحقق نظام الإصدار من التبعيات بين وتنشئ متغيرًا خاصًا بالبائع لوحدات البائعين، بتثبيت هذه الوحدات تلقائيًا في الأدلة المخصصة.

مثال على دعم إصدار VNDK

في هذا المثال، يحدّد تعريف الوحدة Android.bp مكتبة باسم libexample. vendor_available تشير إلى أن وحدات إطار العمل ووحدات الموردين قد تعتمد على libexample:

libexample seller_available:true وvndk.enabled:true

تم تفعيل دعم الشكل 1..

كل من إطار العمل القابل للتنفيذ /system/bin/foo والمورِّد يعتمد /vendor/bin/bar القابل للتنفيذ على libexample تحتوي على libexample في المواقع الإلكترونية على shared_libs.

في حال استخدام libexample من قِبل كل من وحدات إطار العمل والمورِّد وحدتان، تم إنشاء صيغتين من libexample. الصيغة الأساسية (التي تحمل اسم libexample) تستخدمها وحدات إطار العمل يستخدم المورّد صيغة المورّد (التي تحمل اسم libexample.vendor) الوحدات. تم تثبيت المتغيرَين في أدلة مختلفة:

  • تم تثبيت الصيغة الأساسية في /system/lib[64]/libexample.so
  • تم تثبيت صيغة المورّد في VNDK APEX للأسباب التالية: تم true ميزة vndk.enabled.

لمزيد من التفاصيل، يُرجى الاطّلاع على تعريف الوحدة.

إعداد دعم الإصدار

لتفعيل الدعم الكامل لنظام الإصدار لجهاز ما، يمكنك إضافة BOARD_VNDK_VERSION إلى BoardConfig.mk:

BOARD_VNDK_VERSION := current

لهذا الإعداد تأثير عام: عند تحديده في BoardConfig.mk، تم التحقّق من جميع الوحدات. نظرًا لعدم وجود آلية لإدراج الوحدة المسيئة في القائمة السوداء أو القائمة البيضاء، يجب تنظيف جميع والتبعيات غير الضرورية قبل إضافة BOARD_VNDK_VERSION. إِنْتَ اختبار وحدة وتجميعها عن طريق ضبط BOARD_VNDK_VERSION في متغيرات بيئتك وهي:

$ BOARD_VNDK_VERSION=current m module_name.vendor

عند تفعيل BOARD_VNDK_VERSION، يتم ضبط العديد من الإعدادات التلقائية العامة. تتم إزالة مسارات البحث في العناوين. ومن بينها:

  • frameworks/av/include
  • frameworks/native/include
  • frameworks/native/opengl/include
  • hardware/libhardware/include
  • hardware/libhardware_legacy/include
  • hardware/ril/include
  • libnativehelper/include
  • libnativehelper/include_deprecated
  • system/core/include
  • system/media/audio/include

إذا كانت وحدة تعتمد على الرؤوس من هذه الأدلة، فيجب تحديد (بشكل صريح) التبعيات مع header_libs، static_libs و/أو shared_libs

حزمة VNDK APEX

في الإصدار 10 من نظام التشغيل Android والإصدارات الأقدم، تم تثبيت الوحدات التي تتضمّن vndk.enabled في /system/lib[64]/vndk[-sp]-${VER} في نظام التشغيل Android 11 والإصدارات الأحدث، يتم حزم مكتبات VNDK بتنسيق APEX، ويحمل اسم VNDK APEX com.android.vndk.v${VER} استنادًا إلى إعدادات الجهاز تكون VNDK APEX مسطحة أو غير مسطحة وهي متاحة من المسار الأساسي /apex/com.android.vndk.v${VER}

حزمة VNDK APEX

الشكل 2. حزمة VNDK APEX

تعريف الوحدة

لإنشاء Android باستخدام BOARD_VNDK_VERSION، يجب مراجعة يتم تعريف الوحدة إما في Android.mk أو Android.bp يصف هذا القسم الأنواع المختلفة من الوحدات والتعريفات والعديد من خصائص الوحدة ذات الصلة بـ VNDK وعمليات التحقق من التبعية تنفيذها في نظام الإصدار.

وحدات المورّدين

وحدات المورّدين هي ملفات تنفيذية خاصة بالموردين أو مكتبات مشتركة في قسم المورِّد. في Android.bp ملف، يجب أن تضبط وحدات المورّدين هذه القيمة على true. في Android.mk ملف، يجب ضبط وحدات المورّدين. LOCAL_VENDOR_MODULE أو LOCAL_PROPRIETARY_MODULE إلى true

إذا تم تحديد BOARD_VNDK_VERSION، لن يسمح نظام التصميم بذلك. المهام والتبعيات بين وحدات الموردين ووحدات إطار العمل، وينتج عنها أخطاء في الحالات التالية:

  • أي وحدة بدون vendor:true تعتمد على وحدة ذات vendor:true، أو
  • تعتمد أي وحدة مع vendor:true على وحدة غير تابعة لـ llndk_library لا تحتوي على vendor:true أو vendor_available:true.

ينطبق التحقق من التبعية على header_libs، static_libs وshared_libs بوصة Android.bp، وإلى LOCAL_HEADER_LIBRARIES، LOCAL_STATIC_LIBRARIES وLOCAL_SHARED_LIBRARIES في Android.mk

LL-NDK

المكتبات المشتركة LL-NDK هي مكتبات مشتركة تحتوي على واجهات ABI ثابتة. كلا إطارَي العمل والموردين تشترك في نفس طريقة التنفيذ وأحدثها. لكل منها LL-NDK، يحتوي cc_library على السمة llndk التي تحتوي على ملف رموز:

cc_library {
    name: "libvndksupport",
    llndk: {
        symbol_file: "libvndksupport.map.txt",
    },
}

يصف ملف الرموز الرموز المرئية لوحدات الموردين. مثلاً:

LIBVNDKSUPPORT {
  global:
    android_load_sphal_library; # llndk
    android_unload_sphal_library; # llndk
  local:
    *;
};

واستنادًا إلى ملف الرموز، ينشئ نظام الإصدار مكتبة مشتركة بديلة وحدات الموردين، التي ترتبط بهذه المكتبات عند تم تفعيل ميزة BOARD_VNDK_VERSION. يتم تضمين رمز في التنصيص المكتبة المشتركة فقط في حالة:

  • لم يتم تحديده في نهاية القسم بـ _PRIVATE أو _PLATFORM,
  • لا تتضمّن علامة #platform-only
  • لا تحتوي على علامات #introduce* أو لا تتطابق العلامة مع الهدف.

الدونغ الفيتنامي (VNDK)

في Android.bp ملف، cc_library، cc_library_static وcc_library_shared و تدعم تعريفات الوحدات cc_library_headers ثلاثة واجهات برمجة تطبيقات مرتبطة بـ VNDK. المواقع: vendor_available، وvndk.enabled، vndk.support_system_process

إذا كانت قيمة vendor_available أو vndk.enabled هي true، قد يكون هناك صيغتان (أساسية ومورّد) بُنيت. يجب التعامل مع الصيغة الأساسية كوحدة إطار عمل ويجب أن يتعامل المورّد مع يجب التعامل مع المتغير على أنه وحدة للمورد. إذا كانت بعض وحدات إطار العمل تعتمد في هذه الوحدة، يتم إنشاء الصيغة الأساسية. إذا كانت بعض وحدات البائعين على هذه الوحدة، يتم إنشاء متغير البائع. يفرض نظام التصميم عمليات التحقق من التبعية التالية:

  • تكون الصيغة الأساسية دائمًا مستندة إلى إطار عمل فقط ولا يمكن للمورِّد الوصول إليها. الوحدات.
  • يتعذّر دائمًا الوصول إلى صيغة المورّد من وحدات إطار العمل.
  • جميع تبعيات خيار البائع، والتي يتم تحديدها في header_libs و/أو static_libs و/أو shared_libs، يجب أن يكون إما llndk_library أو مع vendor_available أو vndk.enabled.
  • إذا كانت قيمة السمة vendor_available هي true، يكون خيار المورّد متاحة لجميع وحدات الموردين.
  • إذا كانت قيمة السمة vendor_available هي false، يكون خيار المورّد لا يمكن الوصول إليها إلا من خلال وحدات VNDK أو VNDK-SP الأخرى (أي الوحدات التي تحتوي على يتعذّر على "vendor:true" ربط "vendor_available:false" الوحدات).

مسار التثبيت التلقائي لـ cc_library أو يتم تحديد cc_library_shared من خلال القواعد التالية:

  • تم تثبيت الصيغة الأساسية على /system/lib[64].
  • قد يختلف مسار تثبيت صيغة المورّد:
    • إذا كانت قيمة السمة vndk.enabled هي false، يكون خيار المورّد مثبَّتة في /vendor/lib[64].
    • إذا كانت قيمة السمة vndk.enabled هي true، يكون خيار المورّد في VNDK APEX(com.android.vndk.v${VER}).

يلخّص الجدول أدناه كيفية تعامل نظام الإصدار مع خيارات المورّدين:

المورّد_متاح تم تفعيل vndk
vndk
support_same_process
أوصاف خيارات المورّدين
true false false تكون خيارات المورِّد VND-ONLY. المكتبات المشتركة هي تم التثبيت في /vendor/lib[64].
true غير صالح (خطأ في الإصدار)
true false خيارات المورِّد هي VNDK. تم تثبيت المكتبات المشتركة. إلى شركة VNDK APEX.
true خيارات المورِّد هي VNDK-SP. المكتبات المشتركة هي على VNDK APEX.

false

false

false

ما مِن صيغ للمورّدين. هذه الوحدة مخصّصة للاستخدام فقط مع الأجهزة الجوّالة.

true غير صالح (خطأ في الإصدار)
true false تكون صيغ المورّد هي VNDK-private. المكتبات المشتركة هي على VNDK APEX. يجب ألا تكون هذه تستخدمه بشكل مباشر من قبل وحدات المورد.
true تكون خيارات المورِّد هي VNDK-SP-private. المكتبات المشتركة هي على VNDK APEX. يجب ألا تكون هذه تستخدمه بشكل مباشر من قبل وحدات المورد.

إضافات VNDK

إضافات VNDK هي مكتبات مشتركة لـ VNDK مزودة بواجهات برمجة تطبيقات إضافية. الإضافات هي تم التثبيت على /vendor/lib[64]/vndk[-sp] (بدون لاحقة الإصدار) وإلغاء مكتبات VNDK المشتركة الأصلية في وقت التشغيل.

تعريف إضافات VNDK

على الإصدار 9 من نظام Android والإصدارات الأحدث، يتوافق Android.bp في الأصل مع VNDK. الإضافات. لإنشاء امتداد VNDK، حدد وحدة أخرى السمة vendor:true والسمة extends:

cc_library {
    name: "libvndk",
    vendor_available: true,
    vndk: {
        enabled: true,
    },
}

cc_library {
    name: "libvndk_ext",
    vendor: true,
    vndk: {
        enabled: true,
        extends: "libvndk",
    },
}

وحدة مع vendor:true وvndk.enabled:true و تحدد خصائص extends إضافة VNDK:

  • يجب أن تحدّد السمة extends مكتبة مشتركة أساسية من VNDK. اسم (أو اسم المكتبة المشتركة VNDK-SP).
  • تتم تسمية امتدادات VNDK (أو امتدادات VNDK-SP) باسم الوحدة الأساسية. الأسماء التي تمتد منها. على سبيل المثال، الناتج الثنائي libvndk_ext هو libvndk.so بدلاً من libvndk_ext.so
  • تم تثبيت إضافات VNDK في /vendor/lib[64]/vndk.
  • يتم تثبيت إضافات VNDK-SP في /vendor/lib[64]/vndk-sp
  • يجب أن تحتوي المكتبات المشتركة الأساسية على كل من vndk.enabled:true. وvendor_available:true.

يجب أن تكون إضافة VNDK-SP من مكتبة مشتركة في VNDK-SP. (يجب أن يكون vndk.support_system_process متساويًا):

cc_library {
    name: "libvndk_sp",
    vendor_available: true,
    vndk: {
        enabled: true,
        support_system_process: true,
    },
}

cc_library {
    name: "libvndk_sp_ext",
    vendor: true,
    vndk: {
        enabled: true,
        extends: "libvndk_sp",
        support_system_process: true,
    },
}

قد تعتمد إضافات VNDK (أو إضافات VNDK-SP) على إضافات VNDK المشتركة المكتبات:

cc_library {
    name: "libvndk",
    vendor_available: true,
    vndk: {
        enabled: true,
    },
}

cc_library {
    name: "libvndk_ext",
    vendor: true,
    vndk: {
        enabled: true,
        extends: "libvndk",
    },
    shared_libs: [
        "libvendor",
    ],
}

cc_library {
    name: "libvendor",
    vendor: true,
}

استخدام إضافات VNDK

إذا كانت وحدة المورد تعتمد على واجهات برمجة تطبيقات إضافية تم تحديدها بواسطة إضافات VNDK، فإن اسم امتداد VNDK في الخاصية "shared_libs":

// A vendor shared library example
cc_library {
    name: "libvendor",
    vendor: true,
    shared_libs: [
        "libvndk_ext",
    ],
}

// A vendor executable example
cc_binary {
    name: "vendor-example",
    vendor: true,
    shared_libs: [
        "libvndk_ext",
    ],
}

إذا كانت وحدة البائع تعتمد على امتدادات VNDK، فسيتم إنشاء امتدادات VNDK هذه تم تثبيته على /vendor/lib[64]/vndk[-sp] تلقائيًا. إذا كانت وحدة لم تعد تعتمد على إضافة VNDK، أضف خطوة سليمة إلى CleanSpec.mk لإزالة المكتبة المشتركة. مثلاً:

$(call add-clean-step, rm -rf $(TARGET_OUT_VENDOR)/lib/libvndk.so)

التجميع الشرطي

يصف هذا القسم كيفية التعامل مع الاختلافات الدقيقة (على سبيل المثال: إضافة أو إزالة ميزة من أحد المتغيرات) بين ما يلي: ثلاث مكتبات مشتركة في VNDK:

  • الصيغة الأساسية (مثل /system/lib[64]/libexample.so)
  • صيغة المورّد (على سبيل المثال، /apex/com.android.vndk.v${VER}/lib[64]/libexample.so)
  • إضافة VNDK (مثل /vendor/lib[64]/vndk[-sp]/libexample.so)

علامات التجميع الشرطي

يحدّد نظام إصدار Android __ANDROID_VNDK__ للمورّد والمتغيرات وVNDK بشكل افتراضي. يمكنك حماية الرمز باستخدام واقيات المعالج الأولي C:

void all() { }

#if !defined(__ANDROID_VNDK__)
void framework_only() { }
#endif

#if defined(__ANDROID_VNDK__)
void vndk_only() { }
#endif

بالإضافة إلى __ANDROID_VNDK__، يمكن استخدام cflags أو قد يتم تحديد cppflags في Android.bp. تشير رسالة الأشكال البيانية تم تحديد cflags أو cppflags في تكون السمة target.vendor مخصّصة لخيار المورّد.

على سبيل المثال، تحدِّد Android.bp التالية ما يلي: libexample وlibexample_ext:

cc_library {
    name: "libexample",
    srcs: ["src/example.c"],
    vendor_available: true,
    vndk: {
        enabled: true,
    },
    target: {
        vendor: {
            cflags: ["-DLIBEXAMPLE_ENABLE_VNDK=1"],
        },
    },
}

cc_library {
    name: "libexample_ext",
    srcs: ["src/example.c"],
    vendor: true,
    vndk: {
        enabled: true,
        extends: "libexample",
    },
    cflags: [
        "-DLIBEXAMPLE_ENABLE_VNDK=1",
        "-DLIBEXAMPLE_ENABLE_VNDK_EXT=1",
    ],
}

وفي ما يلي قائمة الرموز الخاصة بـ src/example.c:

void all() { }

#if !defined(LIBEXAMPLE_ENABLE_VNDK)
void framework_only() { }
#endif

#if defined(LIBEXAMPLE_ENABLE_VNDK)
void vndk() { }
#endif

#if defined(LIBEXAMPLE_ENABLE_VNDK_EXT)
void vndk_ext() { }
#endif

وفقًا لهذين الملفين، يُنشئ نظام الإصدار مكتبات مشتركة مع الرموز المصدّرة التالية:

مسار التثبيت الرموز التي تم تصديرها
/system/lib[64]/libexample.so all، framework_only
/apex/com.android.vndk.v${VER}/lib[64]/libexample.so all، vndk
/vendor/lib[64]/vndk/libexample.so all وvndk وvndk_ext

متطلبات الرموز التي يتم تصديرها

أداة فحص VNDK ABI لمقارنة واجهة التطبيق الثنائية (ABI) بصيغ مورّدي VNDK يتم تفريغ إضافات VNDK الخاصة بمرجع واجهة التطبيق الثنائية (ABI) ضمن prebuilts/abi-dumps/vndk

  • الرموز التي تمّ تصديرها من خلال خيارات مورّدي VNDK (مثل، /apex/com.android.vndk.v${VER}/lib[64]/libexample.so) يجب أن تكون متطابقة إلى (وليس المجموعات الرئيسية) للرموز المحددة في عمليات تفريغ واجهة التطبيق الثنائية (ABI).
  • الرموز التي تم تصديرها باستخدام إضافات VNDK (مثل /vendor/lib[64]/vndk/libexample.so) يجب أن يتجاوزان المحددة في عمليات تفريغ ABI.

في حال تعذّر تتبُّع خيارات مورّد VNDK أو إضافات VNDK المتطلبات أعلاه، ينتج عن مدقق VNDK ABI أخطاء إنشاء

استبعاد ملفات المصدر أو المكتبات المشتركة من خيارات المورّدين

لاستبعاد ملفات المصدر من صيغة المورّد، أضِفها إلى الموقع: exclude_srcs. وبالمثل، لضمان تنفيذ المكتبات المشتركة غير مرتبطة بمتغير البائع، فقم بإضافة هذه المكتبات إلى الموقع: exclude_shared_libs. مثلاً:

cc_library {
    name: "libexample_cond_exclude",
    srcs: ["fwk.c", "both.c"],
    shared_libs: ["libfwk_only", "libboth"],
    vendor_available: true,
    target: {
        vendor: {
            exclude_srcs: ["fwk.c"],
            exclude_shared_libs: ["libfwk_only"],
        },
    },
}

في هذا المثال، الصيغة الأساسية لـ libexample_cond_exclude يتضمن الرمز من fwk.c وboth.c ويعتمد على في المكتبات المشتركة libfwk_only وlibboth. تشير رسالة الأشكال البيانية يتضمن صيغة المورّد لـ libexample_cond_exclude الرمز فقط من both.c لأنه يتم استبعاد fwk.c من خلال الموقع "exclude_srcs". وبالمثل، يعتمد ذلك على المكتبة المشتركة فقط libboth لأنه يتم استبعاد libfwk_only من خلال الموقع "exclude_shared_libs".

تصدير العناوين من إضافات VNDK

قد تضيف إضافة VNDK فئات جديدة أو دوال جديدة إلى ملف VNDK مشترك المكتبة. ننصح بالاحتفاظ بهذه البيانات في عناوين مستقلة. وتجنُّب تغيير العناوين الحالية

على سبيل المثال، ملف عنوان جديد تم إنشاء include-ext/example/ext/feature_name.h لشركة VNDK الإضافة libexample_ext:

  • Android.bp
  • include-ext/example/ext/feature_name.h
  • تضمين/example/example.h
  • src/example.c
  • src/ext/feature_name.c

في Android.bp، libexample عملية تصدير include فقط، بينما تُصدِّر libexample_ext الاثنين include وinclude-ext ويضمن ذلك لن يتم تضمين feature_name.h بشكل غير صحيح من قِبل مستخدمي libexample:

cc_library {
    name: "libexample",
    srcs: ["src/example.c"],
    export_include_dirs: ["include"],
    vendor_available: true,
    vndk: {
        enabled: true,
    },
}

cc_library {
    name: "libexample_ext",
    srcs: [
        "src/example.c",
        "src/ext/feature_name.c",
    ],
    export_include_dirs: [
        "include",
        "include-ext",
    ],
    vendor: true,
    vndk: {
        enabled: true,
        extends: "libexample",
    },
}

إذا لم يكن فصل الإضافات عن ملفات الرؤوس المستقلة ممكنًا، سيتم هو إضافة #ifdef حارسًا. ومع ذلك، تأكد من أن جميع يضيف مستخدمو إضافة VNDK علامات التحديد. يمكنك تحديد cc_defaults لإضافة علامات تعريف إلى cflags والرابط المكتبات المشتركة مع shared_libs.

على سبيل المثال، لإضافة دالة عضو جديدة Example2::get_b() إلى إضافة VNDK libexample2_ext، يجب تعديل الإضافة الحالية ملف العنوان وإضافة واقي #ifdef:

#ifndef LIBEXAMPLE2_EXAMPLE_H_
#define LIBEXAMPLE2_EXAMPLE_H_

class Example2 {
 public:
  Example2();

  void get_a();

#ifdef LIBEXAMPLE2_ENABLE_VNDK_EXT
  void get_b();
#endif

 private:
  void *impl_;
};

#endif  // LIBEXAMPLE2_EXAMPLE_H_

جهاز cc_defaults باسم libexample2_ext_defaults هو محدد لمستخدمي libexample2_ext:

cc_library {
    name: "libexample2",
    srcs: ["src/example2.cpp"],
    export_include_dirs: ["include"],
    vendor_available: true,
    vndk: {
        enabled: true,
    },
}

cc_library {
    name: "libexample2_ext",
    srcs: ["src/example2.cpp"],
    export_include_dirs: ["include"],
    vendor: true,
    vndk: {
        enabled: true,
        extends: "libexample2",
    },
    cflags: [
        "-DLIBEXAMPLE2_ENABLE_VNDK_EXT=1",
    ],
}

cc_defaults {
    name: "libexample2_ext_defaults",
    shared_libs: [
        "libexample2_ext",
    ],
    cflags: [
        "-DLIBEXAMPLE2_ENABLE_VNDK_EXT=1",
    ],
}

يمكن لمستخدمي libexample2_ext ببساطة تضمين libexample2_ext_defaults في defaults الموقع:

cc_binary {
    name: "example2_user_executable",
    defaults: ["libexample2_ext_defaults"],
    vendor: true,
}

حِزم المنتجات

في نظام إصدار Android، المتغير PRODUCT_PACKAGES الملفات التنفيذية أو المكتبات المشتركة أو الحزم التي ينبغي المثبتة في الجهاز. التبعيات الانتقالية للقيم المحددة يتم تثبيت الوحدات ضمن الجهاز أيضًا.

في حال تفعيل BOARD_VNDK_VERSION، ستظل الوحدات ذات احصل على اشتراك خاص لـ vendor_available أو vndk.enabled العلاج. إذا كانت وحدة إطار العمل تعتمد على وحدة ذات vendor_available أو vndk.enabled، الصيغة الأساسية في مجموعة التثبيت المتعدِّدة. إذا كانت هناك وحدة تابعة للبائع تعتمد على وحدة تتضمّن vendor_available، يكون صيغة المورّد في مجموعة التثبيت المتعدِّدة. ومع ذلك، تتوفّر خيارات خاصة بالمورّدين من الوحدات مع vndk.enabled، سواءً كانت مستخدَمة في وحدات المورّدين أم لا.

عندما تكون التبعيات غير مرئية لنظام التصميم (مثل المكتبات المشتركة التي يمكن فتحها باستخدام dlopen() في وقت التشغيل)، عليك تحديد أسماء الوحدات في PRODUCT_PACKAGES لتثبيت تلك الوحدات بشكل صريح.

إذا كانت الوحدة تتضمّن vendor_available أو vndk.enabled، فإن اسم الوحدة يرمز إلى المتغير الأساسي لها. لتحديد المواصفات صيغة المورّد في PRODUCT_PACKAGES، عليك إلحاق .vendor اللاحقة إلى اسم الوحدة. مثلاً:

cc_library {
    name: "libexample",
    srcs: ["example.c"],
    vendor_available: true,
}

في هذا المثال، تعني libexample /system/lib[64]/libexample.so وlibexample.vendor وتعني /vendor/lib[64]/libexample.so. للتثبيت /vendor/lib[64]/libexample.so، إضافة libexample.vendor إلى PRODUCT_PACKAGES:

PRODUCT_PACKAGES += libexample.vendor