تحديد علامة aconfig

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

تحديد علامة 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 أداة 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.

  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. احفظ الملف واخرج من المحرِّر.