يمكنك استخدام علامات aconfig في رمز Java وC وC++ وRust. يطلق نظام إصدار AOSP أداة تسمى الإعداد (aconfig) المستخدمة لإنشاء مكتبة طُرق خاصة بلغة يمكنك استخدامها للوصول إلى قيمة كل علامة. قبل أن تتمكن من إنشاء المكتبة، يجب تعريف العلامات وإضافتها إلى الإصدار.
تعريف علامة الضبط لـ Java
لتعريف علامة aconfig لتطبيق Java:
في دليل يتضمّن الرمز الجديد، أنشئ ملفًا بلاحقة
.aconfig
، على سبيل المثال،my_new_aconfig_flag_declarations.aconfig
. ملف aconfig هو ملف أولي نصي يتبع مخططًا قياسيًا.أضِف بيان إبلاغ مشابه لما يلي:
package: "com.example.android.aconfig.demo.flags" container: "system" flag { name: "my_new_flag" namespace: "aconfig_demo_namespace" description: "This flag controls untested code" bug: "<none>" }
المكان:
- يقدّم
package
مفتاحًا فريدًا عند دمجه مع اسم العلامة. في Java، يؤدي ضبطpackage
علىfoo.bar
إلى إنشاء فئة تم إنشاؤها تلقائيًا باسمfoo.bar.Flags
. في C++، سيتم تسمية طرق الوصول إلى العلامة باسمfoo::bar::"flagname"
. تنتمي العلامات الموجودة في ملف التعريف نفسه إلى الحزمة نفسها، ولكن يمكن لملفات تعريف متعددة إضافة علامات إلى الحزمة نفسها. container
تحدِّد مجموعة من الرموز البرمجية التي يتم إنشاؤها وشحنها معًا بتنسيق ثنائي. الحاويات الصالحة هيsystem
وvendor
وsystem_ext
وproduct
وname.of.apex
وname.of.apk
.يحتوي
name
على اسم العلامة الذي يتضمّن أحرفًا صغيرة و شرطات سفلية وأرقامًا فقط.يحتوي
namespace
على مساحة الاسم للمساهمات. يجب أن تعمل مع مراجع Google المعين لتحديد مساحة الاسم. إذا كنت تستخدم علامات تشغيل الميزات للحفاظ على ثبات نسخة مطابقة AOSP، يمكنك استخدام مساحة الاسم كيفما تشاء.يحتوي
description
على وصف موجز للميزة أو التغيير تم وضع علامة عليه.bug
هو رقم الخطأ المرتبط بالمساهمة بالرمز الجديد. عليك العمل مع مراجع Google المخصّص لتحديدbug
. إذا كنت تستخدم علامات إطلاق الميزات للحفاظ على ثبات النسخة المطابقة من AOSP، يمكنك استخدام رقم تتبُّع الأخطاء أو استخدام<none>
.
- يقدّم
احفظ الملف واخرج من المحرِّر.
إعداد عملية الإنشاء
بعد تعريف العلامة، عليك إعداد الإصدار كي يتمكّن من إنشاء رمز المكتبة المستخدَم للوصول إلى قيمة العلامة.
في ملف تصميم
Android.bp
، أضِف قسمaconfig_declarations
على النحو التالي:aconfig_declarations { name: "aconfig_demo_flags", package: "com.example.android.aconfig.demo.flags", srcs: [ "my_new_aconfig_flag_declarations.aconfig" ], }
المكان:
- يحتوي
name
على اسم البيان الذي يحتوي فقط على أحرف أبجدية سفلية وشرطات سفلية وأرقام. - يحتوي
package
على اسم الحزمة نفسه المستخدَم في البيان. - يحتوي
srcs
على اسم ملف.aconfig
الذي تمّ فيه الإعلان عن العلامة.
- يحتوي
احفظ الملف واخرج من المحرر.
تعريف علامة الضبط لكل من C وC++
لتعريف علامة aconfig للغة C وC++:
في الدليل الذي يتوفّر فيه الرمز الجديد، أنشِئ ملفًا بالامتداد
.aconfig
، على سبيل المثالmy_new_aconfig_flag_declarations.aconfig
. ملف aconfig هو ملف أولي نصي يتبع مخططًا قياسيًا.أضِف بيان إبلاغ مشابه لما يلي:
package: "com.example.android.aconfig.demo.flags" container: "system" flag { name: "my_new_flag" namespace: "aconfig_demo_namespace" description: "This flag controls untested code" bug: "<none>" }
المكان:
- يقدّم
package
مفتاحًا فريدًا عند دمجه مع اسم العلامة. في Java، يؤدي ضبطpackage
علىfoo.bar
إلى إنشاء فئة تم إنشاؤها تلقائيًا باسمfoo.bar.Flags
. في C++، سيتم تسمية طرق الوصول إلى العلامة باسمfoo::bar::"flagname"
. تنتمي العلامات الموجودة في ملف التعريف نفسه إلى الحزمة نفسها، ولكن يمكن لملفات تعريف متعددة إضافة علامات إلى الحزمة نفسها. container
تحدِّد مجموعة من الرموز البرمجية التي يتم إنشاؤها وشحنها معًا بتنسيق ثنائي. الحاويات الصالحة هيsystem
وvendor
وsystem_ext
وproduct
وname.of.apex
وname.of.apk
.يحتوي
name
على اسم العلامة الذي يتضمّن أحرفًا صغيرة و شرطات سفلية وأرقامًا فقط.يحتوي
namespace
على مساحة الاسم للمساهمات. يجب أن تعمل مع مراجع Google المعين لتحديد مساحة الاسم. إذا كنت تستخدم علامات تشغيل الميزات للحفاظ على ثبات نسخة مطابقة AOSP، يمكنك استخدام مساحة الاسم كيفما تشاء.يحتوي
description
على وصف موجز للميزة أو التغيير تم وضع علامة عليه.bug
هو رقم الخطأ المرتبط بالمساهمة بالرمز الجديد. عليك العمل مع مراجع Google المخصّص لتحديدbug
. إذا كنت تستخدم علامات إطلاق الميزات للحفاظ على ثبات النسخة المطابقة من AOSP، يمكنك استخدام رقم تتبُّع الأخطاء أو استخدام<none>
.
- يقدّم
احفظ الملف واخرج من المحرِّر.
إعداد عملية الإنشاء
بعد تحديد علامتك، عليك إعداد عملية الإنشاء لكي تتمكّن من إنشاء رمز مكتبة يُستخدَم للوصول إلى قيمة العلامة.
في ملف تصميم
Android.bp
، أضِف قسمaconfig_declarations
على النحو التالي:aconfig_declarations { name: "aconfig_demo_flags", package: "com.example.android.aconfig.demo.flags", srcs: [ "my_new_aconfig_flag_declarations.aconfig" ], }
المكان:
- يحتوي
name
على اسم البيان الذي يحتوي فقط على أحرف أبجدية سفلية وشرطات سفلية وأرقام. - يحتوي
package
على اسم الحزمة نفسه المستخدَم في البيان. - يحتوي
srcs
على اسم ملف الإعداد الذي تم تعريف العلامة فيه.
- يحتوي
وفي الملف نفسه، أنشئ هدف
cc_aconfig_library
مشابهًا لما يلي:cc_aconfig_library { name: "aconfig_demo_flags_c_lib", aconfig_declarations: "aconfig_demo_flags", }
المكان:
- يحتوي
name
على اسم المكتبة الذي يحتوي فقط على أحرف أبجدية سفلية وأرقام وشرطات سفلية. - يحتوي
aconfig_declarations
على نفسname
المستخدم في البيان.
يستدعي هدف الإصدار
cc_aconfig_library
لغة C أو C++ Codegen، ما يؤدي إلى إنشاء مكتبة تحتوي على الرمز الذي تم إنشاؤه في وقت الإصدار.تشبه مكتبة إعدادات "نسخة إلى" إحدى استهدافات مكتبة "نسخة إلى"، ولكنها تحتوي على خيارات مثل
vendor_available
وproduct_available
وhost_supported
وvndk
. إذا كان هدف الإصدار اعتمادًا علىcc_aconfig_library
هذا يتطلب نوعًا معيّنًا من خيارات المنتج، قد تحتاج أيضًا إلى إضافة الإعداد المقابل في هدف مكتبة إعدادات نسخة إلى. على سبيل المثال، إذا تم ضبطvendor_available
في استهداف الإصدار الرئيسي علىtrue
، يمكنك أيضًا ضبطvendor_available
علىtrue
في هدفcc_aconfig_library
هذا.بعد إضافة هدف الإنشاء هذا، يمكن لرمزك الوصول إلى هذه المكتبة. ويمكنك تضمين هذه المكتبة باستخدام بنية
static_lib
أوshared_lib
. يُرجى العِلم أنّه إذا أردت إضافة هذه المكتبة على أنّهاstatic_lib
، أضِف تبعيةshared_lib
إلىserver_configurable_flags
. توضّح الخطوة الثالثة كيفية تضمين مكتبة العلامات التي تم إنشاؤها من خلال الرمز فيlibexample_cpp_lib
.- يحتوي
أنشئ هدفًا يستخدِم علامات aconfig، مثل المثال التالي
cc_library
:cc_library { name: "libexample_cpp_lib", srcs: ["src/example_cpp_lib.cc"], double_loadable: true, cflags: [ "-Wall", "-Werror", "-Wno-unused-function", "-Wno-unused-parameter", ], header_libs: [ "jni_headers", ], shared_libs: [ "server_configurable_flags", ], static_libs: [ "aconfig_demo_flags_c_lib", ], export_include_dirs: ["src/include"], }
المكان:
- يشمل
shared_libs
الاعتماديات الإضافية المطلوبة لعلامات الضبط. static_libs
هو اسم المكتبة التي أنشأها الإصدار وفقًا لحقلcc_aconfig_library
name
في الخطوة 2. من خلال إنشاء إدخالcc_library
مع اسم المكتبة الثابتة، يمكنك الآن استخدام علامات aconfig في الرمز البرمجي.
- يشمل
تحديد علامة aconfig لبرنامج Rust
لتعريف علامة aconfig لبرنامج Rust:
في دليل يتضمّن الرمز الجديد، أنشئ ملفًا بلاحقة
.aconfig
، على سبيل المثال،my_new_aconfig_flag_declarations.aconfig
. ملف aconfig هو ملف نصي عادي يتّبع مخطّطًا عاديًا.أضِف بيان إبلاغ مشابه لما يلي:
package: "com.example.android.aconfig.demo.flags" container: "system" flag { name: "my_new_flag" namespace: "aconfig_demo_namespace" description: "This flag controls untested code" bug: "<none>" }
المكان:
- يقدّم
package
مفتاحًا فريدًا عند دمجه مع اسم العلامة. في Java، يؤدي ضبطpackage
علىfoo.bar
إلى إنشاء فئة تم إنشاؤها تلقائيًا باسمfoo.bar.Flags
. في C++، سيتم تسمية طرق الوصول إلى العلامة باسمfoo::bar::"flagname"
. تنتمي العلامات الموجودة في ملف التعريف نفسه إلى الحزمة نفسها، ولكن يمكن لملفات تعريف متعددة إضافة علامات إلى الحزمة نفسها. container
تحدِّد مجموعة من الرموز البرمجية التي يتم إنشاؤها وشحنها معًا بتنسيق ثنائي. الحاويات الصالحة هيsystem
وvendor
وsystem_ext
وproduct
وname.of.apex
وname.of.apk
.يحتوي
name
على اسم العلامة الذي يتضمّن أحرفًا صغيرة و شرطات سفلية وأرقامًا فقط.يحتوي
namespace
على مساحة الاسم للمساهمات. يجب أن تعمل مع مراجع Google المعين لتحديد مساحة الاسم. إذا كنت تستخدم علامات تشغيل الميزات للحفاظ على ثبات نسخة مطابقة AOSP، يمكنك استخدام مساحة الاسم كيفما تشاء.يحتوي
description
على وصف موجز للميزة أو التغيير تم وضع علامة عليه.bug
هو رقم الخطأ المرتبط بالمساهمة بالرمز الجديد. عليك العمل مع مراجع Google المخصّص لتحديدbug
. إذا كنت تستخدم علامات إطلاق الميزات للحفاظ على ثبات النسخة المطابقة من AOSP، يمكنك استخدام رقم تتبُّع الأخطاء أو استخدام<none>
.
- يقدّم
احفظ الملف واخرج من المحرِّر.
إعداد عملية الإنشاء
بعد تعريف العلامة، عليك إعداد الإصدار كي يتمكّن من إنشاء رمز المكتبة المستخدَم للوصول إلى قيمة العلامة.
في ملف تصميم
Android.bp
، أضِف قسمaconfig_declarations
مشابهًا لما يلي:aconfig_declarations { name: "aconfig_demo_flags", package: "com.example.android.aconfig.demo.flags", srcs: [ "my_new_aconfig_flag_declarations.aconfig" ], }
المكان:
- يحتوي
name
على اسم البيان الذي يحتوي فقط على أحرف أبجدية سفلية وشرطات سفلية وأرقام. - يحتوي
package
على اسم الحزمة نفسه المستخدَم في البيان. - يحتوي
srcs
على اسم ملف الإعداد الذي تم تعريف العلامة فيه.
- يحتوي
أنشئ استهدافًا
rust_aconfig_library
مشابهًا للمثال التالي. يستدعي هذا الهدف Rust Codegen وينشئ مكتبة Rust باستخدام الرمز الذي تم إنشاؤه أثناء وقت الإنشاء.rust_aconfig_library { name: "libaconfig_demo_flags_rust", crate_name: "aconfig_demo_flags_rust", aconfig_declarations: "aconfig_demo_flags", }
المكان:
- يحتوي
name
على اسم البيان الذي يحتوي فقط على أحرف صغيرة وشرطات سفلية وأرقام. - يحتوي
crate_name
على اسم الحزمة نفسه المستخدَم في البيان. - يحتوي
aconfig_declarations
علىname
نفسه المستخدَم في البيان.
من خلال هذا التغيير، يمكن أن يعتمد الرمز البرمجي على مكتبة Rust هذه.
- يحتوي
في الملف نفسه، أنشئ إدخال
rust_library
مشابهًا لما يلي:rust_library { name: "libexample_lib", rustlibs: [ "libaconfig_demo_flags_rust", ] }
يسمح هذا النموذج لاستهدافات إنشاء رمز المصدر
libexample_demo_flags_rust
بتضمين مكتبة العلامات التي تم إنشاؤها من خلال الرمز.احفظ الملف واخرج من المحرر.