یک پرچم aconfig را اعلام کنید

شما می‌توانید از پرچم‌های aconfig در کدهای جاوا، سی، سی پلاس پلاس و Rust استفاده کنید. سیستم ساخت AOSP ابزاری به نام aconfig را راه‌اندازی می‌کند که برای تولید یک کتابخانه مختص زبان از متدهایی که می‌توانید برای دسترسی به مقدار هر پرچم استفاده کنید، استفاده می‌شود. قبل از اینکه بتوانید کتابخانه را تولید کنید، باید پرچم‌ها را تعریف کرده و آنها را به ساخت اضافه کنید.

یک پرچم aconfig برای جاوا تعریف کنید

برای تعریف یک پرچم aconfig برای جاوا:

  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 ، وقتی با نام flag ترکیب شود، یک کلید منحصر به فرد ارائه می‌دهد. در جاوا، تنظیم package به foo.bar منجر به یک کلاس خودکار تولید شده به نام foo.bar.Flags می‌شود. در C++، متدهای دسترسی flag به صورت foo::bar::" flagname " نامگذاری می‌شوند. flagهای موجود در یک فایل اعلان متعلق به یک پکیج هستند، اما چندین فایل اعلان می‌توانند flagها را به یک پکیج اضافه کنند.
    • container مجموعه‌ای از کدها را تعریف می‌کند که به صورت یک فایل باینری ساخته و ارسال می‌شوند. کانتینرهای معتبر عبارتند از system ، vendor ، system_ext ، product ، name.of.apex و name.of.apk .

    • name شامل نام پرچم است که فقط شامل حروف کوچک، زیرخط و اعداد است.

    • namespace شامل namespace برای مشارکت‌ها است. شما باید با بررسی‌کننده‌ی تعیین‌شده‌ی گوگل برای تعیین namespace خود همکاری کنید. اگر از پرچم‌های راه‌اندازی ویژگی برای حفظ پایداری آینه‌ی AOSP خود استفاده می‌کنید، می‌توانید از namespace به هر شکلی که دوست دارید استفاده کنید.

    • description شامل شرح مختصری از ویژگی یا تغییری است که علامت‌گذاری شده است.

    • bug شماره باگی است که به کد جدید اضافه شده مرتبط است. شما باید با بررسی‌کننده گوگل که برای تعیین 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 ، وقتی با نام flag ترکیب شود، یک کلید منحصر به فرد ارائه می‌دهد. در جاوا، تنظیم package به foo.bar منجر به یک کلاس خودکار تولید شده به نام foo.bar.Flags می‌شود. در C++، متدهای دسترسی flag به صورت foo::bar::" flagname " نامگذاری می‌شوند. flagهای موجود در یک فایل اعلان متعلق به یک پکیج هستند، اما چندین فایل اعلان می‌توانند flagها را به یک پکیج اضافه کنند.
    • container مجموعه‌ای از کدها را تعریف می‌کند که به صورت یک فایل باینری ساخته و ارسال می‌شوند. کانتینرهای معتبر عبارتند از system ، vendor ، system_ext ، product ، name.of.apex و name.of.apk .

    • name شامل نام پرچم است که فقط شامل حروف کوچک، زیرخط و اعداد است.

    • namespace شامل namespace برای مشارکت‌ها است. شما باید با بررسی‌کننده‌ی تعیین‌شده‌ی گوگل برای تعیین namespace خود همکاری کنید. اگر از پرچم‌های راه‌اندازی ویژگی برای حفظ پایداری آینه‌ی AOSP خود استفاده می‌کنید، می‌توانید از namespace به هر شکلی که دوست دارید استفاده کنید.

    • description شامل شرح مختصری از ویژگی یا تغییری است که علامت‌گذاری شده است.

    • bug شماره باگی است که به کد جدید اضافه شده مرتبط است. شما باید با بررسی‌کننده گوگل که برای تعیین 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 به نوع خاصی از متغیرها نیاز داشته باشد، ممکن است لازم باشد تنظیمات مربوطه را در هدف کتابخانه aconfig در CC نیز اضافه کنید. برای مثال، اگر هدف ساخت والد vendor_available را روی true تنظیم کرده باشد، ممکن است بخواهید vendor_available در این هدف cc_aconfig_library روی true تنظیم کنید.

    پس از افزودن این هدف ساخت، کد شما می‌تواند به این کتابخانه دسترسی داشته باشد. می‌توانید این کتابخانه را با استفاده از سینتکس 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 نام کتابخانه‌ای است که توسط build طبق فیلد name cc_aconfig_library در مرحله ۲ ایجاد می‌شود. با ایجاد یک ورودی 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 ، وقتی با نام flag ترکیب شود، یک کلید منحصر به فرد ارائه می‌دهد. در جاوا، تنظیم package به foo.bar منجر به یک کلاس خودکار تولید شده به نام foo.bar.Flags می‌شود. در C++، متدهای دسترسی flag به صورت foo::bar::" flagname " نامگذاری می‌شوند. flagهای موجود در یک فایل اعلان متعلق به یک پکیج هستند، اما چندین فایل اعلان می‌توانند flagها را به یک پکیج اضافه کنند.
    • container مجموعه‌ای از کدها را تعریف می‌کند که به صورت یک فایل باینری ساخته و ارسال می‌شوند. کانتینرهای معتبر عبارتند از system ، vendor ، system_ext ، product ، name.of.apex و name.of.apk .

    • name شامل نام پرچم است که فقط شامل حروف کوچک، زیرخط و اعداد است.

    • namespace شامل namespace برای مشارکت‌ها است. شما باید با بررسی‌کننده‌ی تعیین‌شده‌ی گوگل برای تعیین namespace خود همکاری کنید. اگر از پرچم‌های راه‌اندازی ویژگی برای حفظ پایداری آینه‌ی AOSP خود استفاده می‌کنید، می‌توانید از namespace به هر شکلی که دوست دارید استفاده کنید.

    • description شامل شرح مختصری از ویژگی یا تغییری است که علامت‌گذاری شده است.

    • bug شماره باگی است که به کد جدید اضافه شده مرتبط است. شما باید با بررسی‌کننده گوگل که برای تعیین 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. فایل را ذخیره کنید و از ویرایشگر خارج شوید.