تحديد علامة aconfig

يمكنك استخدام علامات aconfig في رمز Java وC وC++ وRust. يطلق نظام إصدار AOSP أداة تسمى الإعداد (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. احفظ الملف واخرج من المحرر.

تعريف علامة الضبط لكل من 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 على اسم ملف الإعداد الذي تم تعريف العلامة فيه.
  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 لغة 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.

  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 الاعتماديات الإضافية المطلوبة لعلامات الضبط.
    • 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 على اسم ملف الإعداد الذي تم تعريف العلامة فيه.
  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. احفظ الملف واخرج من المحرر.