Объявить флаг 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 — это номер ошибки, связанный с новым вкладом кода. Чтобы определить bug вам необходимо обратиться к назначенному рецензенту Google. Если вы используете флаги запуска функций для поддержания стабильности вашего собственного зеркала 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 — это номер ошибки, связанный с новым вкладом кода. Чтобы определить bug вам необходимо обратиться к назначенному рецензенту Google. Если вы используете флаги запуска функций для поддержания стабильности вашего собственного зеркала 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, который создает библиотеку с сгенерированным кодом во время сборки.

    Библиотека aconfig CC аналогична целевой библиотеке CC, но имеет такие параметры, vendor_available , product_available , host_supported и vndk . Если цель сборки, зависящая от этой cc_aconfig_library требует определенного типа вариантов, вам также может потребоваться добавить соответствующий параметр в цель библиотеки aconfig CC. Например, если для родительского целевого объекта сборки 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 включает дополнительные зависимости, необходимые для флагов конфигурации.
    • static_libs — это имя библиотеки, созданной при сборке в соответствии с полем name cc_aconfig_library на шаге 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 — это номер ошибки, связанный с новым вкладом кода. Чтобы определить bug вам необходимо обратиться к назначенному рецензенту Google. Если вы используете флаги запуска функций для поддержания стабильности вашего собственного зеркала 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. Сохраните файл и выйдите из редактора.