Объявить флаг aconfig

Вы можете использовать флаги aconfig в коде Java, C, C++ и Rust. Система сборки AOSP запускает инструмент aconfig, используемый для генерации библиотеки методов, специфичных для конкретного языка, которые можно использовать для доступа к значению каждого флага. Перед тем, как вы сможете сгенерировать библиотеку, вы должны объявить флаги и добавить их в сборку.

Объявите флаг aconfig для Java

Чтобы объявить флаг aconfig для Java:

  1. В каталоге, где находится новый код, создайте файл с расширением .aconfig , например, my_new_aconfig_flag_declarations.aconfig . Файл aconfig — это текстовый proto-файл, который следует стандартной схеме.

  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 — это текстовый proto-файл, который следует стандартной схеме.

  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, который создает библиотеку со сгенерированным кодом во время сборки.

    Библиотека CC aconfig похожа на целевую библиотеку 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 — это имя библиотеки, которая создается сборкой в ​​соответствии с полем name cc_aconfig_library на шаге 2. Создав запись cc_library с именем статической библиотеки, вы теперь можете использовать флаги aconfig в своем коде.

Объявите флаг aconfig для Rust

Чтобы объявить флаг aconfig для Rust:

  1. В каталоге, где находится новый код, создайте файл с расширением .aconfig , например, my_new_aconfig_flag_declarations.aconfig . Файл aconfig — это текстовый proto-файл, который следует стандартной схеме.

  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. Сохраните файл и выйдите из редактора.