توضّح هذه الصفحة بنية ملف إصدار Android.mk
المُستخدَم من خلال
ndk-build
نظرة عامة
يتوفّر ملف Android.mk
في دليل فرعي من دليل jni/
الخاص بمشروعك، ويصف هذا الملف مصادرك والمكتبات المشتركة لنظام الإنشاء.
وهو في الواقع جزء صغير من ملف makefile في GNU يفكّكه نظام الإنشاء مرة واحدة أو
أكثر. يُعد ملف Android.mk
مفيدًا لتحديد الإعدادات على مستوى المشروع التي
يتبقى Application.mk
ونظام التصميم ومتغيرات البيئة.
غير محددة. ويمكنها أيضًا إلغاء الإعدادات على مستوى المشروع للوحدات المحدّدة.
تتيح لك بنية Android.mk
تجميع مصادرك في وحدات.
الوحدة هي إما مكتبة ثابتة أو مكتبة مشتركة أو ملف تنفيذي مستقل. يمكنك تحديد وحدة واحدة أو أكثر في كل ملف Android.mk
،
ويمكنك استخدام ملف المصدر نفسه في وحدات متعددة. نظام التصميم فقط
تضع المكتبات المشتركة في حزمة التطبيق الخاصة بك. بالإضافة إلى ذلك،
يمكن للمكتبات إنشاء مكتبات مشتركة.
بالإضافة إلى حزم المكتبات، يعالج نظام الإنشاء مجموعة متنوعة من
التفاصيل الأخرى نيابةً عنك. على سبيل المثال، لا تحتاج إلى إدراج ملفات الرأس أو التبعيات الواضحة
بين الملفات التي تم إنشاؤها في ملف Android.mk
. يحسب نظام إنشاء NDK
هذه العلاقات تلقائيًا نيابةً عنك. نتيجةً لذلك،
من المفترض أن تتمكّن من الاستفادة من التوافق الجديد مع سلسلة الأدوات أو النظام الأساسي في الإصدارات القادمة من NDK
بدون الحاجة إلى تعديل ملف Android.mk
.
تشبه بنية هذا الملف إلى حد كبير البنية المستخدَمة في ملفات Android.mk
الموزَّعة مع مشروع Android Open Source Project الكامل. على الرغم من أنّ نظام الإنشاء
الذي يستخدمهما مختلف، إلا أنّ تشابههما هو قرار intentional
تصميمي يهدف إلى تسهيل إعادة استخدام
الرمز المصدر للمكتبات الخارجية من قِبل مطوّري التطبيقات.
الأساسيات
قبل استكشاف بناء الجملة بالتفصيل، من المفيد البدء بفهم
أساسيات محتوى ملف Android.mk
. يستخدم هذا القسم
Android.mk
في نموذج Hello-JNI نحو تلك النهاية، لتوضيح الدور
يتم تشغيل كل سطر في الملف فيه.
يجب أن يبدأ ملف Android.mk
بتحديد المتغيّر LOCAL_PATH
:
LOCAL_PATH := $(call my-dir)
يشير هذا المتغيّر إلى موقع الملفات المصدر في شجرة التطوير. في هذه الحالة، تُرجع دالة الماكرو my-dir
، التي يوفّرها نظام الإنشاء،
مسار الدليل الحالي (الدليل الذي يحتوي على ملفAndroid.mk
نفسه).
يعرِض السطر التالي المتغيّر CLEAR_VARS
الذي يقدّم نظام الإنشاء
قيمته.
include $(CLEAR_VARS)
يشير المتغير CLEAR_VARS
إلى ملف GNU Makefile خاص يحذف العديد
متغيرات LOCAL_XXX
لك، مثل LOCAL_MODULE
وLOCAL_SRC_FILES
و
LOCAL_STATIC_LIBRARIES
يُرجى العِلم أنّه لا يتم محو LOCAL_PATH
. هذا النمط
يجب أن يحتفظ المتغير بقيمته لأن النظام يحلل جميع ملفات التحكم في الإصدار
في سياق تنفيذ GNU واحد تكون فيه جميع المتغيرات عمومية. يجب
(إعادة) تعريف هذا المتغيّر قبل وصف كل وحدة.
بعد ذلك، يخزن المتغير LOCAL_MODULE
اسم الوحدة التي تريد
استخدم هذا المتغير مرة واحدة لكل وحدة في التطبيق.
LOCAL_MODULE := hello-jni
يجب أن يكون اسم كل وحدة فريدًا وألا يحتوي على أي مسافات. يعتمد نظام التصميم،
عند إنشاء ملف المكتبة المشتركة النهائي، يضيف تلقائيًا
بادئة ولاحقة إلى الاسم الذي تحدّده للسمة LOCAL_MODULE
. على سبيل المثال، يؤدي المثال الذي يظهر أعلاه إلى إنشاء مكتبة باسم
libhello-jni.so
.
يسرد السطر التالي ملفات المصدر، مع ترك مسافات بين ملفات متعددة:
LOCAL_SRC_FILES := hello-jni.c
يجب أن يحتوي المتغيّر LOCAL_SRC_FILES
على قائمة بملفات المصدر C و/أو C++.
لتضمينها في وحدة.
يساعد السطر الأخير النظام في ربط كل شيء معًا:
include $(BUILD_SHARED_LIBRARY)
يشير المتغيّر BUILD_SHARED_LIBRARY
إلى نص برمجي لملف GNU Makefile يجمع
جميع المعلومات التي حدّدتها في متغيّرات LOCAL_XXX
منذinclude
الأكثر حداثة. يحدّد هذا النص البرمجي ما يجب إنشائه وكيفية تنفيذه.
هناك أمثلة أكثر تعقيدًا في أدلة النماذج، بالإضافة إلى التعليقات
يمكنك الاطّلاع على Android.mk
ملف. بالإضافة إلى ذلك، مثال: نشاط أصلي
شرحًا تفصيليًا لملف Android.mk
الخاص بهذا النموذج. أخيرًا، تقدّم المتغيّرات والوحدات النمطية مزيدًا من المعلومات عن المتغيّرات من
هذا القسم.
المتغيّرات ووحدات الماكرو
يوفّر نظام التصميم العديد من المتغيرات المحتمَلة لاستخدامها في ملف Android.mk
.
وتأتي العديد من هذه المتغيّرات مع قيم محدّدة مسبقًا. أما العناصر الأخرى، فيمكنك تحديدها بنفسك.
بالإضافة إلى هذه المتغيّرات، يمكنك أيضًا تحديد المتغيّرات العشوائية الخاصة بك. إذا قمت بذلك، ضع مع الأخذ في الاعتبار أن نظام إصدار NDK يحتفظ بأسماء المتغيرات التالية:
- الأسماء التي تبدأ بـ
LOCAL_
، مثلLOCAL_MODULE
- الأسماء التي تبدأ بـ
PRIVATE_
أوNDK_
أوAPP
يستخدم نظام الإنشاء هذه الإعدادات داخليًا. - الأسماء المكتوبة بأحرف صغيرة، مثل
my-dir
. ويستخدم نظام التصميم هذه الميزات داخليًا، حيث أيضًا.
إذا كنت بحاجة إلى تحديد متغيّرات تسهيل الاستخدام في ملف Android.mk
، ننصحك بprepending MY_
إلى أسمائها.
متغيّرات تضمين محدّدة من NDK
يتناول هذا القسم متغيّرات GNU Make التي يحدّدها نظام الإنشاء
قبل تحليل ملف Android.mk
. في ظل ظروف معينة، يتراجع NDK
قد يحلّل ملف Android.mk
الخاص بك عدّة مرات باستخدام تعريف مختلف.
لبعض هذه المتغيرات في كل مرة.
محو
يشير هذا المتغيّر إلى نص برمجي للإنشاء يلغِي تحديد جميع متغيّرات LOCAL_XXX
تقريبًا المدرَجة في قسم "المتغيّرات التي يحدّدها المطوّر" أدناه. استخدام هذه المسودة
لتضمين هذا البرنامج النصي قبل وصف وحدة جديدة. بناء الجملة
يتم استخدامها وهي:
include $(CLEAR_VARS)
إنشاء_قابلة للتنفيذ
يشير هذا المتغير إلى نص برمجي للإنشاء يجمع كل المعلومات حول
الوحدة التي وفّرتها في متغيّرات LOCAL_XXX
، وتحدّد كيفية
إنشاء هدف قابل للتنفيذ من المصادر التي أدرجتها. يُرجى العِلم أنّ استخدام هذا الرمز المبرمَج
يتطلّب منك تحديد قيم للمتغيّرينLOCAL_MODULE
و
LOCAL_SRC_FILES
على الأقل (لمزيد من المعلومات عن هذين المتغيّرين، يُرجى الاطّلاع على متغيّرات وصف الوحدة).
بناء الجملة لاستخدام هذا المتغير هو:
include $(BUILD_EXECUTABLE)
BUILD_SHARED_LIBRARY
يشير هذا المتغيّر إلى نص برمجي للإنشاء يجمع كل المعلومات عن
الوحدة التي قدّمتها في متغيّرات LOCAL_XXX
، ويحدّد كيفية
إنشاء مكتبة مشترَكة مستهدَفة من المصادر التي أدرجتها. يُرجى العِلم أنّ استخدام هذا الرمز المبرمَج
يتطلّب منك تحديد قيم للمتغيّرينLOCAL_MODULE
و
LOCAL_SRC_FILES
على الأقل (لمزيد من المعلومات عن هذين المتغيّرين، يُرجى الاطّلاع على متغيّرات وصف الوحدة).
بناء الجملة لاستخدام هذا المتغيّر هو:
include $(BUILD_SHARED_LIBRARY)
يؤدي متغيّر المكتبة المشتركة إلى أن ينشئ نظام الإنشاء ملف مكتبة
بإضافة .so
.
BUILD_STATIC_LIBRARY
تمثّل هذه السمة صيغة من BUILD_SHARED_LIBRARY
تُستخدم لإنشاء مكتبة ثابتة. لا ينسخ
نظام الإنشاء المكتبات الثابتة إلى مشروعك/حِزمك، ولكن يمكنه
استخدامها لإنشاء مكتبات مشترَكة (راجِع LOCAL_STATIC_LIBRARIES
و
LOCAL_WHOLE_STATIC_LIBRARIES
أدناه). بناء الجملة لاستخدام هذا المتغير هو:
include $(BUILD_STATIC_LIBRARY)
يتسبب متغير المكتبة الثابتة في إنشاء نظام التصميم لمكتبة باستخدام
الإضافة ".a
".
PREBUILT_SHARED_LIBRARY
يشير إلى نص برمجي للإنشاء يُستخدَم لتحديد مكتبة مشتركة مُجمَّعة مسبقًا. إلغاء الإعجاب في
حالة BUILD_SHARED_LIBRARY
وBUILD_STATIC_LIBRARY
، تكون هنا قيمة
لا يمكن أن يكون LOCAL_SRC_FILES
ملف مصدر. بدلاً من ذلك، يجب أن يكون مسارًا واحدًا
مكتبة مشتركة تم إنشاؤها مسبقًا، مثل foo/libfoo.so
. بناء جملة استخدام هذا المتغيّر هو:
include $(PREBUILT_SHARED_LIBRARY)
يمكنك أيضًا الرجوع إلى مكتبة تم إنشاؤها مسبقًا في وحدة أخرى باستخدام
متغيّر "LOCAL_PREBUILTS
" لمزيد من المعلومات عن استخدام الوحدات المُسبقة الإنشاء، راجِع مقالة
استخدام المكتبات المُسبقة الإنشاء.
PREBUILT_STATIC_LIBRARY
يُرجى الاطّلاع على PREBUILT_SHARED_LIBRARY
، ولكن بالنسبة إلى مكتبة ثابتة مُسبقة الإنشاء. لمزيد من المعلومات عن استخدام الوحدات المُسبقة الإنشاء، يُرجى الاطّلاع على استخدام المكتبات المُسبقة الإنشاء.
متغيّرات المعلومات المستهدفة
يحلّل نظام الإنشاء Android.mk
مرة واحدة لكل ABI محدّد من خلال المتغيّر APP_ABI
، والذي يتم تحديده عادةً في ملف Application.mk
. إذا APP_ABI
تساوي all
، ثم يحلّل نظام التصميم Android.mk
مرة واحدة لكل ABI وNDK.
والدعم. يصف هذا القسم المتغيرات التي يحددها نظام الإصدار في كل مرة
وتحلّل Android.mk
.
TARGET_ARCH
مجموعة وحدة المعالجة المركزية التي يستهدفها نظام التصميم أثناء تحليله لجهاز Android.mk
هذا
الملف. سيكون هذا المتغيّر أحد القيم التالية: arm
أو arm64
أو x86
أو x86_64
.
المنصة المستهدفة
رقم مستوى واجهة برمجة تطبيقات Android الذي يستهدفه نظام التصميم أثناء تحليل ملف
Android.mk
هذا. على سبيل المثال، تتوافق صور نظام Android 5.1 مع
مستوى واجهة برمجة التطبيقات 22 لنظام Android: android-22
. للحصول على قائمة كاملة بأسماء المنصات
صور نظام Android المقابلة، يمكنك الاطّلاع على واجهات برمجة التطبيقات الأصلية. يوضِّح المثال التالي بنية استخدام هذا المتغيّر:
ifeq ($(TARGET_PLATFORM),android-22)
# ... do something ...
endif
TARGET_ARCH_ABI
واجهة برمجة التطبيقات التي يستهدفها نظام التصميم أثناء تحليل ملف Android.mk
هذا.
يعرض الجدول 1 إعدادات ABI المُستخدَمة لكل وحدة معالجة مركزية (CPU) وبنية متوافقة.
الجدول 1. إعدادات واجهة التطبيق الثنائية (ABI) لوحدات المعالجة المركزية (CPU) والبُنى المختلفة.
وحدة المعالجة المركزية (CPU) والبنية الأساسية | الإعدادات |
---|---|
معالج ARMv7 | armeabi-v7a |
ARMv8 AArch64 | arm64-v8a |
i686 | x86 |
X86- 64 | x86_64 |
يوضّح المثال التالي كيفية التحقّق من ARMv8 AArch64 كمجموعة ملف تعريف ABI ووحدة المعالجة المركزية المستهدفة:
ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
# ... do something ...
endif
لمزيد من التفاصيل حول واجهات ABI للبنية ومشاكل التوافق المرتبطة بها، يُرجى الاطّلاع على واجهات ABI لنظام Android.
ستتضمّن ABIs المستهدَفة الجديدة في المستقبل قيمًا مختلفة.
TARGET_ABI
تسلسل لمستوى واجهة برمجة التطبيقات المستهدَف لنظام التشغيل Android وواجهة ABI إنها مفيدة بشكل خاص عندما تريد الاختبار على صورة نظام مستهدفة محددة لجهاز حقيقي. على سبيل المثال، للتحقّق من توفّر جهاز ARM بسعة 64 بت يعمل بالمستوى 22 من واجهة برمجة تطبيقات Android:
ifeq ($(TARGET_ABI),android-22-arm64-v8a)
# ... do something ...
endif
متغيّرات وصف الوحدة
تصف المتغيرات الواردة في هذا القسم الوحدة الخاصة بك بنظام الإصدار. يجب أن يتّبع كل وصف للوحدة الخطوات الأساسية التالية:
- قم بتهيئة أو إلغاء تحديد المتغيرات المرتبطة بالوحدة، باستخدام
متغيّر "
CLEAR_VARS
" - حدِّد قيمًا للمتغيّرات المستخدَمة لوصف الوحدة.
- اضبط نظام إنشاء NDK لاستخدام نصّ البرمجة المناسب لإنشاء الوحدة،
باستخدام المتغيّر
BUILD_XXX
.
المسار المحلي
يُستخدَم هذا المتغيّر لتحديد مسار الملف الحالي. يجب تحديده
في بداية ملف Android.mk
. يوضح المثال التالي كيفية القيام
لذلك:
LOCAL_PATH := $(call my-dir)
لا يؤدي النص البرمجي الذي يشير إليه CLEAR_VARS
إلى محو هذا المتغيّر. ولذلك،
ما عليك سوى تحديده مرة واحدة، حتى إذا كان ملفك Android.mk
يصف وحدات متعددة.
الوحدة المحلية
يُخزِّن هذا المتغيّر اسم وحدتك. يجب أن يكون فريدًا بين جميع الوحدات
أسماء، ويجب ألا يحتوي على أي مسافات. يجب تحديدها قبل تضمين أي
نصوص برمجية (باستثناء النص البرمجي المخصّص لـ CLEAR_VARS
). لست بحاجة إلى إضافة البادئة lib
أو إضافة امتداد الملف .so
أو .a
، لأنّ نظام الإنشاء يُجري هذه
التعديلات تلقائيًا. في ملفّي Android.mk
وApplication.mk
، يمكنك الإشارة إلى وحدتك باسمها غير المعدَّل. على سبيل المثال، يؤدي السطر التالي
إلى إنشاء وحدة مكتبة مشتركة باسم libfoo.so
:
LOCAL_MODULE := "foo"
إذا أردت أن يكون للوحدة التي تم إنشاؤها اسم غير lib
+ قيمة
LOCAL_MODULE
، يمكنك استخدام المتغير LOCAL_MODULE_FILENAME
لتحديد
التي تم إنشاؤها كاسم من اختيارك، بدلاً من ذلك.
LOCAL_MODULE_FILENAME
يتيح لك هذا المتغيّر الاختياري إلغاء الأسماء التي يستخدمها نظام الإنشاء
تلقائيًا للملفات التي ينشئها. على سبيل المثال، إذا كان اسم
LOCAL_MODULE
هو foo
، يمكنك إجبار النظام على استدعاء الملف الذي ينشئه
libnewfoo
. يوضّح المثال التالي كيفية تحقيق ذلك:
LOCAL_MODULE := foo
LOCAL_MODULE_FILENAME := libnewfoo
بالنسبة إلى وحدة مكتبة مشتركة، سينشئ هذا المثال ملفًا يسمى
libnewfoo.so
LOCAL_SRC_FILES
يحتوي هذا المتغير على قائمة بملفات المصدر التي يستخدمها نظام الإصدار
لإنشاء الوحدة. لا تُدرِج سوى الملفات التي ينقلها نظام الإنشاء
فعليًا إلى المُجمِّع، لأنّ نظام الإنشاء يحسب تلقائيًا أي تبعيات مرتبطة
. يُرجى العلم أنّه يمكنك استخدام كلّ من المسارات النسبية (بالنسبة إلى LOCAL_PATH
) ومسارات الملفات المطلقة.
نوصي بتجنب مسارات الملفات المطلقة؛ تؤدي المسارات النسبية إلى جعل Android.mk
بشكل أكثر سهولة.
LOCAL_CPP_امتداد
يمكنك استخدام هذا المتغير الاختياري للإشارة إلى امتداد ملف بخلاف
.cpp
لملفات مصدر C++. على سبيل المثال، يغيِّر السطر التالي دالة الرسم
الإضافة إلى .cxx
. (يجب أن يتضمّن الإعداد النقطة).
LOCAL_CPP_EXTENSION := .cxx
يمكنك استخدام هذا المتغيّر لتحديد عدة إضافات. على سبيل المثال:
LOCAL_CPP_EXTENSION := .cxx .cpp .cc
LOCAL_CPP_FEATURES
يمكنك استخدام هذا المتغير الاختياري للإشارة إلى أن التعليمات البرمجية تعتمد على بيانات محددة
ميزات C++. ويعمل على تفعيل علامات المُجمِّع والرابط الصحيحة أثناء عملية الإنشاء.
بالنسبة إلى الملفات الثنائية التي تم إنشاؤها مسبقًا، يعلن هذا المتغير أيضًا عن الميزات
البرنامج الثنائي على هذا الأساس، مما يساعد على ضمان عمل الربط النهائي بشكل صحيح. أر
ننصحك باستخدام هذا المتغيّر بدلاً من تفعيل السمة -frtti
-fexceptions
في تعريف LOCAL_CPPFLAGS
مباشرةً.
يتيح استخدام هذا المتغير لنظام الإصدار استخدام العلامات المناسبة
لكل وحدة. استخدام LOCAL_CPPFLAGS
يجعل المحول البرمجي يستخدم كل ما هو محدد
لجميع الوحدات، بصرف النظر عن الحاجة الفعلية.
على سبيل المثال، للإشارة إلى استخدام الرمز البرمجي "RTTI" (معلومات نوع وقت التشغيل)، كتابة:
LOCAL_CPP_FEATURES := rtti
للإشارة إلى أن التعليمات البرمجية تستخدم استثناءات C++، اكتب:
LOCAL_CPP_FEATURES := exceptions
يمكنك أيضًا تحديد قيم متعددة لهذا المتغيّر. مثلاً:
LOCAL_CPP_FEATURES := rtti features
ولا يهمّ الترتيب الذي تصف به القيم.
LOCAL_C_INCLUDES
يمكنك استخدام هذا المتغيّر الاختياري لتحديد قائمة بالمسارات، بالنسبة إلى ملف root
في NDK، لإضافتها إلى مسار البحث عن الضمائم عند تجميع كل
المصادر (C وC++ وAssembly). مثلاً:
LOCAL_C_INCLUDES := sources/foo
أو حتى:
LOCAL_C_INCLUDES := $(LOCAL_PATH)/<subdirectory>/foo
حدِّد هذا المتغيّر قبل ضبط أيّ علامات تضمين مقابلة من خلال
LOCAL_CFLAGS
أو LOCAL_CPPFLAGS
.
يستخدم نظام التصميم أيضًا مسارات LOCAL_C_INCLUDES
تلقائيًا عند إطلاقه.
تصحيح الأخطاء الأصلي باستخدام ndk-gdb.
LOCAL_ASFLAGS
علامات سيتم تمريرها إلى Clang عند إنشاء ملفات .s
أو .S
.
LOCAL_ASMFLAGS
علامات سيتم تمريرها إلى yasm عند إنشاء ملفات .asm
.
المحلية
العلامات التي سيتم تمريرها إلى Clang عند إنشاء المباني C وC++ وبعض المباني
(.s
و.S
، ولكن ليس .asm
). يمكن أن تساعدك القدرة على القيام بذلك
أن تكون مفيدة في تحديد تعريفات ماكرو إضافية أو خيارات تجميع إضافية. استخدام
LOCAL_CPPFLAGS
لتحديد علامات لـ C++ فقط. استخدام LOCAL_CONLYFLAGS
من أجل
لتحديد علامات C فقط.
جرِّب عدم تغيير مستوى التحسين/تصحيح الأخطاء في ملف Android.mk
.
يمكن لنظام التصميم معالجة هذا الإعداد تلقائيًا نيابةً عنك، وذلك باستخدام
ذات صلة في ملف Application.mk
. القيام بذلك بهذه الطريقة يسمح
لإنشاء ملفات بيانات مفيدة يتم استخدامها أثناء تصحيح الأخطاء.
يمكن تحديد مسارات تضمين إضافية بكتابة:
LOCAL_CFLAGS += -I<path>,
ومع ذلك، من الأفضل استخدام LOCAL_C_INCLUDES
لهذا الغرض، لأنّه
يمكن من خلال ذلك أيضًا استخدام المسارات المتاحة لتصحيح الأخطاء الأصلي باستخدام
ndk-gdb.
LOCAL_CONLYFLAGS
علامات سيتم تمريرها إلى Clang عند تجميع مصادر C. إلغاء الإعجاب
لن يتم تمرير LOCAL_CFLAGS
، LOCAL_CONLYFLAGS
إلى Clang عند التجميع.
C++ أو مصادر التجميع.
LOCAL_CPPFLAGS
مجموعة اختيارية من علامات المحول البرمجي التي سيتم تمريرها عند إنشاء مصدر C++
الملفات فقط. ستظهر بعد LOCAL_CFLAGS
في سطر تعليمات المُجمِّع. استخدِم LOCAL_CFLAGS
لتحديد علامات لكل من C وC++.
LOCAL_STATIC_LIBRARIES
يُخزن هذا المتغير قائمة وحدات المكتبات الثابتة التي الوحدة النمطية.
إذا كانت الوحدة الحالية مكتبة مشتركة أو ملف قابل للتنفيذ، سيؤدي هذا المتغيّر إلى فرض ربط هذه المكتبات بالملف الثنائي الناتج.
إذا كانت الوحدة الحالية هي مكتبة ثابتة، فإن هذا المتغير يشير ببساطة إلى أن وحدات أخرى اعتمادًا على الوحدة الحالية سوف تعتمد أيضًا على القائمة المكتبات.
LOCAL_SHARED_LIBRARIES
يمثّل هذا المتغيّر قائمة وحدات المكتبات المشتركة التي تظهر فيها هذه الوحدة. حسب وقت التشغيل تكون هذه المعلومات ضرورية في وقت الربط، ولتضمين المعلومات المقابلة في الملف الذي تم إنشاؤه.
LOCAL_WHOLE_STATIC_LIBRARIES
هذا المتغيّر هو أحد متغيرات LOCAL_STATIC_LIBRARIES
، ويوضّح أن
أن يتعامل برنامج الربط مع وحدات المكتبة المرتبطة بها على أنّها أرشيفات كاملة. للحصول على
مزيد من المعلومات عن الأرشيفات الكاملة، يُرجى الاطّلاع على مستندات GNU ld للتعرّف على العلامة
--whole-archive
.
يكون هذا المتغيّر مفيدًا عند توفّر تبعيات دائرية بين عدة مكتبات static. وعند استخدام هذا المتغير لإنشاء مكتبة مشتركة، إجبار نظام الإصدار على إضافة جميع ملفات الكائنات من مكتباتك الثابتة إلى ملف الثنائي النهائي. لا ينطبق ذلك، مع ذلك، عند إنشاء ملفات تنفيذية.
LOCAL_LDLIBS
يحتوي هذا المتغيّر على قائمة بعلامات الربط الإضافية لاستخدامها في إنشاء مكتبتك المشترَكة أو الملف القابل للتنفيذ. ويتيح لك استخدام البادئة -l
لتمرير اسم مكتبات نظام معيّنة. على سبيل المثال، يخبر المثال التالي
أداة الربط لإنشاء وحدة ترتبط بـ /system/lib/libz.so
عند التحميل
الوقت:
LOCAL_LDLIBS := -lz
للاطّلاع على قائمة مكتبات النظام المعروضة التي يمكنك الربط بها في إصدار NDK هذا، يُرجى الاطّلاع على واجهات برمجة التطبيقات الأصلية.
LOCAL_LDFLAGS
قائمة علامات الربط الأخرى التي يستخدمها نظام الإنشاء عند إنشاء
المكتبة المشتركة أو الملف القابل للتنفيذ على سبيل المثال، لاستخدام أداة الربط ld.bfd
على
ARM/X86:
LOCAL_LDFLAGS += -fuse-ld=bfd
LOCAL_ALLOW_UNDEFINED_SYMBOLS
بشكلٍ تلقائي، عندما يواجه نظام الإنشاء مرجعًا غير محدّد أثناء محاولة إنشاء ملف مشترَك، سيُرسِل خطأ رمز غير محدّد. يمكن أن يساعدك هذا الخطأ في رصد الأخطاء في رمز المصدر.
لإيقاف عملية التحقّق هذه، عليك ضبط هذا المتغيّر على "true
". لاحظ أن هذا الإعداد قد
إلى تحميل المكتبة المشتركة في وقت التشغيل.
LOCAL_ARM_MODE
ينشئ نظام التصميم تلقائيًا برامج ثنائية مستهدفة من ARM في وضع الدمج.
حيث يكون عرض كل تعليمات 16 بت وترتبط بمكتبات STL
دليل thumb/
. يؤدي تحديد هذا المتغيّر على أنّه arm
إلى إجبار نظام الإنشاء على
إنشاء ملفات الوحدات في وضع arm
بسعة 32 بت. يوضّح المثال التالي كيفية إجراء ذلك:
LOCAL_ARM_MODE := arm
يمكنك أيضًا توجيه نظام التصميم لإنشاء مصادر محدّدة فقط في arm
.
من خلال إلحاق اللاحقة .arm
بأسماء الملفات المصدر. على سبيل المثال،
في المثال التالي، يطلب نظام التصميم تجميع bar.c
دائمًا في وضع ARM،
ولكن لإنشاء foo.c
وفقًا لقيمة LOCAL_ARM_MODE
.
LOCAL_SRC_FILES := foo.c bar.c.arm
LOCAL_ARM_NEON
لا يهمّ هذا المتغيّر إلا عند استهداف ABI armeabi-v7a
. أُنشأها جون هنتر، الذي كان متخصصًا
يسمح باستخدام جوهرات التجميع الأساسي لـ ARM Advanced SIMD (NEON) في C وC++
بالإضافة إلى تعليمات NEON في ملفات التجميع.
تجدر الإشارة إلى أنّ بعض وحدات المعالجة المركزية (CPU) المستندة إلى ARMv7 لا تتوافق مع إضافات مجموعة تعليمات NEON. ولهذا السبب، يجب رصد بيئة التشغيل لتتمكّن من استخدام التطبيق بأمان. هذا الرمز في وقت التشغيل. لمزيد من المعلومات، يُرجى الاطّلاع على مقالة التوافق مع Neon وميزات وحدة المعالجة المركزية.
بدلاً من ذلك، يمكنك استخدام اللاحقة .neon
لتحديد أنّ نظام الإنشاء
لا يُجمِّع سوى ملفات مصدر معيّنة تتيح استخدام NEON. في المثال التالي،
يُنشئ نظام الإنشاء foo.c
مع دعم thumb وNEON، وbar.c
مع
دعم thumb، وzoo.c
مع دعم ARM وNEON:
LOCAL_SRC_FILES = foo.c.neon bar.c zoo.c.arm.neon
في حال استخدام كلتا اللاحقتَين، يجب أن يسبق .arm
.neon
.
LOCAL_DISABLE_FORMAT_STRING_CHECKS
يجمع نظام الإصدار تلقائيًا الرمز البرمجي مع حماية سلسلة التنسيق. التنفيذ
لذلك تفرض خطأ في برنامج التحويل البرمجي إذا تم استخدام سلسلة تنسيق غير ثابتة في
بدالة printf
. تكون هذه الحماية مفعّلة تلقائيًا، ولكن يمكنك إيقافها
من خلال ضبط قيمة هذا المتغيّر على true
. لا ننصح بإجراء ذلك
بدون سبب وجيه.
LOCAL_EXPORT_CFLAGS
يسجِّل هذا المتغيّر مجموعة من علامات مُجمِّع C/C++ لإضافتها إلى LOCAL_CFLAGS
تعريف أي وحدة أخرى تستخدِم هذه الوحدة من خلال المتغيّرات
LOCAL_STATIC_LIBRARIES
أو LOCAL_SHARED_LIBRARIES
.
على سبيل المثال، لنأخذ المكوّنَين التاليَين: foo
وbar
، اللذان
يعتمدان على foo
:
include $(CLEAR_VARS)
LOCAL_MODULE := foo
LOCAL_SRC_FILES := foo/foo.c
LOCAL_EXPORT_CFLAGS := -DFOO=1
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := bar
LOCAL_SRC_FILES := bar.c
LOCAL_CFLAGS := -DBAR=2
LOCAL_STATIC_LIBRARIES := foo
include $(BUILD_SHARED_LIBRARY)
هنا، يمرر نظام التصميم العلامتين -DFOO=1
و-DBAR=2
إلى برنامج التجميع
عند إنشاء bar.c
. وتُضيف أيضًا علامات التصدير إلى
LOCAL_CFLAGS
في وحدتك حتى تتمكّن من إلغاء مفعولها بسهولة.
بالإضافة إلى ذلك، تكون العلاقة بين الوحدات تبادلية: إذا كانت zoo
تعتمد على
bar
، والتي تعتمد بدورها على foo
، سترث zoo
أيضًا جميع العلامات
المصدَّرة من foo
.
أخيرًا، لا يستخدم نظام الإنشاء العلامات التي تم تصديرها عند الإنشاء على الجهاز فقط
(أي إنشاء الوحدة التي يتم تصدير علاماتها). وبالتالي، في المثال
أعلاه، لا يتم تمرير -DFOO=1
إلى المُجمِّع عند إنشاء foo/foo.c
. إلى
تُنشِئ على الجهاز، استخدِم LOCAL_CFLAGS
بدلاً منها.
LOCAL_EXPORT_CPPFLAGS
هذا المتغيّر مماثل لـ LOCAL_EXPORT_CFLAGS
، ولكن لعلامات C++ فقط.
LOCAL_EXPORT_C_INCLUDES
هذا المتغيّر هو نفسه LOCAL_EXPORT_CFLAGS
، ولكن مع تضمين المسارات في C. وهو
مفيد في الحالات التي تحتاج فيها وحدة bar.c
مثلاً إلى تضمين رؤوس من
الوحدة foo
.
LOCAL_EXPORT_LDFLAGS
هذا المتغيّر مماثل لـ LOCAL_EXPORT_CFLAGS
، ولكن بالنسبة لعلامات الربط.
LOCAL_EXPORT_LDLIBS
هذا المتغيّر هو نفسه LOCAL_EXPORT_CFLAGS
، ويطلب من نظام الإنشاء
تمرير أسماء مكتبات نظام معيّنة إلى المُجمِّع. إضافة البادئة -l
إلى
لكل مكتبة تحددها.
يُرجى العلم أنّ نظام الإنشاء يُلحق علامات الربط المستورَدة بقيمة المتغيّر LOCAL_LDLIBS
في
الوحدة. ويحدث ذلك بسبب طريقة عمل روابط Unix.
وعادةً ما يكون هذا المتغير مفيدًا عندما تكون الوحدة foo
مكتبة ثابتة وتحتوي على
الذي يعتمد على مكتبة النظام. يمكنك بعد ذلك استخدام LOCAL_EXPORT_LDLIBS
من أجل
لتصدير التبعية. مثلاً:
include $(CLEAR_VARS)
LOCAL_MODULE := foo
LOCAL_SRC_FILES := foo/foo.c
LOCAL_EXPORT_LDLIBS := -llog
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := bar
LOCAL_SRC_FILES := bar.c
LOCAL_STATIC_LIBRARIES := foo
include $(BUILD_SHARED_LIBRARY)
في هذا المثال، يضع نظام التصميم -llog
في نهاية أمر الربط.
عند إنشاء libbar.so
. ويُعلم ذلك الرابط بأنّه بما أنّ libbar.so
يعتمد على foo
، فهو يعتمد أيضًا على مكتبة تسجيل النظام.
الأوامر_المحلية
عليك ضبط هذا المتغيّر على true
عندما تحتوي الوحدة على عدد كبير جدًا من المصادر.
و/أو المكتبات الثابتة أو المشتركة التابعة. يؤدي القيام بذلك إلى إجبار نظام التصميم على
استخدام بنية @
للأرشيفات التي تحتوي على ملفات كائنات وسيطة أو روابط
المكتبات.
يمكن أن تكون هذه الميزة مفيدة في نظام التشغيل Windows، حيث يقبل سطر الأوامر الحد الأقصى من 8191 حرفًا فقط، والتي قد تكون صغيرة جدًا بالنسبة للمشروعات المعقدة. وكذلك تؤثر في تجميع ملفات المصدر الفردية، مما يؤدي إلى وضع جميع برامج التجميع علامات داخل ملفات القائمة أيضًا.
يُرجى العِلم أنّ أي قيمة غير true
ستؤدي إلى إعادة السلوك التلقائي. يمكنك
أيضًا تحديد APP_SHORT_COMMANDS
في ملف Application.mk
لفرض
هذا السلوك على جميع الوحدات في مشروعك.
لا ننصح بتفعيل هذه الميزة تلقائيًا، لأنّها تجعل الإصدار أبطأ.
LOCAL_THIN_ARCHIVE
اضبط هذا المتغيّر على true
عند إنشاء مكتبات ثابتة. سيؤدي القيام بذلك إلى
إنشاء أرشيف رفيع أو ملف مكتبة لا يحتوي على ملفات الكائنات،
ولكن بدلاً من ذلك، قم فقط بتقديم المسارات إلى الكائنات الفعلية التي عادةً ما
تحتوي عليه.
يكون ذلك مفيدًا لتقليل حجم الناتج من عملية الإنشاء. العيب هو أن لا يمكن نقل هذه المكتبات إلى مكان مختلف (جميع المسارات داخلها نسبية).
القيم الصالحة هي true
أو false
أو فارغة. يمكن ضبط قيمة تلقائية في
Application.mk
من خلال المتغيّر APP_THIN_ARCHIVE
.
LOCAL_FILTER_ASM
حدِّد هذا المتغيّر كأمر Shell الذي سيستخدمه نظام الإصدار لفلترة البيانات.
ملفات التجميع المستخرجة أو التي تم إنشاؤها من الملفات التي حددتها
LOCAL_SRC_FILES
يؤدي تعريف هذا المتغير إلى حدوث الأشياء التالية:
- يُنشئ نظام التصميم ملف تجميع مؤقت من أي مصدر C أو C++. بدلاً من تجميعها في ملف كائن.
- ينفِّذ نظام الإصدار أمر Shell في
LOCAL_FILTER_ASM
على أي ملف تجميع مؤقت وعلى أي ملف تجميع مدرج فيLOCAL_SRC_FILES
، وبالتالي إنشاء ملف تجميع مؤقت آخر. - ويجمع نظام التصميم ملفات التجميع هذه التي تمت تصفيتها في ملف كائن.
مثلاً:
LOCAL_SRC_FILES := foo.c bar.S
LOCAL_FILTER_ASM :=
foo.c --1--> $OBJS_DIR/foo.S.original --2--> $OBJS_DIR/foo.S --3--> $OBJS_DIR/foo.o
bar.S --2--> $OBJS_DIR/bar.S --3--> $OBJS_DIR/bar.o
يشير الرقم "1" إلى المُجمِّع، ويشير الرقم "2" إلى الفلتر، ويشير الرقم "3" إلى المُجمِّع. يجب أن يكون الفلتر أمرًا مستقلاً لنظام التشغيل يأخذ اسم ملف الإدخال كوسيطة أولى، واسم ملف الإخراج كوسيطة ثانية. مثلاً:
myasmfilter $OBJS_DIR/foo.S.original $OBJS_DIR/foo.S
myasmfilter bar.S $OBJS_DIR/bar.S
وحدات ماكرو الدوال التي يوفّرها NDK
يشرح هذا القسم وحدات دالة GNU Make التي يوفّرها NDK. استخدام
$(call <function>)
لتقييمها. فإنها تعرض معلومات نصية.
أمري
تعرض هذه الماكرو مسار آخر ملف makefile تم تضمينه، والذي عادةً ما يكون
دليل Android.mk
الحالي. تُعد my-dir
مفيدة لتحديد
LOCAL_PATH
في بداية ملف Android.mk
. مثلاً:
LOCAL_PATH := $(call my-dir)
بسبب الطريقة التي تعمل بها GNU Make، فإن ما تعرضه هذه الماكرو حقًا هو مسار
الملف الأخير الذي أدرجه نظام الإصدار عند تحليل النصوص البرمجية للإصدار. بالنسبة
لهذا السبب، يجب عدم استدعاء my-dir
بعد تضمين ملف آخر.
على سبيل المثال، إليك المثال التالي:
LOCAL_PATH := $(call my-dir)
# ... declare one module
include $(LOCAL_PATH)/foo/`Android.mk`
LOCAL_PATH := $(call my-dir)
# ... declare another module
تكمن المشكلة هنا في أنّ الطلب الثاني إلى my-dir
يحدّد LOCAL_PATH
على أنّه
$PATH/foo
بدلاً من $PATH
، لأنّه كان هذا هو المكان الذي أشار إليه أحدث ملف تضمين
.
يمكنك تجنُّب هذه المشكلة عن طريق وضع عمليات تضمين إضافية بعد كل العناصر الأخرى
في ملف Android.mk
. مثلاً:
LOCAL_PATH := $(call my-dir)
# ... declare one module
LOCAL_PATH := $(call my-dir)
# ... declare another module
# extra includes at the end of the Android.mk file
include $(LOCAL_PATH)/foo/Android.mk
وإذا لم يكن من الممكن هيكلة الملف بهذه الطريقة، احفظ قيمة
استدعاء my-dir
الأول إلى متغير آخر. مثلاً:
MY_LOCAL_PATH := $(call my-dir)
LOCAL_PATH := $(MY_LOCAL_PATH)
# ... declare one module
include $(LOCAL_PATH)/foo/`Android.mk`
LOCAL_PATH := $(MY_LOCAL_PATH)
# ... declare another module
all-subdir-makefiles
عرض قائمة ملفات Android.mk
المتوفّرة في جميع الأدلة الفرعية لمسارmy-dir
الحالي
يمكنك استخدام هذه الدالة لتقديم تسلسلات هرمية لدليل مصدر أكثر تعمقًا من أجل
نظام التصميم. يبحث NDK تلقائيًا عن الملفات في الدليل الذي يحتوي على ملف Android.mk
فقط.
ملف التصميم هذا
لعرض مسار ملف makefile الحالي (الذي استدعى نظام الإنشاء دالّة ).
ملف_إنشاء_عنصر رئيسي
عرض مسار ملف الإنشاء الرئيسي في شجرة التضمين (مسار ملف الإنشاء الذي يتضمّن الملف الحالي)
grand-parent-makefile
لعرض مسار ملف makefile الخاص بالجد في شجرة التضمين (مسار ملف makefile الذي يتضمن الملف الحالي).
import-module
دالة تتيح لك العثور على ملف Android.mk
الخاص بالوحدة وتضمينه من خلال
اسم الوحدة. في ما يلي مثال شائع:
$(call import-module,<name>)
في هذا المثال، يبحث نظام الإنشاء عن الوحدة التي تم وضع علامة <name>
عليها في
قائمة الدلائل التي يشير إليها متغيّر NDK_MODULE_PATH
في
البيئة، ويضمّن ملف Android.mk
تلقائيًا نيابةً عنك.