Flagi aconfig możesz 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. 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 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:
package
w połączeniu z nazwą flagi tworzy klucz niepowtarzalny. W Javie ustawienie wartościpackage
nafoo.bar
powoduje wygenerowanie automatycznie 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ą też należeć flagi z wielu plików deklaracji.container
definiuje zbiór kodu, który jest kompilowany i wysyłany jako plik binarny. Dozwolone 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 dla wkładów. Aby określić swoją przestrzeń nazw, musisz skontaktować się z powierzonym recenzentem Google. Jeśli używasz flag uruchamiania funkcji, aby zachować stabilność własnego lustra AOSP, możesz dowolnie korzystać z przestrzeni nazw.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 pośrednikiem 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>
.
Zapisz plik i zamknij edytor.
Konfigurowanie kompilacji
Po zadeklarowaniu flagi skonfiguruj kompilację, aby mogła wygenerować kod biblioteki, który służy 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, znaki 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 w językach C i C++, wykonaj te czynności:
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:
package
w połączeniu z nazwą flagi tworzy klucz niepowtarzalny. W Javie ustawienie wartościpackage
nafoo.bar
powoduje wygenerowanie automatycznie 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ą też należeć flagi z wielu plików deklaracji.container
definiuje zbiór kodu, który jest kompilowany i wysyłany jako plik binarny. Dozwolone 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 dla wkładów. Aby określić swoją przestrzeń nazw, musisz skontaktować się z powierzonym recenzentem Google. Jeśli używasz flag uruchamiania funkcji, aby zachować stabilność własnego lustra AOSP, możesz dowolnie korzystać z przestrzeni nazw.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 pośrednikiem 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>
.
Zapisz plik i zamknij edytor.
Konfigurowanie kompilacji
Po zadeklarowaniu flagi skonfiguruj kompilację, aby mogła wygenerować kod biblioteki, który służy 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, znaki 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.
W tym samym pliku utwórz obiekt
cc_aconfig_library
podobny do tego:cc_aconfig_library { name: "aconfig_demo_flags_c_lib", aconfig_declarations: "aconfig_demo_flags", }
Gdzie:
name
zawiera nazwę biblioteki zawierającą tylko małe litery, znaki podkreślenia i cyfry.aconfig_declarations
zawiera te samename
co w deklaracji.
Docelowy typ kompilacji
cc_aconfig_library
wywołuje narzędzie Codegen dla języka C lub C++, które podczas kompilacji tworzy bibliotekę z wygenerowanym kodem.Biblioteka CC aconfig jest podobna do celu biblioteki CC, ale zawiera opcje takie jak
vendor_available
,product_available
,host_supported
ivndk
. Jeśli docelowy typ kompilacji zależny od tego parametrucc_aconfig_library
wymaga określonych typów wariantów, może być konieczne 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 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 uwzględnić w plikulibexample_cpp_lib
bibliotekę flag wygenerowaną 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 do 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 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:
package
w połączeniu z nazwą flagi tworzy klucz niepowtarzalny. W Javie ustawienie wartościpackage
nafoo.bar
powoduje wygenerowanie automatycznie 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ą też należeć flagi z wielu plików deklaracji.container
definiuje zbiór kodu, który jest kompilowany i wysyłany jako plik binarny. Dozwolone 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 dla wkładów. Aby określić swoją przestrzeń nazw, musisz skontaktować się z powierzonym recenzentem Google. Jeśli używasz flag uruchamiania funkcji, aby zachować stabilność własnego lustra AOSP, możesz dowolnie korzystać z przestrzeni nazw.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 pośrednikiem 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>
.
Zapisz plik i zamknij edytor.
Konfigurowanie kompilacji
Po zadeklarowaniu flagi skonfiguruj kompilację, aby mogła wygenerować kod biblioteki, który służy 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, znaki 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, znaki podkreślenia i cyfry.crate_name
zawiera tę samą nazwę pakietu, która została użyta w deklaracji.aconfig_declarations
zawiera te samename
co 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.