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:
W katalogu, w którym istnieje nowy kod, utwórz plik z rozszerzeniem
.aconfig
, na przykładmy_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:
- W połączeniu z nazwą flagi
package
zapewnia unikalny klucz. W Javie ustawieniepackage
nafoo.bar
powoduje wygenerowanie automatycznie klasy o nazwiefoo.bar.Flags
W C++ metody akcesorów flag będą nazywanefoo::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 tosystem
,vendor
,system_ext
,product
,name.of.apex
iname.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>
.
- W połączeniu z nazwą flagi
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.
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.
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 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:
- W połączeniu z nazwą flagi
package
zapewnia unikalny klucz. W Javie ustawieniepackage
nafoo.bar
powoduje wygenerowanie automatycznie klasy o nazwiefoo.bar.Flags
W C++ metody akcesorów flag będą nazywanefoo::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 tosystem
,vendor
,system_ext
,product
,name.of.apex
iname.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>
.
- W połączeniu z nazwą flagi
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
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ę.
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 elementname
, 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
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 konfiguracji CC. Jeśli np. w ustawieniuvendor_available
w celu nadrzędnymvendor_available
jest ustawiona wartośćtrue
, możesz też ustawić wartośćvendor_available
w celucc_aconfig_library
natrue
.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
lubshared_lib
. Jeśli chcesz dodać tę bibliotekę jakostatic_lib
, dodaj zależnośćshared_lib
odserver_configurable_flags
. Krok 3. pokazuje, jak uwzględnić w plikulibexample_cpp_lib
bibliotekę flag wygenerowaną przez kod.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ę zgodniecc_aconfig_library
name
w kroku 2. Tworząc wpis w usłudzecc_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:
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.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 ustawieniepackage
nafoo.bar
powoduje wygenerowanie automatycznie klasy o nazwiefoo.bar.Flags
W C++ metody akcesorów flag będą nazywanefoo::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 tosystem
,vendor
,system_ext
,product
,name.of.apex
iname.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>
.
- W połączeniu z nazwą flagi
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.
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.
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 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ędnienie biblioteki flag wygenerowanych przez kod.Zapisz plik i zamknij edytor.