Sie können aconfig-Flags in Java-, C-, C++- und Rust-Code verwenden. Das AOSP-Buildsystem startet ein Tool namens aconfig, mit dem eine sprachspezifische Bibliothek mit Methoden generiert wird, mit denen Sie auf den Wert der einzelnen Flags zugreifen können. Bevor Sie die Bibliothek generieren können, müssen Sie Flags deklarieren und dem Build hinzufügen.
Aconfig-Flag für Java deklarieren
So deklarieren Sie ein aconfig-Flag für Java:
Erstellen Sie in einem Verzeichnis, in dem sich der neue Code befindet, eine Datei mit der Erweiterung
.aconfig
, z. B.my_new_aconfig_flag_declarations.aconfig
. Eine Aconfig-Datei ist eine Text-Proto-Datei, die einem Standardschema folgt.Fügen Sie eine Flag-Deklaration wie die folgende hinzu:
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>" }
Dabei gilt:
package
in Kombination mit dem Flag-Namen ergibt einen eindeutigen Schlüssel. In Java führt das Festlegen vonpackage
auffoo.bar
zu einer automatisch generierten Klasse namensfoo.bar.Flags
. In C++ würden Methoden zum Lesen von Flagsfoo::bar::"flagname"
heißen. Flags in derselben Deklarationsdatei gehören zum selben Paket. Mehrere Deklarationsdateien können jedoch Flags zum selben Paket beitragen.container
definiert eine Codesammlung, die zusammen als Binärdatei erstellt und bereitgestellt wird. Gültige Container sindsystem
,vendor
,system_ext
,product
,name.of.apex
undname.of.apk
.name
enthält den Namen der Flagge, der nur Kleinbuchstaben, Unterstriche und Zahlen enthalten darf.namespace
enthält den Namespace für Beiträge. Sie müssen mit dem zugewiesenen Google-Rezensenten zusammenarbeiten, um Ihren Namespace zu bestimmen. Wenn Sie Flags für die Einführung von Funktionen verwenden, um die Stabilität Ihres eigenen AOSP-Mirrors aufrechtzuerhalten, können Sie den Namespace beliebig verwenden.description
enthält eine kurze Beschreibung der gemeldeten Funktion oder Änderung.bug
ist die Fehlernummer, die mit dem neuen Codebeitrag verknüpft ist. Sie müssen mit dem zugewiesenen Google-Prüfer zusammenarbeiten, um Ihrenbug
zu ermitteln. Wenn Sie Flags für die Einführung von Funktionen verwenden, um die Stabilität Ihres eigenen AOSP-Mirrors aufrechtzuerhalten, können Sie Ihre Bug-Tracking-Nummer oder<none>
verwenden.
Speichern Sie die Datei und beenden Sie den Editor.
Build einrichten
Nachdem Sie das Flag deklariert haben, richten Sie den Build so ein, dass der Bibliothekskode generiert werden kann, der zum Zugriff auf den Wert des Flags verwendet wird.
Fügen Sie in Ihrer
Android.bp
-Builddatei einen Abschnittaconfig_declarations
hinzu, der in etwa so aussieht:aconfig_declarations { name: "aconfig_demo_flags", package: "com.example.android.aconfig.demo.flags", srcs: [ "my_new_aconfig_flag_declarations.aconfig" ], }
Dabei gilt:
name
enthält den Namen der Erklärung, der nur Kleinbuchstaben, Unterstriche und Zahlen enthalten darf.package
enthält denselben Paketnamen wie in der Deklaration.srcs
enthält den Namen der.aconfig
-Datei, in der das Flag deklariert ist.
Speichern Sie die Datei und beenden Sie den Editor.
aconfig-Flag für C und C++ deklarieren
So deklarieren Sie ein aconfig-Flag für C und C++:
Erstellen Sie in einem Verzeichnis, in dem sich der neue Code befindet, eine Datei mit der Erweiterung
.aconfig
, z. B.my_new_aconfig_flag_declarations.aconfig
. Eine Aconfig-Datei ist eine Text-Proto-Datei, die einem Standardschema folgt.Fügen Sie eine Flag-Deklaration wie die folgende hinzu:
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>" }
Dabei gilt:
package
in Kombination mit dem Flag-Namen ergibt einen eindeutigen Schlüssel. In Java führt das Festlegen vonpackage
auffoo.bar
zu einer automatisch generierten Klasse namensfoo.bar.Flags
. In C++ würden Methoden zum Lesen von Flagsfoo::bar::"flagname"
heißen. Flags in derselben Deklarationsdatei gehören zum selben Paket. Mehrere Deklarationsdateien können jedoch Flags zum selben Paket beitragen.container
definiert eine Codesammlung, die zusammen als Binärdatei erstellt und bereitgestellt wird. Gültige Container sindsystem
,vendor
,system_ext
,product
,name.of.apex
undname.of.apk
.name
enthält den Namen der Flagge, der nur Kleinbuchstaben, Unterstriche und Zahlen enthalten darf.namespace
enthält den Namespace für Beiträge. Sie müssen mit dem zugewiesenen Google-Rezensenten zusammenarbeiten, um Ihren Namespace zu bestimmen. Wenn Sie Flags für die Einführung von Funktionen verwenden, um die Stabilität Ihres eigenen AOSP-Mirrors aufrechtzuerhalten, können Sie den Namespace beliebig verwenden.description
enthält eine kurze Beschreibung der gemeldeten Funktion oder Änderung.bug
ist die Fehlernummer, die mit dem neuen Codebeitrag verknüpft ist. Sie müssen mit dem zugewiesenen Google-Prüfer zusammenarbeiten, um Ihrenbug
zu ermitteln. Wenn Sie Flags für die Einführung von Funktionen verwenden, um die Stabilität Ihres eigenen AOSP-Mirrors aufrechtzuerhalten, können Sie Ihre Bug-Tracking-Nummer oder<none>
verwenden.
Speichern Sie die Datei und beenden Sie den Editor.
Build einrichten
Nachdem Sie das Flag deklariert haben, richten Sie den Build so ein, dass der Bibliothekskode generiert werden kann, der zum Zugriff auf den Wert des Flags verwendet wird.
Fügen Sie in Ihrer
Android.bp
-Builddatei einen Abschnittaconfig_declarations
hinzu, der in etwa so aussieht:aconfig_declarations { name: "aconfig_demo_flags", package: "com.example.android.aconfig.demo.flags", srcs: [ "my_new_aconfig_flag_declarations.aconfig" ], }
Dabei gilt:
name
enthält den Namen der Erklärung, der nur Kleinbuchstaben, Unterstriche und Zahlen enthalten darf.package
enthält denselben Paketnamen wie in der Deklaration.srcs
enthält den Namen der aconfig-Datei, in der das Flag deklariert ist.
Erstellen Sie in derselben Datei ein
cc_aconfig_library
-Ziel, das in etwa so aussieht:cc_aconfig_library { name: "aconfig_demo_flags_c_lib", aconfig_declarations: "aconfig_demo_flags", }
Dabei gilt:
name
enthält den Namen der Bibliothek, der nur Kleinbuchstaben, Unterstriche und Zahlen enthalten darf.aconfig_declarations
enthält denselbenname
wie in der Erklärung.
Das Build-Ziel
cc_aconfig_library
ruft C- oder C++-Codegen auf, wodurch eine Bibliothek mit dem generierten Code zur Buildzeit erstellt wird.Die CC-Aconfig-Bibliothek ähnelt einem CC-Bibliotheksziel, hat aber Optionen wie
vendor_available
,product_available
,host_supported
undvndk
. Wenn für das Buildziel, das von diesercc_aconfig_library
abhängt, bestimmte Arten von Varianten erforderlich sind, müssen Sie möglicherweise auch die entsprechende Einstellung im CC-Aconfig-Bibliothekziel hinzufügen. Wenn beispielsweise für das übergeordnete Build-Zielvendor_available
auftrue
festgelegt ist, sollten Sievendor_available
auch in diesemcc_aconfig_library
-Ziel auftrue
festlegen.Nachdem Sie dieses Build-Ziel hinzugefügt haben, kann Ihr Code auf diese Bibliothek zugreifen. Sie können diese Bibliothek mit der Syntax von
static_lib
odershared_lib
einbinden. Wenn Sie diese Bibliothek alsstatic_lib
hinzufügen möchten, fügen Sie eineshared_lib
-Abhängigkeit vonserver_configurable_flags
hinzu. In Schritt 3 wird gezeigt, wie die mit dem Code generierte Flaggenbibliothek inlibexample_cpp_lib
eingefügt wird.Erstellen Sie ein Ziel, das die aconfig-Flags verwendet, z. B. das folgende Beispiel:
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"], }
Dabei gilt:
shared_libs
enthält zusätzliche Abhängigkeiten, die für aconfig-Flags erforderlich sind.static_libs
ist der Name der Bibliothek, die vom Build gemäß dem Feldcc_aconfig_library
name
in Schritt 2 erstellt wird. Wenn Sie einencc_library
-Eintrag mit dem Namen der statischen Bibliothek erstellen, können Sie die aconfig-Flags jetzt in Ihrem Code verwenden.
aconfig-Flag für Rust deklarieren
So deklarieren Sie ein aconfig-Flag für Rust:
Erstellen Sie in einem Verzeichnis, in dem sich der neue Code befindet, eine Datei mit der Erweiterung
.aconfig
, z. B.my_new_aconfig_flag_declarations.aconfig
. Eine Aconfig-Datei ist eine Text-Proto-Datei, die einem Standardschema folgt.Fügen Sie eine Flag-Deklaration wie die folgende hinzu:
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>" }
Dabei gilt:
package
in Kombination mit dem Flag-Namen ergibt einen eindeutigen Schlüssel. In Java führt das Festlegen vonpackage
auffoo.bar
zu einer automatisch generierten Klasse namensfoo.bar.Flags
. In C++ würden Methoden zum Lesen von Flagsfoo::bar::"flagname"
heißen. Flags in derselben Deklarationsdatei gehören zum selben Paket. Mehrere Deklarationsdateien können jedoch Flags zum selben Paket beitragen.container
definiert eine Codesammlung, die zusammen als Binärdatei erstellt und bereitgestellt wird. Gültige Container sindsystem
,vendor
,system_ext
,product
,name.of.apex
undname.of.apk
.name
enthält den Namen der Flagge, der nur Kleinbuchstaben, Unterstriche und Zahlen enthalten darf.namespace
enthält den Namespace für Beiträge. Sie müssen mit dem zugewiesenen Google-Rezensenten zusammenarbeiten, um Ihren Namespace zu bestimmen. Wenn Sie Flags für die Einführung von Funktionen verwenden, um die Stabilität Ihres eigenen AOSP-Mirrors aufrechtzuerhalten, können Sie den Namespace beliebig verwenden.description
enthält eine kurze Beschreibung der gemeldeten Funktion oder Änderung.bug
ist die Fehlernummer, die mit dem neuen Codebeitrag verknüpft ist. Sie müssen mit dem zugewiesenen Google-Prüfer zusammenarbeiten, um Ihrenbug
zu ermitteln. Wenn Sie Flags für die Einführung von Funktionen verwenden, um die Stabilität Ihres eigenen AOSP-Mirrors aufrechtzuerhalten, können Sie Ihre Bug-Tracking-Nummer oder<none>
verwenden.
Speichern Sie die Datei und beenden Sie den Editor.
Build einrichten
Nachdem Sie das Flag deklariert haben, richten Sie den Build so ein, dass der Bibliothekskode generiert werden kann, der zum Zugriff auf den Wert des Flags verwendet wird.
Fügen Sie in Ihrer
Android.bp
-Builddatei einenaconfig_declarations
-Abschnitt hinzu, der in etwa so aussieht:aconfig_declarations { name: "aconfig_demo_flags", package: "com.example.android.aconfig.demo.flags", srcs: [ "my_new_aconfig_flag_declarations.aconfig" ], }
Dabei gilt:
name
enthält den Namen der Erklärung, der nur Kleinbuchstaben, Unterstriche und Zahlen enthalten darf.package
enthält denselben Paketnamen wie in der Deklaration.srcs
enthält den Namen der aconfig-Datei, in der das Flag deklariert ist.
Erstellen Sie ein
rust_aconfig_library
-Ziel ähnlich dem folgenden Beispiel. Dieses Ziel ruft Rust Codegen auf und erstellt während der Buildzeit eine Rust-Bibliothek mit dem generierten Code.rust_aconfig_library { name: "libaconfig_demo_flags_rust", crate_name: "aconfig_demo_flags_rust", aconfig_declarations: "aconfig_demo_flags", }
Dabei gilt:
name
enthält den Namen der Erklärung, der nur Kleinbuchstaben, Unterstriche und Zahlen enthalten darf.crate_name
enthält denselben Paketnamen wie in der Deklaration.aconfig_declarations
enthält denselbenname
wie in der Erklärung.
Durch diese Änderung kann Ihr Code von dieser Rust-Bibliothek abhängen.
Erstellen Sie in derselben Datei einen
rust_library
-Eintrag ähnlich dem folgenden:rust_library { name: "libexample_lib", rustlibs: [ "libaconfig_demo_flags_rust", ] }
Mit diesem Beispiel können Sie die vom Code generierte Flags-Bibliothek in Ihre Quellcode-Buildziele
libexample_demo_flags_rust
einbinden.Speichern Sie die Datei und beenden Sie den Editor.