تحديد علامة aconfig

يمكنك استخدام علامات aconfig في رمز Java وC وC++‎ وRust. يُطلق نظام إنشاء AOSP أداة باسم aconfig تُستخدَم لإنشاء مكتبة خاصة باللغة تتضمّن طرقًا يمكنك استخدامها للوصول إلى قيمة كل علامة. قبل أن تتمكّن من إنشاء المكتبة، عليك تعريف العلامات وإضافتها إلى الإصدار.

تعريف علامة aconfig لتطبيق Java

لتعريف علامة aconfig لتطبيق Java، اتّبِع الخطوات التالية:

  1. في دليل يتضمّن الرمز الجديد، أنشئ ملفًا بالامتداد .aconfig، مثل my_new_aconfig_flag_declarations.aconfig. ملف aconfig هو ملف نصي أولي يتّبع مخططًا عاديًا.

  2. أضِف تعريف علامة مشابهًا لما يلي:

    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>.

  3. احفظ الملف واخرج من المحرّر.

إعداد الإصدار

بعد تعريف العلامة، عليك إعداد الإصدار لكي يتمكّن من إنشاء رمز المكتبة المستخدَم للوصول إلى قيمة العلامة.

  1. في ملف الإنشاء 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 الذي تم فيه تعريف العلامة.
  2. احفظ الملف واخرج من المحرّر.

تعريف علامة aconfig للغة C وC++

لتعريف علامة aconfig للغة C وC++‎، اتّبِع الخطوات التالية:

  1. في دليل يتضمّن الرمز الجديد، أنشئ ملفًا بالامتداد .aconfig، مثل my_new_aconfig_flag_declarations.aconfig. ملف aconfig هو ملف نصي أولي يتّبع مخططًا عاديًا.

  2. أضِف تعريف علامة مشابهًا لما يلي:

    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>.

  3. احفظ الملف واخرج من المحرّر.

إعداد الإصدار

بعد تعريف العلامة، عليك إعداد الإصدار لكي يتمكّن من إنشاء رمز المكتبة المستخدَم للوصول إلى قيمة العلامة.

  1. في ملف الإنشاء 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 الذي تم فيه تعريف العلامة.
  2. في الملف نفسه، أنشئ هدفًا cc_aconfig_library مشابهًا لما يلي:

    cc_aconfig_library {
        name: "aconfig_demo_flags_c_lib",
        aconfig_declarations: "aconfig_demo_flags",
    }
    

    المكان:

    • يحتوي name على اسم المكتبة التي تتضمّن أحرفًا صغيرة وشرطات سفلية وأرقامًا فقط.
    • يحتوي aconfig_declarations على name نفسه المستخدَم في البيان.

    يستدعي هدف الإنشاء cc_aconfig_library Codegen للغة C أو C++، ما يؤدي إلى إنشاء مكتبة تتضمّن الرمز البرمجي الذي تم إنشاؤه في وقت الإنشاء.

    تشبه مكتبة CC aconfig هدف مكتبة CC، ولكنها تتضمّن خيارات مثل vendor_available وproduct_available وhost_supported وvndk. إذا كان هدف الإصدار الذي يعتمد على cc_aconfig_library يتطلّب نوعًا معيّنًا من الصيغ، قد تحتاج أيضًا إلى إضافة الإعداد المقابل في هدف مكتبة CC aconfig. على سبيل المثال، إذا كان هدف الإصدار الرئيسي مضبوطًا على vendor_availabletrue، قد تحتاج أيضًا إلى ضبط vendor_available على true في هدف الإصدار cc_aconfig_library هذا.

    بعد إضافة هدف الإنشاء هذا، يمكن أن يصل الرمز البرمجي إلى هذه المكتبة. يمكنك تضمين هذه المكتبة باستخدام بنية static_lib أو shared_lib. يُرجى العِلم أنّه إذا أردت إضافة هذه المكتبة كـ static_lib، عليك إضافة تبعية shared_lib إلى server_configurable_flags. تعرض الخطوة 3 كيفية تضمين مكتبة العلامات التي تم إنشاؤها باستخدام الرمز البرمجي في libexample_cpp_lib.

  3. أنشئ هدفًا يستخدِم علامات 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، اتّبِع الخطوات التالية:

  1. في دليل يتضمّن الرمز الجديد، أنشئ ملفًا بالامتداد .aconfig، مثل my_new_aconfig_flag_declarations.aconfig. ملف aconfig هو ملف نصي أولي يتّبع مخططًا عاديًا.

  2. أضِف تعريف علامة مشابهًا لما يلي:

    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>.

  3. احفظ الملف واخرج من المحرّر.

إعداد الإصدار

بعد تعريف العلامة، عليك إعداد الإصدار لكي يتمكّن من إنشاء رمز المكتبة المستخدَم للوصول إلى قيمة العلامة.

  1. في ملف إنشاء 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 الذي تم فيه تعريف العلامة.
  2. أنشئ 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 هذه.

  3. في الملف نفسه، أنشئ إدخال rust_library مشابهًا لما يلي:

    rust_library {
      name: "libexample_lib",
      rustlibs: [
          "libaconfig_demo_flags_rust",
      ]
    }
    

    يسمح هذا النموذج لأهداف إنشاء رمز المصدر libexample_demo_flags_rust بتضمين مكتبة العلامات التي تم إنشاؤها.

  4. احفظ الملف واخرج من المحرّر.