يمكنك استخدام سلاسل الأدوات المقدّمة مع اتفاقية عدم الإفصاح (NDK) بشكل مستقل أو كمكوّنات إضافية كمكوّن إضافي لـ IDE حاليًا. يمكن أن تكون هذه المرونة مفيدة إذا كان لديك نظام الإنشاء الخاص بك، وتحتاج فقط إلى إمكانية استدعاء العارض المجمّع لإضافة الدعم إليه على Android.
اختيار سلسلة الأدوات
قبل أي شيء آخر، يجب تحديد بنية المعالج التي ستستهدفها
سلسلة الأدوات المستقلة. ويتم ذلك باستخدام علامة --arch
.
اختيار النظام الأساسي
بعد ذلك، عليك تحديد sysroot. سجلّ النظام هو دليل يحتوي على عناوين النظام والمكتبات المستهدَفة. لتحديد النظام الأساسي، يجب أن تعرف مستوى Android API الذي تريد استهدافه للحصول على الدعم الأصلي، وتختلف واجهات برمجة التطبيقات الأصلية المتوفرة حسب مستوى واجهة برمجة تطبيقات Android.
مكتبات واجهات برمجة التطبيقات الأصلية لمستويات واجهة برمجة تطبيقات Android المتوفّرة ضمن
$NDK/platforms/
، ويحتوي كل دليل على مستوى واجهة برمجة التطبيقات على أدلة فرعية
لوحدات المعالجة المركزية (CPU) والبُنى المختلفة. الرؤوس متوفرة في $NDK/sysroot
.
للاطّلاع على مزيد من التفاصيل حول مستويات واجهة برمجة تطبيقات Android وواجهات برمجة التطبيقات الأصلية المتوافقة، يُرجى الاطّلاع على واجهات برمجة التطبيقات الأصلية.
إنشاء سلسلة أدوات
توفّر اتفاقية عدم الإفشاء (NDK) النص البرمجي make_standalone_toolchain.py
للسماح لك
بتثبيت سلسلة أدوات مخصّصة من سطر الأوامر.
هذه أداة جديدة تحلّ محل make-standalone-toolchain.sh
القديمة. وتمت إعادة برمجته
في لغة Python بحيث لا يحتاج مستخدمو Windows إلى تثبيت
Cygwin أو MSYS
لتشغيله.
ويقع النص البرمجي في دليل $NDK/build/tools/
، حيث يكون $NDK
هو جذر تثبيت NDK.
في ما يلي مثال على استخدام هذا النص البرمجي:
$NDK/build/tools/make_standalone_toolchain.py \
--arch arm --api 21 --install-dir /tmp/my-android-toolchain
سيؤدي هذا الأمر الذي أدخلته إلى إنشاء دليل باسم /tmp/my-android-toolchain/
يحتوي على نسخة من النظام الأساسي "android-21/arch-arm
"، بالإضافة إلى دليل البرامج الثنائية لسلسلة الأدوات
لهدف ARM بنطاق 32 بت.
ويُرجى العِلم أنّ البرامج الثنائية لسلسلة الأدوات لا تعتمد على مسارات خاصة بالمضيف أو تحتوي عليها. بمعنى آخر، يمكنك تثبيتها في أي مكان أو نقلها إذا أردت ذلك.
وسيطة --arch
مطلوبة، ولكن سيتم ضبط مستوى واجهة برمجة التطبيقات تلقائيًا على الحد الأدنى للبنية المتوافقة للبنية المحددة (16 حاليًا للبنية 32 بت و21 للبُنى 64 بت).
منذ الإصدار r18، تستخدم جميع سلاسل الأدوات المستقلة لغة Clang وlibc+. وسيتم استخدام المكتبة المشتركة في libc++
بشكل تلقائي ما لم يتم إنشاء ملف تنفيذي ثابت. لفرض استخدام المكتبة الثابتة، يجب تمرير -static-libstdc++
عند الربط. ويتطابق هذا السلوك مع سلسلة أدوات المضيف العادية.
كما ذكرنا في دعم مكتبة C++، غالبًا ما ستحتاج إلى تمرير -latomic
عند الربط بـ libc++.
تجدر الإشارة إلى أنه في حال حذف الخيار --install-dir
، تنشئ الأداة سهمًا معًا في الدليل الحالي باسم $TOOLCHAIN_NAME.tar.bz2
. ويمكن وضع الكرة الترابية في دليل
مختلف باستخدام --package-dir
.
للحصول على مزيد من الخيارات والتفاصيل، استخدِم --help
.
العمل باستخدام Clang
يتم تضمين برامج ثنائية للمجموعة تلقائيًا في سلاسل أدوات مستقلة.
هناك أيضًا نصان برمجيّان للبرنامج، باسم clang
وclang++
،
ضمن <install-dir>/bin
. تستدعي هذه النصوص البرمجية البرنامج الثنائي clang
مع علامات العلامة المستهدفة المستهدفة الصحيحة. بمعنى آخر، يجب أن تعمل هذه الإطارات بدون أي تعديل، ويجب استخدامها في الإصدارات الخاصة بك من خلال ضبط متغيّرَي البيئة CC
وCXX
للإشارة إليها.
هناك أيضًا نصوص برمجية مُسمّاة gcc
وg++
تطلب أيضًا اسم Clang.
ويتمثل ذلك في توفير مستوى من التوافق لملفات الإصدار التي تشير صراحةً إلى GCC على الرغم من أنّ NDK لم يعد يحتوي على GCC. من الواضح، إذا كان ملف الإصدار يستخدم خيارات سطر أوامر غير متوافقة مع Clang، ستحتاج إلى إزالتها أو استبدالها.
أهداف المجموعة باستخدام ARM
عند إنشاء ARM، يغيّر Clang الهدف استنادًا إلى وجود علامتَي التجميع -march=armv7-a
و/أو -mthumb
:
الجدول 1: قيم -march
المحددة وأهدافها الناتجة.
قيمة -march |
الهدف الناتج |
---|---|
-march=armv7-a |
armv7-none-linux-androideabi |
-mthumb |
thumb-none-linux-androideabi |
كل من -march=armv7-a و-mthumb |
thumbv7-none-linux-androideabi |
يمكنك أيضًا إلغاء السمة -target
إذا أردت.
يجب استبدال clang
وclang++
بـ gcc
وg++
في ملف sitemap. إذا لم تكن متأكدًا، استخدِم الخيارات التالية عند استدعاء برنامج التجميع
للتأكّد من أنها تعمل بشكل صحيح:
-v
لتفريغ الأوامر المرتبطة بمشاكل برامج تشغيل التجميع-###
لتفريغ خيارات سطر الأوامر، بما في ذلك الخيارات الضمنية مسبقًا.-x c < /dev/null -dM -E
لتفريغ تعريفات المعالجات المسبقة التحديد-save-temps
لمقارنة*.i
أو*.ii
ملفات تمت معالجتها مسبقًا
توافق واجهة التطبيق الثنائية (ABI)
وستستهدف سلسلة أدوات ARM Clang المستقلة تلقائيًا واجهة برمجة التطبيقات armeabi-v7a ABI.
ويمكن إلغاء ذلك من خلال تمرير الخيار المناسب -march
أو -target
.
ننصح باستخدام علامة العارض -mthumb
لفرض إنشاء تعليمات Thumb-2 بحجم 16 بت. إذا تم حذفها، ستعرض سلسلة الأدوات تعليمات ARM
32 بت.
لاستخدام تعليمات NEON، عليك استخدام علامة العارض -mfpu
: -mfpu=neon
.
يُرجى ملاحظة أنّ هذا الإعداد يفرض استخدام VFPv3-D32
وفقًا لمواصفات "الذراع المعزَّز".
وتأكَّد أيضًا من تقديم العلامتَين التاليتَين إلى الرابط:
-march=armv7-a -Wl,--fix-cortex-a8
.
توجِّه العلامة الأولى الرابط إلى اختيار مكتبات سلسلة الأدوات المخصصة لـ Armv7-a. العلامة الثانية مطلوبة كحل بديل لخطأ في وحدة المعالجة المركزية (CPU) في بعض عمليات تنفيذ Cortex-A8.
ليس عليك استخدام أي علامة مجمِّع محدَّدة عند استهداف قيم ABI الأخرى.
للتعرّف على مزيد من المعلومات حول دعم واجهة التطبيق الثنائية (ABI)، يُرجى الاطّلاع على ABA لـ Android.
التحذيرات والقيود
دعم نظام التشغيل Windows
ولا تعتمد برامج Windows الثنائية على Sygwin. يجعله نقص الاعتماد هذه أسرع. أمّا التكلفة، فهي أنّها لا تفهم مواصفات مسار السيجوين، مثل cygdrive/c/foo/bar
، بدلاً من C:/foo/bar
.
الاستثناءات وRTTI وSTL
تتوافق البرامج الثنائية لسلسلة الأدوات بشكل تلقائي مع استثناءات C++ وRTTI. لإيقاف استثناءات C++ وتقنية RTTI عند إنشاء مصادر (على سبيل المثال، لإنشاء رمز آلة خفيفة الحجم)، استخدِم -fno-exceptions
و-fno-rtti
.
دعم C++ STL
تتضمن سلسلة الأدوات المستقلة عملية تنفيذ مكتبة النماذج C++ العادية (STL).
استخدِم
-static-libstdc++
للحصول على إصدار المكتبة الثابت من libc+. يضمن ذلك تضمين كل رمز C++ STL المطلوب في البرنامج الثنائي النهائي. هذه الطريقة مثالية إذا كنت تنشئ مكتبة مشتركة أو ملف تنفيذي واحد فقط، وهو ما ننصح به.وسيتم استخدام إصدار المكتبة المشتركة من libc++ تلقائيًا. ولا حاجة إلى وضع علامات إضافية للربط بالمكتبة المشتركة. يجب تجميع
libc++_shared.so
في تطبيقك، وإلا لن يتم تحميل الرمز.يوضح الجدول 2 مكان هذا الملف لكل بنية.
الجدول 2: قيم
-march
المحددة وأهدافها الناتجة.سلسلة أدوات الموقع الجغرافي ذراع $TOOLCHAIN/arm-linux-androideabi/lib/
Arm64 $TOOLCHAIN/aarch64-linux-android/lib/
x86 $TOOLCHAIN/i686-linux-android/lib/
x86_64 $TOOLCHAIN/x86_64-linux-android/lib/
أنشِئ مشاريع مفتوحة المصدر باستخدام سلاسل أدوات مستقلة.
في ما يلي مثال على سلسلة الأدوات هذه:
# Create an arm64 API 26 libc++ toolchain.
$NDK/build/tools/make_standalone_toolchain.py \
--arch arm64 \
--api 26 \
--install-dir=my-toolchain
في ما يلي كيفية إعداد بيئتك لاستخدامها في إنشاء مشروع تقليدي مفتوح المصدر:
# Add the standalone toolchain to the search path.
export PATH=$PATH:`pwd`/my-toolchain/bin
# Tell configure what tools to use.
target_host=aarch64-linux-android
export AR=$target_host-ar
export AS=$target_host-clang
export CC=$target_host-clang
export CXX=$target_host-clang++
export LD=$target_host-ld
export STRIP=$target_host-strip
# Tell configure what flags Android requires.
export CFLAGS="-fPIE -fPIC"
export LDFLAGS="-pie"
المشاريع ذات أنظمة الإصدار المخصصة
على سبيل المثال، إليك كيفية إنشاء لعبة Toybox بعد تنفيذ الخطوات السابقة:
git clone https://github.com/landley/toybox.git
cd toybox
make defconfig && make
المشاريع التي تتضمّن الترجمة التلقائية
بدلاً من ذلك، سيبدو المشروع المستند إلى إحالة ناجحة تلقائيًا على النحو التالي:
tar zxvf make-4.2.tar.gz
cd make-4.2
./configure --host=$target_host && make
يُرجى العِلم أنّ المشاريع التي تعتمد على الترجمة التلقائية تختلف بشكل كبير باختلاف الدعم الذي تقدّمه التجميع. يُرجى العِلم أيضًا أنّه إذا كان git clone
مشروعًا قائمًا على الثقة التلقائية، من غير المرجّح أن يتوفّر نص برمجي configure
مسجّل الوصول إليه، لذلك عليك
متابعة مستندات هذا المشروع لمعرفة كيفية تشغيل البرنامج.