Deklarowanie flagi aconfig

Flagi aconfig możesz używać w kodzie Java, C, C++ i Rust. System kompilacji AOSP uruchamia narzędzie o nazwie aconfig używane do generowania biblioteki metod w danym języku, dzięki której można uzyskać dostęp do wartości poszczególnych flag. Zanim wygenerujesz bibliotekę, musisz zadeklarować flagi i dodać je do kompilacji.

Deklarowanie flagi aconfig w Javie

Aby zadeklarować flagę aconfig w Javie:

  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:

    • package w połączeniu z nazwą flagi tworzy unikalny klucz. W Javie ustawienie wartości package na foo.bar powoduje wygenerowanie klasy o nazwie foo.bar.Flags. W C++ metody dostępu do flagi mają nazwę foo::bar::"flagname". Flagi w tym samym pliku deklaracji należą do tego samego pakietu, ale do tego samego pakietu mogą się też zaliczać flagi z kilku plików deklaracji.
    • container definiuje zbiór kodu, który jest kompilowany i wysyłany razem jako plik binarny. Dozwolone kontenery to system, vendor, system_ext, product, name.of.apex i name.of.apk.

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

    • namespace zawiera przestrzeń nazw darowizn. Aby ustalić swoją przestrzeń nazw, musisz współpracować z przypisanym recenzentem Google. Jeśli używasz flag uruchamiania funkcji, by zachować stabilność własnego serwera lustrzanego AOSP, możesz używać przestrzeni nazw w dowolny sposób.

    • Pole description zawiera krótki opis obiektu lub zgłoszonej zmiany.

    • 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 modelu lustrzanego AOSP, możesz użyć numeru śledzenia błędów lub <none>.

  3. Zapisz plik i zamknij edytor.

Konfigurowanie kompilacji

Po zadeklarowaniu flagi skonfiguruj kompilację tak, 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 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 taką samą nazwę pakietu jak w deklaracji.
    • srcs zawiera nazwę pliku .aconfig, w którym zadeklarowano flagę.
  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 z rozszerzeniem .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:

    • package w połączeniu z nazwą flagi tworzy unikalny klucz. W Javie ustawienie wartości package na foo.bar powoduje wygenerowanie klasy o nazwie foo.bar.Flags. W C++ metody dostępu do flagi mają nazwę foo::bar::"flagname". Flagi w tym samym pliku deklaracji należą do tego samego pakietu, ale do tego samego pakietu mogą się też zaliczać flagi z kilku plików deklaracji.
    • container definiuje zbiór kodu, który jest kompilowany i wysyłany razem jako plik binarny. Dozwolone kontenery to system, vendor, system_ext, product, name.of.apex i name.of.apk.

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

    • namespace zawiera przestrzeń nazw darowizn. Aby ustalić swoją przestrzeń nazw, musisz współpracować z przypisanym recenzentem Google. Jeśli używasz flag uruchamiania funkcji, by zachować stabilność własnego serwera lustrzanego AOSP, możesz używać przestrzeni nazw w dowolny sposób.

    • Pole description zawiera krótki opis obiektu lub zgłoszonej zmiany.

    • 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 modelu lustrzanego AOSP, możesz użyć numeru śledzenia błędów lub <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 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 taką samą nazwę pakietu jak 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 tego:

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

    Gdzie:

    • name zawiera nazwę biblioteki, która zawiera tylko małe litery, podkreślenia i cyfry.
    • aconfig_declarations zawiera te same name, co w deklaracji.

    Cel kompilacji cc_aconfig_library wywołuje Codegen w języku C lub C++, który tworzy bibliotekę z kodem wygenerowanym w momencie kompilacji.

    Biblioteka CC aconfig jest podobna do biblioteki docelowej CC, ale zawiera 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 aconfig CC. Jeśli na przykład nadrzędny cel kompilacji ma vendor_available ustawiony na true, możesz też ustawić vendor_available na true w tym celu cc_aconfig_library.

    Po dodaniu tego celu kompilacji Twój kod będzie mieć 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 dołączyć do libexample_cpp_lib bibliotekę flag wygenerowanych przez kod.

  3. Utwórz środowisko docelowe, które używa flag aconfig, np.: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 dla flag aconfig.
    • static_libs to nazwa biblioteki utworzonej przez kompilację zgodnie z polem cc_aconfig_library name w kroku 2. Po utworzeniu wpisu cc_library z nazwą biblioteki statycznej możesz 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 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:

    • package w połączeniu z nazwą flagi tworzy unikalny klucz. W Javie ustawienie wartości package na foo.bar powoduje wygenerowanie klasy o nazwie foo.bar.Flags. W C++ metody dostępu do flagi mają nazwę foo::bar::"flagname". Flagi w tym samym pliku deklaracji należą do tego samego pakietu, ale do tego samego pakietu mogą się też zaliczać flagi z kilku plików deklaracji.
    • container definiuje zbiór kodu, który jest kompilowany i wysyłany razem jako plik binarny. Dozwolone kontenery to system, vendor, system_ext, product, name.of.apex i name.of.apk.

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

    • namespace zawiera przestrzeń nazw darowizn. Aby ustalić swoją przestrzeń nazw, musisz współpracować z przypisanym recenzentem Google. Jeśli używasz flag uruchamiania funkcji, by zachować stabilność własnego serwera lustrzanego AOSP, możesz używać przestrzeni nazw w dowolny sposób.

    • Pole description zawiera krótki opis obiektu lub zgłoszonej zmiany.

    • 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 modelu lustrzanego AOSP, możesz użyć numeru śledzenia błędów lub <none>.

  3. Zapisz plik i zamknij edytor.

Konfigurowanie kompilacji

Po zadeklarowaniu flagi skonfiguruj kompilację tak, 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 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 taką samą nazwę pakietu jak w deklaracji.
    • srcs zawiera nazwę pliku aconfig, w którym zadeklarowano flagę.
  2. Utwórz cel rust_aconfig_library podobny do poniższego przykładu. Ten cel wywołuje Rust Codegen i tworzy bibliotekę Rust z wygenerowanym kodem w czasie 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, znaki podkreślenia i cyfry.
    • crate_name zawiera taką samą nazwę pakietu jak 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ędnianie biblioteki flag wygenerowanej przez kod.

  4. Zapisz plik i zamknij edytor.