وحدات Rust لنظام التشغيل Android

كقاعدة عامة، تلتزم rust_* تعريفات الوحدات بشكل وثيق باستخدام cc_* وتوقّعاته. فيما يلي مثال على وحدة تعريف البرنامج الثنائي Rust:

rust_binary {
    name: "hello_rust",
    crate_name: "hello_rust",
    srcs: ["src/hello_rust.rs"],
    host_supported: true,
}

تتناول هذه الصفحة السمات الأكثر شيوعًا لوحدات rust_*. للحصول على مزيد من المعلومات عن أنواع وحدات معيّنة وأمثلة على تعريفات الوحدات، اطّلِع على الوحدات الثنائية أو وحدات المكتبة أو وحدات الاختبار.

أنواع الوحدات الأساسية

النوعالتعريفلمزيد من المعلومات
rust_binaryبرنامج ثنائي Rust صفحة الوحدات الثنائية
rust_libraryتوفّر مكتبة Rust وتوفّر كل من rlib صيغتان (dylib) rust_library, صفحة "وحدات المكتبة".
rust_ffiإنشاء مكتبة Rust C قابلة للاستخدام بواسطة الحقل "نسخة إلى" وتوفر صيغًا ثابتة ومشتركة. rust_ffi, صفحة "وحدات المكتبة"
rust_proc_macroلإنشاء مكتبة proc-macro Rust. (هذه المكوّنات مشابهة للمكوّنات الإضافية لبرنامج التحويل البرمجي). rust_proc_macro، صفحة "وحدات المكتبات"
rust_testتُنشئ هذه الأداة ملفًا ثنائيًا لاختبار Rust يستخدم مجموعة اختبار Rust العادية. صفحة الوحدات التجريبية
rust_fuzzإنشاء برنامج ثنائي "زغب" Rust libfuzzer مثال على وحدة rust_fuzz
rust_protobufتنشئ مصدرًا وينتج رمز Rust توفر واجهة لنموذج أوّلي معين. صفحتا وحدات Protobufs ومولدّات المصادر
rust_bindgenتنشئ مصدرًا وينتج مكتبة Rust التي تحتوي على روابط Rust بمكتبات C. وحدات "الربط" وصفحة منشئات المصدر

السمات المشتركة المهمة

هذه السمات مشترَكة بين جميع إصدارات Android Rust. الوحدات. أيّ مواقع إضافية (فريدة) مرتبطة بحساب فردي يتم إدراج الوحدات Rust في صفحة تلك الوحدة.

اسم

name هو اسم وحدتك. يجب أن تكون هذه الوحدات فريدة، مثلها مثل الوحدات الأخرى في Sumg. في معظم أنواع الوحدات Android.bp. يتم استخدام name تلقائيًا كاسمملف المخرج. إذا كان يجب أن يختلف اسم ملف الإخراج عن اسم الوحدة، استخدِم السمة stem لتحديده.

ساق

stem (اختياري) يقدّم إمكانية التحكّم مباشرةً في اسم الملف الناتج (باستثناء امتداد الملف واللاحقات الأخرى). على سبيل المثال، تؤدي rust_library_rlib مكتبة ذات قيمة جذع libfoo إلى إنشاء ملف libfoo.rlib. إذا لم تقدِّم قيمة للسمة stem، سيعتمد اسم ملف الإخراج اسم الوحدة تلقائيًا.

استخدم الدالة stem عندما لا يمكنك ضبط اسم الوحدة على الإخراج المطلوب . على سبيل المثال، تم تسمية rust_library للصندوق log باسم liblog_rust، لأنّه سبق أن تم إنشاء liblog cc_library . ويضمن استخدام السمة stem في هذه الحالة أن يكون الناتج باسم الملف "liblog.*" بدلاً من "liblog_rust.*".

srcs

يحتوي srcs على ملف مصدر واحد يمثّل نقطة الدخول إلى الوحدة (عادةً main.rs أو lib.rs). يعالج rustc عملية حلّ جميع الملفات المصدر الأخرى المطلوبة للترجمة و اكتشافها، ويتم سردها في ملف deps الذي يتم إنشاؤه.

.

تجنَّب هذا الاستخدام لرمز المنصة كلما أمكن. اطّلِع على أدوات إنشاء الرموز المصدر للحصول على مزيد من المعلومات.

crate_name

يضبط crate_name البيانات الوصفية لاسم القفص من خلال --crate_name rustc. . بالنسبة إلى الوحدات التي تُنشئ مكتبات، يجب أن يتطابق هذا مع اسم crate المتوقّع المستخدَم في المصدر. على سبيل المثال، إذا تمت الإشارة إلى الوحدة libfoo_bar في المصدر باسم extern crate foo_bar، يجب أن يكون crate_name: "foo_bar".

هذه السمة مشترَكة بين جميع وحدات "rust_*"، ولكنّها مطلوبة للوحدات. التي تنتج مكتبات Rust (مثل rust_library rust_ffi وrust_bindgen وrust_protobuf وrust_proc_macro). هذه تفرض الوحدات متطلبات rustc على العلاقة بين crate_name واسم ملف الإخراج. لمزيد من المعلومات، يُرجى الاطّلاع على وحدات المكتبة .

أداة الوبر

يتم تشغيل أداة التدقيق rustc تلقائيًا لجميع أنواع الوحدات باستثناء أدوات إنشاء المصادر. يتم تحديد بعض مجموعات التدقيق واستخدامها للتحقّق من صحة مصدر الوحدة. في ما يلي القيم المحتمَلة لمجموعات lint هذه:

  • default المجموعة التلقائية من أدوات التدقيق، استنادًا إلى موقع الوحدة
  • android مجموعة الوبر الأكثر صرامة التي تنطبق على كل رموز نظام Android الأساسي
  • vendor مجموعة مُبسّطة من أدوات فحص الأخطاء المطبَّقة على رمز المورّد
  • none لتجاهل جميع التحذيرات والأخطاء المتعلقة بفحص الأخطاء

قصاصة_لينت

يتم أيضًا تشغيل أداة التدقيق clippy تلقائيًا لجميع أنواع الوحدات باستثناء أدوات إنشاء المصادر. يتمّ تحديد بضع مجموعات من أدوات التدقيق التي تُستخدَم للتحقّق من صحة مصدر الوحدة. هذه بعض الطرق المحتملة القيم التالية:

  • default مجموعة تلقائية من الوبر بناءً على موقع الوحدة
  • android مجموعة الوبر الأكثر صرامة التي تنطبق على كل رموز نظام Android الأساسي
  • vendor مجموعة مُبسّطة من أدوات فحص الأخطاء المطبَّقة على رمز المورّد
  • none لتجاهل جميع تحذيرات وأخطاء أداة Lint

إصدار

يحدد edition الإصدار Rust للاستخدام مع وتجميع هذه التعليمة البرمجية. وهذا مشابه لإصدارات std لـ C وC++. القيم الصالحة هي 2015 و2018 (التلقائية).

العلامة

تحتوي الدالة flags على قائمة سلاسل من العلامات التي يجب تمريرها إلى rustc أثناء التجميع.

ld_flags

يحتوي ld-flags على قائمة سلاسل من العلامات التي يجب تمريرها إلى الرابط عند التجميع المصدر. يتم تمرير هذه الملفات من خلال علامة rustc -C linker-args. يتم استخدام clang باعتباره الواجهة الأمامية للرابط، ويستدعي lld للربط الفعلي.

الميزات

features هي قائمة سلاسل من الميزات التي يجب تفعيلها أثناء عملية الترجمة. تم تمرير هذا إلى rustc من قِبل --cfg 'feature="foo"'. معظم الميزات مضافة، لذا، يتكون هذا في كثير من الحالات من الميزات الكاملة المعيّنة من قِبل جميع المؤسسات التابعة الوحدات. ومع ذلك، في الحالات التي تكون فيها الميزات حصرية لبعضها، حدِّد وحدات إضافية في أي ملفات إنشاء توفّر ميزات متضاربة.

cfgs

يحتوي cfgs على قائمة سلاسل من cfg علامات ليتم تفعيلها أثناء عملية الترجمة. ويتم تمرير هذا الطلب إلى rustc من خلال --cfg foo و--cfg "fizz=buzz".

يضبط نظام الإنشاء تلقائيًا علامات cfg معيّنة في حالات معيّنة، وهي مذكورة أدناه:

  • ستحتوي الوحدات التي تم إنشاؤها كملف dylib على مجموعة android_dylib cfg.

  • بالنسبة إلى الوحدات التي ستستخدم ملف VNDK، سيتم ضبط cfg على android_vndk. وهذا مشابه لتعريف __ANDROID_VNDK__ في C++.

شريط

تتحكّم السياسة strip في ما إذا كان تتم إزالة ملف الإخراج وطريقة إزالته (إذا كان ذلك منطبقًا). في حال ترك هذه السياسة بدون ضبط، ستزيل وحدات الجهاز تلقائيًا كل البيانات باستثناء معلومات تصحيح الأخطاء الصغيرة. لا تزيل الوحدات المضيفّة أي رموز تلقائيًا. تتضمن القيم الصالحة none لإيقاف الإزالة، وall لإزالة كل شيء، بما في ذلك المعلومات المصغّرة لتصحيح الأخطاء. يمكن العثور على قيم إضافية في مرجع وحدات Soong.

host_supported

بالنسبة إلى وحدات الأجهزة، تشير مَعلمة host_supported إلى ما إذا كانت الوحدة. أيضًا صيغة المضيف.

تحديد العناصر التابعة للمكتبة

يمكن أن تعتمد وحدات Rust على كل من الترجمة والشرح مكتبات Rust من خلال السمات التالية:

اسم الموقع الوصف
rustlibs قائمة تتضمّن وحدات rust_library التي تشكّل أيضًا وحدات تابعة. استخدام هذا كـ طريقتك المفضلة للإعلان عن التبعيات، حيث تسمح لنظام الإصدار وأحدد الارتباط المفضل. (راجِع عند الربط بمكتبات Rust أدناه)
rlibs قائمة بوحدات rust_library التي يجب ربطها بشكل ثابت على أنّها rlibs. (يُستخدم بحذر؛ راجع عند الربط بمكتبات Rust، أدناه)
shared_libs قائمة بوحدات cc_library التي يجب ربطها ديناميكيًا كمكتبات مشترَكة
static_libs قائمة بوحدات cc_library التي يجب ربطها بشكلٍ ثابت كمكتبات ثابتة
whole_static_libs قائمة بوحدات cc_library التي يجب ربطها بشكلٍ ثابت كمكتبات ثابتة وتضمينها بالكامل في المكتبة الناتجة بالنسبة صيغتان (rust_ffi_static)، سيتم تضمين whole_static_libraries في أرشيف المكتبة الثابتة الناتج. بالنسبة إلى الأسعار المتغيرة rust_library_rlib، سيتم تجميع مكتبات whole_static_libraries في مكتبة rlib الناتجة.

عند الربط بمكتبات Rust، يُنصح باستخدام السمة rustlibs بدلاً من rlibs أو dylibs، ما يُعدّ من بين أفضل الممارسات، ما لم يكن لديك سبب محدّد لإجراء ذلك. ويسمح ذلك لنظام الإنشاء باختيار عملية الربط الصحيحة استنادًا إلى ما تتطلّبه الوحدة الجذر، ويقلّل من احتمال أن تحتوي شجرة التبعيات على إصدارَي rlib و dylib من المكتبة (ما سيؤدي إلى تعذُّر عملية الترجمة).

ميزات إصدار ذات دعم محدود وغير متاحة

يقدم متجر Rust دعمًا محدودًا لكل من vendor vendor_ramdisk صورة ولقطة ومع ذلك، يمكن استخدام staticlibs وcdylibs rlibs وbinaries. بالنسبة إلى استهدافات إنشاء صور المورّدين، يتم ضبط السمة android_vndk cfg. يمكنك استخدام هذا في التعليمات البرمجية إذا كانت هناك الاختلافات بين أهداف النظام والمورد. rust_proc_macros لا يتم تسجيلها كجزء من لقطات المورّد. وإذا كنت تعتمد على هذه الإصدارات، تأكَّد من التحكّم في الإصدارات بشكلٍ مناسب.

لا تتوفّر صور المنتجات وصور VNDK وصور الاسترداد.

الإصدارات المتزايدة

يمكن للمطوّرين تفعيل عملية الترجمة المتزايدة لمصدر Rust من خلال ضبط متغيّر البيئة SOONG_RUSTC_INCREMENTAL على true.

تحذير: لا يمكن ضمان أن ينتج عن ذلك إنشاء برامج ثنائية مشابهة لتلك التي تم إنشاؤها بواسطة برامج Buildbot. قد تختلف عناوين الدوال أو البيانات المضمّنة فيملفّات العناصر. لضمان أنّ العناصر التي تم إنشاؤها متطابقة بنسبة ‎100% مع تلك التي أنشأتها بنية EngProd الأساسية، اترك هذه القيمة غير محدّدة.