Deklarowanie flagi aconfig

Flag aconfig można używać w kodzie Java, C, C++ i Rust. System kompilacji AOSP uruchamia narzędzie o nazwie aconfig, które służy do generowania biblioteki metod dla poszczególnych języków. Za pomocą tych metod można uzyskać dostęp do wartości poszczególnych flag. Przed wygenerowaniem w bibliotece, musisz zadeklarować flagi i dodać je do kompilacji.

Deklarowanie flagi aconfig dla Javy

Aby zadeklarować flagę aconfig dla Javy:

  1. W katalogu, w którym istnieje nowy kod, utwórz plik z rozszerzeniem .aconfig, na przykład my_new_aconfig_flag_declarations.aconfig. Plik aconfig to tekstowy plik proto zgodny ze standardowym schematem.

  2. Dodaj deklarację flagi podobną do tej:

    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>"
    }
    

    Gdzie:

    • W połączeniu z nazwą flagi package zapewnia unikalny klucz. W Javie ustawienie package na foo.bar powoduje wygenerowanie automatycznie klasy o nazwie foo.bar.Flags W C++ metody akcesorów flag będą nazywane foo::bar::"flagname" Flagi w tej samej deklaracji należą do tego samego pakietu, ale wiele plików deklaracji może zgłaszaj flagi do tego samego pakietu.
    • container określa zbiór kodu, który jest kompilowany i wysyłany razem jako wartość binarną. Prawidłowe kontenery to system, vendor, system_ext, product, name.of.apex i name.of.apk.

    • name zawiera nazwę flagi zawierającą tylko małe litery, podkreślenia i cyfry.

    • namespace zawiera przestrzeń nazw na potrzeby publikowanych treści. Musisz współpracować z przypisanego recenzenta Google, który określi Twoją przestrzeń nazw. Jeśli używasz flagi uruchomienia funkcji w celu utrzymania stabilności lustra AOSP, możesz używać przestrzeni nazw w dowolny sposób.

    • description zawiera krótki opis funkcji lub zmiany, która została oznaczona.

    • bug to numer błędu powiązany z nowym kodem. Aby określić bug, musisz współpracować z przypisanym do Twojego konta recenzentem Google. Jeśli używasz flag uruchamiania funkcji, aby zachować stabilność własnego mirroru AOSP, możesz użyć numeru śledzenia błędów lub użyć <none>.

    .
  3. Zapisz plik i zamknij edytor.

Konfigurowanie kompilacji

Po zadeklarowaniu flagi skonfiguruj kompilację tak, aby generowała parametr który pozwala uzyskać dostęp do wartości flagi.

  1. W pliku kompilacji Android.bp dodaj sekcję aconfig_declarations podobną do tej:

    aconfig_declarations {
      name: "aconfig_demo_flags",
      package: "com.example.android.aconfig.demo.flags",
      srcs: [
        "my_new_aconfig_flag_declarations.aconfig"
      ],
    }
    

    Gdzie:

    • name zawiera nazwę deklaracji zawierającą tylko małe litery, podkreślenia i cyfry.
    • package zawiera tę samą nazwę pakietu, która została użyta w deklaracji.
    • srcs zawiera nazwę pliku .aconfig, w którym jest zadeklarowany flaga.
  2. Zapisz plik i zamknij edytor.

Deklarowanie flagi aconfig w językach C i C++

Aby zadeklarować flagę aconfig dla języków C i C++:

  1. W katalogu, w którym znajduje się nowy kod, utwórz plik o rozszerzeniu .aconfig, np. my_new_aconfig_flag_declarations.aconfig. Plik aconfig to tekstowy plik proto zgodny ze standardowym schematem.

  2. Dodaj deklarację flagi podobną do tej:

    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>"
    }
    

    Gdzie:

    • W połączeniu z nazwą flagi package zapewnia unikalny klucz. W Javie ustawienie package na foo.bar powoduje wygenerowanie automatycznie klasy o nazwie foo.bar.Flags W C++ metody akcesorów flag będą nazywane foo::bar::"flagname" Flagi w tej samej deklaracji należą do tego samego pakietu, ale wiele plików deklaracji może zgłaszaj flagi do tego samego pakietu.
    • container określa zbiór kodu, który jest kompilowany i wysyłany razem jako wartość binarną. Prawidłowe kontenery to system, vendor, system_ext, product, name.of.apex i name.of.apk.

    • name zawiera nazwę flagi zawierającą tylko małe litery, podkreślenia i cyfry.

    • namespace zawiera przestrzeń nazw na potrzeby publikowanych treści. Musisz współpracować z przypisanego recenzenta Google, który określi Twoją przestrzeń nazw. Jeśli używasz flagi uruchomienia funkcji w celu utrzymania stabilności lustra AOSP, możesz używać przestrzeni nazw w dowolny sposób.

    • description zawiera krótki opis funkcji lub zmiany, która została oznaczona.

    • bug to numer błędu powiązany z nowym kodem. Aby określić bug, musisz współpracować z przypisanym do Twojego konta recenzentem Google. Jeśli używasz flag uruchamiania funkcji, aby zachować stabilność własnego mirroru AOSP, możesz użyć numeru śledzenia błędów lub użyć <none>.

    .
  3. Zapisz plik i zamknij edytor.

Konfigurowanie kompilacji

Po zadeklarowaniu flagi skonfiguruj kompilację, aby mogła wygenerować kod biblioteki służący do uzyskiwania dostępu do wartości flagi.

  1. W pliku kompilacji Android.bp dodaj sekcję aconfig_declarations podobnie jak poniżej:

    aconfig_declarations {
      name: "aconfig_demo_flags",
      package: "com.example.android.aconfig.demo.flags",
      srcs: [
        "my_new_aconfig_flag_declarations.aconfig"
      ],
    }
    

    Gdzie:

    • name zawiera nazwę deklaracji zawierającą tylko małe litery, podkreślenia i cyfry.
    • package zawiera tę samą nazwę pakietu, która została użyta w deklaracji.
    • srcs zawiera nazwę pliku aconfig, w którym zadeklarowano flagę.
  2. W tym samym pliku utwórz środowisko docelowe cc_aconfig_library podobne do :

    cc_aconfig_library {
        name: "aconfig_demo_flags_c_lib",
        aconfig_declarations: "aconfig_demo_flags",
    }
    

    Gdzie:

    • name zawiera nazwę biblioteki zawierającej tylko małe litery, podkreślenia i cyfry.
    • Pole aconfig_declarations zawiera ten sam element name, który został użyty w deklaracji.

    Cel kompilacji cc_aconfig_library wywołuje kod C lub C++ Codegen, który tworzy biblioteki z kodem wygenerowanym w momencie kompilacji.

    Biblioteka aconfig CC jest podobna do docelowej biblioteki CC, ale ma opcje takie jak vendor_available, product_available, host_supported i vndk Jeśli docelowy typ kompilacji zależny od tego parametru wymaga pewnych typów wariantów, konieczne może być dodanie odpowiedniego ustawienia w docelowej bibliotece konfiguracji CC. Jeśli np. w ustawieniu vendor_available w celu nadrzędnym vendor_available jest ustawiona wartość true, możesz też ustawić wartość vendor_available w celu cc_aconfig_library na true.

    Po dodaniu tego celu kompilacji Twój kod będzie miał dostęp do tej biblioteki. Możesz umieścić tę bibliotekę, używając składni static_lib lub shared_lib. Jeśli chcesz dodać tę bibliotekę jako static_lib, dodaj zależność shared_lib od server_configurable_flags. Krok 3. pokazuje, jak uwzględnić w pliku libexample_cpp_lib bibliotekę flag wygenerowaną przez kod.

  3. Utwórz środowisko docelowe używające flag aconfig, jak w tym przykładzie 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"],
    }
    

    Gdzie:

    • shared_libs zawiera dodatkowe zależności wymagane do flag aconfig.
    • static_libs to nazwa biblioteki utworzonej przez kompilację zgodnie cc_aconfig_library name w kroku 2. Tworząc wpis w usłudze cc_library ze statyczną nazwą biblioteki, możesz teraz używać w kodzie flag aconfig.

Zadeklaruj flagę aconfig dla Rust

Aby zadeklarować flagę aconfig dla Rust:

  1. W katalogu, w którym znajduje się nowy kod, utwórz plik o rozszerzeniu .aconfig, np. my_new_aconfig_flag_declarations.aconfig. Plik aconfig to plik tekstowy proto, który jest zgodny ze standardowym schematem.

  2. Dodaj deklarację flagi podobną do tej:

    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>"
    }
    

    Gdzie:

    • W połączeniu z nazwą flagi package zapewnia unikalny klucz. W Javie ustawienie package na foo.bar powoduje wygenerowanie automatycznie klasy o nazwie foo.bar.Flags W C++ metody akcesorów flag będą nazywane foo::bar::"flagname" Flagi w tej samej deklaracji należą do tego samego pakietu, ale wiele plików deklaracji może zgłaszaj flagi do tego samego pakietu.
    • container określa zbiór kodu, który jest kompilowany i wysyłany razem jako wartość binarną. Prawidłowe kontenery to system, vendor, system_ext, product, name.of.apex i name.of.apk.

    • name zawiera nazwę flagi zawierającą tylko małe litery, podkreślenia i cyfry.

    • namespace zawiera przestrzeń nazw na potrzeby publikowanych treści. Musisz współpracować z przypisanego recenzenta Google, który określi Twoją przestrzeń nazw. Jeśli używasz flagi uruchomienia funkcji w celu utrzymania stabilności lustra AOSP, możesz używać przestrzeni nazw w dowolny sposób.

    • description zawiera krótki opis funkcji lub zmiany, która została oznaczona.

    • bug to numer błędu powiązany z nowym kodem. Aby określić bug, musisz współpracować z przypisanym do Twojego konta recenzentem Google. Jeśli używasz flag uruchamiania funkcji, aby zachować stabilność własnego mirroru AOSP, możesz użyć numeru śledzenia błędów lub użyć <none>.

    .
  3. Zapisz plik i zamknij edytor.

Konfigurowanie kompilacji

Po zadeklarowaniu flagi skonfiguruj kompilację tak, aby generowała parametr który pozwala uzyskać dostęp do wartości flagi.

  1. W pliku kompilacji Android.bp dodaj sekcję aconfig_declarations podobną do na:

    aconfig_declarations {
      name: "aconfig_demo_flags",
      package: "com.example.android.aconfig.demo.flags",
      srcs: [
        "my_new_aconfig_flag_declarations.aconfig"
      ],
    }
    

    Gdzie:

    • name zawiera nazwę deklaracji zawierającą tylko małe litery, podkreślenia i cyfry.
    • package zawiera tę samą nazwę pakietu, która została użyta w deklaracji.
    • srcs zawiera nazwę pliku aconfig, w którym jest zadeklarowana flaga.
  2. Utwórz środowisko docelowe rust_aconfig_library podobne do tego w następującym przykładzie. Ten cel wywołuje Rust Codegen i tworzy bibliotekę Rust z wygenerowanym kodem podczas kompilacji.

    rust_aconfig_library {
      name: "libaconfig_demo_flags_rust",
      crate_name: "aconfig_demo_flags_rust",
      aconfig_declarations: "aconfig_demo_flags",
    }
    

    Gdzie:

    • name zawiera nazwę deklaracji zawierającą tylko małe litery, podkreślenia i cyfry.
    • crate_name zawiera tę samą nazwę pakietu, która została użyta w deklaracji.
    • Pole aconfig_declarations zawiera ten sam element name, który został użyty w deklaracji.

    Dzięki tej zmianie Twój kod może być zależny od tej biblioteki Rust.

  3. W tym samym pliku utwórz wpis rust_library podobny do tego:

    rust_library {
      name: "libexample_lib",
      rustlibs: [
          "libaconfig_demo_flags_rust",
      ]
    }
    

    Ten przykład umożliwia celom kompilacji kodu źródłowego libexample_demo_flags_rust uwzględnienie biblioteki flag wygenerowanych przez kod.

  4. Zapisz plik i zamknij edytor.