Puoi utilizzare i flag aconfig nel codice Java, C, C++ e Rust. Il sistema di compilazione AOSP avvia uno strumento chiamato aconfig utilizzato per generare una libreria di metodi specifica per il linguaggio da utilizzare per accedere al valore di ogni flag. Prima di poter generare la libreria, devi dichiarare i flag e aggiungerli alla build.
Dichiara un flag aconfig per Java
Per dichiarare un flag aconfig per Java:
In una directory in cui esiste il nuovo codice, crea un file con estensione
.aconfig
, ad esempiomy_new_aconfig_flag_declarations.aconfig
. Un file aconfig è un file di protocollo di testo che segue uno schema standard.Aggiungi una dichiarazione di flag simile alla seguente:
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>" }
Dove:
package
, se combinato con il nome del flag, fornisce una chiave univoca. In Java, se impostipackage
sufoo.bar
, verrà generata automaticamente una classe denominatafoo.bar.Flags
. In C++, i metodi della funzione di accesso ai flag verranno denominatifoo::bar::"flagname"
. Gli indicatori nello stesso file di dichiarazione appartengono allo stesso pacchetto, ma più file di dichiarazione possono contribuire con indicatori allo stesso pacchetto.container
definisce una raccolta di codice che viene compilata e inviata insieme come file binario. I contenitori validi sonosystem
,vendor
,system_ext
,product
,name.of.apex
ename.of.apk
.name
contiene il nome del flag contenente solo lettere minuscole, trattini bassi e numeri.namespace
contiene lo spazio dei nomi per i contributi. Devi collaborare con il revisore di Google assegnato per determinare il tuo spazio dei nomi. Se utilizzi i flag di lancio delle funzionalità per mantenere la stabilità del tuo mirror AOSP, puoi utilizzare lo spazio dei nomi come preferisci.description
contiene una breve descrizione della funzionalità o della modifica segnalata.bug
è il numero del bug associato al nuovo contributo di codice. Devi collaborare con il revisore di Google assegnato per determinare il tuobug
. Se utilizzi flag di lancio delle funzionalità per mantenere la stabilità del tuo mirror AOSP, puoi usare il numero di tracciamento dei bug o usare<none>
.
Salva il file ed esci dall'editor.
Configura la build
Dopo aver dichiarato il flag, configura la build in modo che possa generare il codice di libreria utilizzato per accedere al valore del flag.
Nel file di build
Android.bp
, aggiungi una sezioneaconfig_declarations
simile alla seguente:aconfig_declarations { name: "aconfig_demo_flags", package: "com.example.android.aconfig.demo.flags", srcs: [ "my_new_aconfig_flag_declarations.aconfig" ], }
Dove:
name
contiene il nome della dichiarazione contenente solo lettere minuscole, trattini bassi e numeri.package
contiene lo stesso nome di pacchetto utilizzato nella dichiarazione.srcs
contiene il nome del file.aconfig
in cui è dichiarato il flag.
Salva il file ed esci dall'editor.
Dichiara un flag aconfig per C e C++
Per dichiarare un flag aconfig per C e C++:
In una directory in cui esiste il nuovo codice, crea un file con estensione
.aconfig
, ad esempiomy_new_aconfig_flag_declarations.aconfig
. Un file aconfig è un file di protocollo di testo che segue uno schema standard.Aggiungi una dichiarazione di flag simile alla seguente:
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>" }
Dove:
package
, se combinato con il nome del flag, fornisce una chiave univoca. In Java, se impostipackage
sufoo.bar
, verrà generata automaticamente una classe denominatafoo.bar.Flags
. In C++, i metodi della funzione di accesso ai flag verranno denominatifoo::bar::"flagname"
. Gli indicatori nello stesso file di dichiarazione appartengono allo stesso pacchetto, ma più file di dichiarazione possono contribuire con indicatori allo stesso pacchetto.container
definisce una raccolta di codice che viene compilata e inviata insieme come file binario. I contenitori validi sonosystem
,vendor
,system_ext
,product
,name.of.apex
ename.of.apk
.name
contiene il nome del flag contenente solo lettere minuscole, trattini bassi e numeri.namespace
contiene lo spazio dei nomi per i contributi. Devi collaborare con il revisore di Google assegnato per determinare il tuo spazio dei nomi. Se utilizzi i flag di lancio delle funzionalità per mantenere la stabilità del tuo mirror AOSP, puoi utilizzare lo spazio dei nomi come preferisci.description
contiene una breve descrizione della funzionalità o della modifica segnalata.bug
è il numero del bug associato al nuovo contributo di codice. Devi collaborare con il revisore di Google assegnato per determinare il tuobug
. Se utilizzi flag di lancio delle funzionalità per mantenere la stabilità del tuo mirror AOSP, puoi usare il numero di tracciamento dei bug o usare<none>
.
Salva il file ed esci dall'editor.
Configura la build
Dopo aver dichiarato il flag, configura la compilazione in modo che possa generare il codice della libreria utilizzato per accedere al valore del flag.
Nel file di build
Android.bp
, aggiungi una sezioneaconfig_declarations
simile alla seguente:aconfig_declarations { name: "aconfig_demo_flags", package: "com.example.android.aconfig.demo.flags", srcs: [ "my_new_aconfig_flag_declarations.aconfig" ], }
Dove:
name
contiene il nome della dichiarazione contenente solo lettere minuscole, trattini bassi e numeri.package
contiene lo stesso nome di pacchetto utilizzato nella dichiarazione.srcs
contiene il nome del file aconfig in cui è dichiarato il flag.
Nello stesso file, crea un target
cc_aconfig_library
simile al seguente:cc_aconfig_library { name: "aconfig_demo_flags_c_lib", aconfig_declarations: "aconfig_demo_flags", }
Dove:
name
contiene il nome della libreria che contiene solo lettere minuscole, trattini bassi e numeri.aconfig_declarations
contiene lo stessoname
utilizzato nella dichiarazione.
La destinazione di build
cc_aconfig_library
richiama il codegen C o C++, che crea una libreria con il codice generato al momento della build.La libreria aconfig in Cc è simile al target di una libreria CC, ma offre opzioni come
vendor_available
,product_available
,host_supported
evndk
. Se il target di build che dipende da questocc_aconfig_library
richiede un determinato tipo di varianti, potresti anche dover aggiungere l'impostazione corrispondente nel target della libreria aconfig in Cc. Ad esempio, se il target di compilazione principale ha impostatovendor_available
sutrue
, ti consigliamo di impostarevendor_available
sutrue
anche in questo targetcc_aconfig_library
.Dopo aver aggiunto il target di build, il codice può accedere a questa libreria. Puoi includere questa libreria utilizzando la sintassi
static_lib
oshared_lib
. Tieni presente che se vuoi aggiungere questa libreria comestatic_lib
, aggiungi una dipendenzashared_lib
suserver_configurable_flags
. Il Passaggio 3 mostra come includere la libreria di flag generati dal codice inlibexample_cpp_lib
.Crea un target che utilizzi i flag aconfig, come nell'esempio seguente
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"], }
Dove:
shared_libs
include dipendenze aggiuntive necessarie per i flag aconfig.static_libs
è il nome della libreria creata dalla compilazione in base al campocc_aconfig_library
name
nel passaggio 2. Creando una vocecc_library
con il nome della libreria statica, ora puoi utilizzare i flag aconfig nel codice.
Dichiara un flag aconfig per Rust
Per dichiarare un flag aconfig per Rust:
In una directory in cui esiste il nuovo codice, crea un file con l'estensione
.aconfig
, ad esempiomy_new_aconfig_flag_declarations.aconfig
. Un file aconfig è un file di protocollo di testo che segue uno schema standard.Aggiungi una dichiarazione di flag simile alla seguente:
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>" }
Dove:
package
, se combinato con il nome del flag, fornisce una chiave univoca. In Java, se impostipackage
sufoo.bar
, verrà generata automaticamente una classe denominatafoo.bar.Flags
. In C++, i metodi della funzione di accesso ai flag verranno denominatifoo::bar::"flagname"
. Gli indicatori nello stesso file di dichiarazione appartengono allo stesso pacchetto, ma più file di dichiarazione possono contribuire con indicatori allo stesso pacchetto.container
definisce una raccolta di codice che viene compilata e inviata insieme come file binario. I contenitori validi sonosystem
,vendor
,system_ext
,product
,name.of.apex
ename.of.apk
.name
contiene il nome del flag contenente solo lettere minuscole, trattini bassi e numeri.namespace
contiene lo spazio dei nomi per i contributi. Devi collaborare con il revisore di Google assegnato per determinare il tuo spazio dei nomi. Se utilizzi i flag di lancio delle funzionalità per mantenere la stabilità del tuo mirror AOSP, puoi utilizzare lo spazio dei nomi come preferisci.description
contiene una breve descrizione della funzionalità o della modifica segnalata.bug
è il numero del bug associato al nuovo contributo di codice. Devi collaborare con il revisore di Google assegnato per determinare il tuobug
. Se utilizzi flag di lancio delle funzionalità per mantenere la stabilità del tuo mirror AOSP, puoi usare il numero di tracciamento dei bug o usare<none>
.
Salva il file ed esci dall'editor.
Configura la build
Dopo aver dichiarato il flag, configura la compilazione in modo che possa generare il codice della libreria utilizzato per accedere al valore del flag.
Nel file di build
Android.bp
, aggiungi una sezioneaconfig_declarations
simile alla seguente:aconfig_declarations { name: "aconfig_demo_flags", package: "com.example.android.aconfig.demo.flags", srcs: [ "my_new_aconfig_flag_declarations.aconfig" ], }
Dove:
name
contiene il nome della dichiarazione contenente solo lettere minuscole, trattini bassi e numeri.package
contiene lo stesso nome di pacchetto utilizzato nella dichiarazione.srcs
contiene il nome del file aconfig in cui viene dichiarato il flag.
Crea un target
rust_aconfig_library
simile all'esempio successivo. Questo target invoca Rust Codegen e crea una libreria Rust con il codice generato durante la compilazione.rust_aconfig_library { name: "libaconfig_demo_flags_rust", crate_name: "aconfig_demo_flags_rust", aconfig_declarations: "aconfig_demo_flags", }
Dove:
name
contiene il nome della dichiarazione contenente solo lettere minuscole, trattini bassi e numeri.crate_name
contiene lo stesso nome del pacchetto utilizzato nella dichiarazione.aconfig_declarations
contiene lo stessoname
utilizzato nella dichiarazione.
Con questa modifica, il codice può dipendere da questa libreria Rust.
Nello stesso file, crea una voce
rust_library
simile alla seguente:rust_library { name: "libexample_lib", rustlibs: [ "libaconfig_demo_flags_rust", ] }
Questo esempio consente ai target della build del codice sorgente
libexample_demo_flags_rust
di includere la libreria di flag generati dal codice.Salva il file ed esci dall'editor.