Объявить флаг 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 содержит имя файла конфигурации, в котором объявлен флаг.
  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 содержит имя файла конфигурации, в котором объявлен флаг.
  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. Сохраните файл и выйдите из редактора.