يمكنك استخدام علامات aconfig في رمز Java وC وC++ وRust. يشغِّل نظام إنشاء AOSP أداة تُسمى aconfig تُستخدَم لإنشاء مكتبة خاصة بلغة معيّنة من ال methods التي يمكنك استخدامها للوصول إلى قيمة كل علامة. قبل أن تتمكّن من إنشاء المكتبة، عليك تحديد العلامات وإضافتها إلى عملية الإنشاء.
تحديد علامة 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
الذي تمّ فيه الإعلان عن العلامة.
- يحتوي
احفظ الملف واخرج من المحرِّر.
تحديد علامة 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
على اسم ملف aconfig الذي تمّ فيه الإعلان عن العلامة.
- يحتوي
في الملف نفسه، أنشئ استهداف
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 التي تنشئ مكتبة تتضمّن الرمز الذي تم إنشاؤه في وقت الإنشاء.تشبه مكتبة aconfig في CC استهداف مكتبة CC، ولكنها تحتوي على خيارات مثل
vendor_available
وproduct_available
وhost_supported
وvndk
. إذا كان هدف الإنشاء الذي يعتمد على هذاcc_aconfig_library
يتطلّب نوعًا معيّنًا من الصيغ، قد تحتاج أيضًا إلى إضافة الإعداد المقابل في هدف مكتبة CC aconfig. على سبيل المثال، إذا كان هدف الإصدار الرئيسي قد تم ضبطه علىvendor_available
true
، قد تحتاج أيضًا إلى ضبطvendor_available
علىtrue
في هدفcc_aconfig_library
هذا.بعد إضافة هدف الإنشاء هذا، يمكن لرمزك الوصول إلى هذه المكتبة. يمكنك تضمين هذه المكتبة باستخدام بنية
static_lib
أوshared_lib
. ملاحظة: إذا كنت تريد إضافة هذه المكتبة كstatic_lib
، أضِف تبعيةshared_lib
علىserver_configurable_flags
. توضِّح الخطوة 3 كيفية تضمين مكتبة العلامات التي تم إنشاؤها من خلال الرمز البرمجي في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
تبعيات إضافية مطلوبة لإعدادات aconfig. 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
على اسم ملف aconfig الذي تمّ فيه الإعلان عن العلامة.
- يحتوي
أنشئ استهدافًا
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
لتضمين مكتبة العلامات التي تم إنشاؤها من خلال الرمز.احفظ الملف واخرج من المحرِّر.