استخدام المكتبات المصمَّمة مسبقًا

وتدعم اتفاقية عدم الإفشاء استخدام المكتبات المصممة مسبقًا، سواء الثابتة أو المشتركة. هناك حالتان أساسيتان لاستخدام هذه الوظيفة:

  • توزيع مكتباتك على مطوّري برامج NDK تابعين لجهات خارجية بدون توزيع مصادرك
  • استخدام إصدار مُصمَّم مسبقًا من مكتباتك لتسريع عملية إنشاء الإصدارات

توضّح هذه الصفحة كيفية استخدام المكتبات المصمَّمة مسبقًا.

توضيح مكتبة مُنشأة مسبقًا

يجب الإفصاح عن كل مكتبة مصمّمة مسبقًا تستخدمها كوحدة مستقلة. ولإجراء ذلك، اتّبِع الخطوات التالية:

  1. أدخِل اسمًا للوحدة. وليس بالضرورة أن يكون هذا الاسم هو نفسه اسم المكتبة التي تم إنشاؤها مسبقًا.
  2. في ملف Android.mk الخاص بالوحدة، عليك تخصيص مسار LOCAL_SRC_FILES للمكتبة المصمّمة مسبقًا التي توفّرها. حدِّد المسار بالنسبة إلى قيمة المتغيّر LOCAL_PATH.

  3. يمكنك تضمين السمة PREBUILT_SHARED_LIBRARY أو PREBUILT_STATIC_LIBRARY، بناءً على ما إذا كنت تستخدم مكتبة مشتركة (.so) أو ثابتة (.a).

إليك مثال بسيط يُفترض أنّ المكتبة libfoo.so المُصمَّمة مسبقًا تتوفّر في الدليل نفسه الذي يتضمّنه ملف Android.mk.

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.so
include $(PREBUILT_SHARED_LIBRARY)

في هذا المثال، يكون اسم الوحدة هو نفسه اسم المكتبة التي تم إنشاؤها مسبقًا.

يعمل نظام الإصدار على وضع نسخة من مكتبتك المشتركة مسبقًا في $PROJECT/obj/local، ونسخة أخرى من معلومات تصحيح الأخطاء يتم فيها إزالة المعلومات المتوفرة في $PROJECT/libs/<abi>. $PROJECT هو الدليل الجذري لمشروعك.

الإشارة إلى المكتبة المعدة مسبقًا من الوحدات الأخرى

للإشارة إلى مكتبة معدّة مسبقًا من وحدات أخرى، عليك تحديد اسمها بصفتها قيمة المتغيّر LOCAL_STATIC_LIBRARIES أو LOCAL_SHARED_LIBRARIES في الملفات Android.mk المرتبطة بهذه الوحدات الأخرى.

على سبيل المثال، قد يكون وصف الوحدة التي تستخدم libfoo.so كما يلي:

include $(CLEAR_VARS)
LOCAL_MODULE := foo-user
LOCAL_SRC_FILES := foo-user.c
LOCAL_SHARED_LIBRARIES := foo-prebuilt
include $(BUILD_SHARED_LIBRARY)

هنا، LOCAL_MODULE هو اسم الوحدة التي تشير إلى الإصدار المسبق، وLOCAL_SHARED_LIBRARIES هو اسم الوحدة الأساسية المعدّة مسبقًا.

تصدير العناوين للمكتبات المصمَّمة مسبقًا

يعتمد الرمز في foo-user.c على تعريفات معيّنة تكون عادةً في ملف عنوان، مثل foo.h، موزّعة مع مكتبة معدّة مسبقًا. على سبيل المثال، قد يحتوي سطر foo-user.c على ما يلي:

#include <foo.h>

وفي هذه الحالة، يجب تقديم العنوان ومسار الإضافة إلى برنامج التجميع عند إنشاء وحدة "foo-user". وهناك طريقة بسيطة لإنجاز هذه المهمة، وهي استخدام عمليات التصدير في تعريف الوحدة المصمّمة مسبقًا. على سبيل المثال، طالما أنّ العنوان foo.h يقع ضمن دليل include المرتبط بالوحدة المحدّدة مسبقًا، يمكنك الإشارة إليها على النحو التالي:

include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

يضمن التعريف هنا LOCAL_EXPORT_C_INCLUDES أن يُصدِّر نظام الإصدار المسار إلى دليل المكتبة include المُنشأ مسبقًا، مع إضافة هذا المسار في قيمة قيمة LOCAL_C_INCLUDES للوحدة التي تعتمد عليها.

تسمح هذه العملية لنظام الإصدار بالعثور على العناوين اللازمة.

تصحيح أخطاء المكتبات المصمَّمة مسبقًا

ننصح بتوفير مكتبات مشتركة تم إنشاؤها مُسبقًا وتحتوي على رموز تصحيح الأخطاء. يزيل نظام الإصدار NDK الرموز دائمًا من إصدار المكتبة التي يثبّتها في $PROJECT/libs/<abi>/، ولكن يمكنك استخدام إصدار تصحيح الأخطاء لتصحيح الأخطاء من خلال ndk-gdb.

اختيار ميزات AAB للمكتبات التي تم إنشاؤها مسبقًا

يجب التأكد من اختيار النسخة المناسبة من المكتبة المشتركة المُعدة مسبقًا لواجهة التطبيق الثنائية (ABI) المستهدفة. يمكن أن يشير المتغيّر TARGET_ARCH_ABI في الملف Android.mk إلى نظام الإصدار إلى النسخة المناسبة من المكتبة.

على سبيل المثال، لنفترض أنّ مشروعك يحتوي على إصدارَين من المكتبة: libfoo.so:

armeabi/libfoo.so
x86/libfoo.so

يعرض المقتطف التالي كيفية استخدام TARGET_ARCH_ABI حتى يختار نظام الإصدار الإصدار المناسب من المكتبة:

include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libfoo.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

إذا حدّدت القيمة armeabi على أنّها TARGET_ARCH_ABI، سيستخدم نظام الإصدار إصدار libfoo.so المتوفّر في الدليل armeabi. إذا حدّدت القيمة x86 على أنها TARGET_ARCH_ABI، سيستخدم نظام الإصدار الإصدار في دليل x86.