Flagi aconfig możesz stosować w kodzie w językach Java, C, C++ i Rust. System kompilacji AOSP uruchamia narzędzie o nazwie aconfig, które służy do generowania biblioteki metod w określonym języku. Możesz jej używać do uzyskiwania dostępu do wartości każdego z tych sygnałów. Zanim wygenerujesz bibliotekę, musisz zadeklarować flagi i dodać je do kompilacji.
Deklarowanie flagi aconfig w Javie
Aby zadeklarować flagę aconfig w przypadku Javy:
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 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:
packagew połączeniu z nazwą flagi tworzy unikalny klucz. W Javie ustawieniepackagenafoo.barpowoduje automatyczne wygenerowanie klasy o nazwiefoo.bar.Flags. W C++ metody dostępu do flagi miałyby nazwęfoo::bar::"flagname". Flagi w tym samym pliku deklaracji należą do tego samego pakietu, ale wiele plików deklaracji może zawierać flagi tego samego pakietu.containerokreśla zbiór kodu, który jest kompilowany i dostarczany razem jako plik binarny. Prawidłowe kontenery tosystem,vendor,system_ext,product,name.of.apexiname.of.apk.namezawiera nazwę flagi, która składa się tylko z małych liter, podkreśleń i cyfr.namespacezawiera przestrzeń nazw dla wpłat. Aby określić przestrzeń nazw, musisz współpracować z przypisanym recenzentem Google. Jeśli używasz flag uruchamiania funkcji, aby zachować stabilność własnego klona AOSP, możesz używać przestrzeni nazw w dowolny sposób.descriptionzawiera krótki opis funkcji lub zmiany, która jest oznaczona.bugto numer błędu powiązany z nowym kodem. Musisz współpracować z przydzielonym recenzentem z Google, aby określićbug. Jeśli używasz flag uruchamiania funkcji, aby zachować stabilność własnej kopii AOSP, możesz użyć numeru śledzenia błędów lub symbolu<none>.
Zapisz plik i zamknij edytor.
Konfigurowanie kompilacji
Po zadeklarowaniu flagi skonfiguruj kompilację tak, aby mogła generować kod biblioteki używany do uzyskiwania dostępu do wartości flagi.
W pliku kompilacji
Android.bpdodaj sekcjęaconfig_declarationspodobną do tej:aconfig_declarations { name: "aconfig_demo_flags", package: "com.example.android.aconfig.demo.flags", srcs: [ "my_new_aconfig_flag_declarations.aconfig" ], }Gdzie:
namezawiera nazwę deklaracji, która składa się tylko z małych liter, podkreśleń i cyfr.packagezawiera tę samą nazwę pakietu, która została użyta w deklaracji.srcszawiera nazwę pliku.aconfig, w którym zadeklarowano flagę.
Zapisz plik i zamknij edytor.
Deklarowanie flagi aconfig dla języków C i C++
Aby zadeklarować flagę aconfig w przypadku 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 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:
packagew połączeniu z nazwą flagi tworzy unikalny klucz. W Javie ustawieniepackagenafoo.barpowoduje automatyczne wygenerowanie klasy o nazwiefoo.bar.Flags. W C++ metody dostępu do flagi miałyby nazwęfoo::bar::"flagname". Flagi w tym samym pliku deklaracji należą do tego samego pakietu, ale wiele plików deklaracji może zawierać flagi tego samego pakietu.containerokreśla zbiór kodu, który jest kompilowany i dostarczany razem jako plik binarny. Prawidłowe kontenery tosystem,vendor,system_ext,product,name.of.apexiname.of.apk.namezawiera nazwę flagi, która składa się tylko z małych liter, podkreśleń i cyfr.namespacezawiera przestrzeń nazw dla wpłat. Aby określić przestrzeń nazw, musisz współpracować z przypisanym recenzentem Google. Jeśli używasz flag uruchamiania funkcji, aby zachować stabilność własnego klona AOSP, możesz używać przestrzeni nazw w dowolny sposób.descriptionzawiera krótki opis funkcji lub zmiany, która jest oznaczona.bugto numer błędu powiązany z nowym kodem. Musisz współpracować z przydzielonym recenzentem z Google, aby określićbug. Jeśli używasz flag uruchamiania funkcji, aby zachować stabilność własnej kopii AOSP, możesz użyć numeru śledzenia błędów lub symbolu<none>.
Zapisz plik i zamknij edytor.
Konfigurowanie kompilacji
Po zadeklarowaniu flagi skonfiguruj kompilację tak, aby mogła generować kod biblioteki używany do uzyskiwania dostępu do wartości flagi.
W pliku kompilacji
Android.bpdodaj sekcjęaconfig_declarationspodobną do tej:aconfig_declarations { name: "aconfig_demo_flags", package: "com.example.android.aconfig.demo.flags", srcs: [ "my_new_aconfig_flag_declarations.aconfig" ], }Gdzie:
namezawiera nazwę deklaracji, która składa się tylko z małych liter, podkreśleń i cyfr.packagezawiera tę samą nazwę pakietu, która została użyta w deklaracji.srcszawiera nazwę pliku aconfig, w którym zadeklarowano flagę.
W tym samym pliku utwórz element
cc_aconfig_librarypodobny do tego:cc_aconfig_library { name: "aconfig_demo_flags_c_lib", aconfig_declarations: "aconfig_demo_flags", }Gdzie:
namezawiera nazwę biblioteki, która składa się tylko z małych liter, podkreśleń i cyfr.aconfig_declarationszawiera ten samname, który został użyty w deklaracji.
cc_aconfig_libraryCel kompilacji wywołuje generowanie kodu w C lub C++, które tworzy bibliotekę z wygenerowanym kodem w czasie kompilacji.Biblioteka CC aconfig jest podobna do biblioteki CC, ale ma opcje takie jak
vendor_available,product_available,host_supportedivndk. Jeśli cel kompilacji zależny od tegocc_aconfig_librarywymaga określonego typu wariantów, może być też konieczne dodanie odpowiedniego ustawienia w celu biblioteki CC aconfig. Jeśli na przykład w przypadku nadrzędnego celu kompilacji parametrvendor_availablema wartośćtrue, w tym celucc_aconfig_librarymożesz też ustawić parametrvendor_availablena wartośćtrue.Po dodaniu tego celu kompilacji Twój kod będzie miał dostęp do tej biblioteki. Możesz dołączyć tę bibliotekę za pomocą składni
static_liblubshared_lib. Jeśli chcesz dodać tę bibliotekę jakostatic_lib, dodaj zależnośćshared_libodserver_configurable_flags. Krok 3 pokazuje, jak włączyć bibliotekę flag wygenerowanego kodu dolibexample_cpp_lib.Utwórz środowisko docelowe, które korzysta z flag aconfig, np. tak jak w tym przykładzie:
cc_librarycc_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_libszawiera dodatkowe zależności wymagane w przypadku flag aconfig.static_libsto nazwa biblioteki utworzonej przez kompilację zgodnie z polemcc_aconfig_librarynamew kroku 2. Tworząc wpiscc_libraryz nazwą biblioteki statycznej, możesz teraz używać w kodzie flag aconfig.
Deklarowanie flagi aconfig w Rust
Aby zadeklarować flagę aconfig dla języka Rust:
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 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:
packagew połączeniu z nazwą flagi tworzy unikalny klucz. W Javie ustawieniepackagenafoo.barpowoduje automatyczne wygenerowanie klasy o nazwiefoo.bar.Flags. W C++ metody dostępu do flagi miałyby nazwęfoo::bar::"flagname". Flagi w tym samym pliku deklaracji należą do tego samego pakietu, ale wiele plików deklaracji może zawierać flagi tego samego pakietu.containerokreśla zbiór kodu, który jest kompilowany i dostarczany razem jako plik binarny. Prawidłowe kontenery tosystem,vendor,system_ext,product,name.of.apexiname.of.apk.namezawiera nazwę flagi, która składa się tylko z małych liter, podkreśleń i cyfr.namespacezawiera przestrzeń nazw dla wpłat. Aby określić przestrzeń nazw, musisz współpracować z przypisanym recenzentem Google. Jeśli używasz flag uruchamiania funkcji, aby zachować stabilność własnego klona AOSP, możesz używać przestrzeni nazw w dowolny sposób.descriptionzawiera krótki opis funkcji lub zmiany, która jest oznaczona.bugto numer błędu powiązany z nowym kodem. Musisz współpracować z przydzielonym recenzentem z Google, aby określićbug. Jeśli używasz flag uruchamiania funkcji, aby zachować stabilność własnej kopii AOSP, możesz użyć numeru śledzenia błędów lub symbolu<none>.
Zapisz plik i zamknij edytor.
Konfigurowanie kompilacji
Po zadeklarowaniu flagi skonfiguruj kompilację tak, aby mogła generować kod biblioteki używany do uzyskiwania dostępu do wartości flagi.
W pliku kompilacji
Android.bpdodaj sekcjęaconfig_declarationspodobną do tej:aconfig_declarations { name: "aconfig_demo_flags", package: "com.example.android.aconfig.demo.flags", srcs: [ "my_new_aconfig_flag_declarations.aconfig" ], }Gdzie:
namezawiera nazwę deklaracji, która składa się tylko z małych liter, podkreśleń i cyfr.packagezawiera tę samą nazwę pakietu, która została użyta w deklaracji.srcszawiera nazwę pliku aconfig, w którym zadeklarowano flagę.
Utwórz
rust_aconfig_librarypodobne do tego w przykładzie poniżej. 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:
namezawiera nazwę deklaracji, która składa się tylko z małych liter, podkreśleń i cyfr.crate_namezawiera tę samą nazwę pakietu, która została użyta w deklaracji.aconfig_declarationszawiera ten samname, który został użyty w deklaracji.
Dzięki tej zmianie Twój kod może zależeć od tej biblioteki Rusta.
W tym samym pliku utwórz wpis
rust_librarypodobny do tego:rust_library { name: "libexample_lib", rustlibs: [ "libaconfig_demo_flags_rust", ] }Ten przykład umożliwia uwzględnienie w docelowych kompilacjach kodu źródłowego
libexample_demo_flags_rustbiblioteki flag wygenerowanego kodu.Zapisz plik i zamknij edytor.