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:
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.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ścipackage
nafoo.bar
powoduje wygenerowanie klasy o nazwiefoo.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 tosystem
,vendor
,system_ext
,product
,name.of.apex
iname.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>
.
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.
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ę.
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++:
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.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ścipackage
nafoo.bar
powoduje wygenerowanie klasy o nazwiefoo.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 tosystem
,vendor
,system_ext
,product
,name.of.apex
iname.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>
.
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.
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ę.
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 samename
, 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
ivndk
. 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 mavendor_available
ustawiony natrue
, możesz też ustawićvendor_available
natrue
w tym celucc_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
lubshared_lib
. Jeśli chcesz dodać tę bibliotekę jakostatic_lib
, dodaj zależnośćshared_lib
odserver_configurable_flags
. Krok 3 pokazuje, jak dołączyć dolibexample_cpp_lib
bibliotekę flag wygenerowanych przez kod.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 polemcc_aconfig_library
name
w kroku 2. Po utworzeniu wpisucc_library
z nazwą biblioteki statycznej możesz używać w kodzie flag aconfig.
Zadeklaruj flagę aconfig dla Rust
Aby zadeklarować flagę aconfig dla Rust:
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.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ścipackage
nafoo.bar
powoduje wygenerowanie klasy o nazwiefoo.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 tosystem
,vendor
,system_ext
,product
,name.of.apex
iname.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>
.
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.
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ę.
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 elementname
, który został użyty w deklaracji.
Dzięki tej zmianie Twój kod może być zależny od tej biblioteki Rust.
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.Zapisz plik i zamknij edytor.