Flag „aconfig“ deklarieren

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 jeder Flag 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:

  1. 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 .proto-Textdatei, die einem Standardschema folgt.

  2. 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 von package auf foo.bar zu einer automatisch generierten Klasse namens foo.bar.Flags. In C++ würden Methoden zum Lesen von Flags foo::bar::"flagname" heißen. Flags in derselben Deklarationsdatei gehören zum selben Paket, aber mehrere Deklarationsdateien können Flags zum selben Paket beitragen.
    • container definiert eine Codesammlung, die zusammen als Binärprogramm erstellt und versendet wird. Gültige Container sind system, vendor, system_ext, product, name.of.apex und name.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 Nummer des Programmfehlers, der mit dem neuen Codebeitrag verknüpft ist. Du musst mit dem zugewiesenen Google-Prüfer zusammenarbeiten, um deine bug 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 Ihre Bug-Tracking-Nummer oder <none> verwenden.

  3. 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.

  1. Fügen Sie in Ihrer Android.bp-Builddatei einen Abschnitt aconfig_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.
  2. Speichern Sie die Datei und beenden Sie den Editor.

Deklarieren Sie das Flag „aconfig“ für C und C++

So deklarieren Sie ein aconfig-Flag für C und C++:

  1. Erstellen Sie in einem Verzeichnis, in dem der neue Code vorhanden ist, 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.

  2. 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 von package auf foo.bar zu einer automatisch generierten Klasse namens foo.bar.Flags. In C++ würden Methoden zum Lesen von Flags foo::bar::"flagname" heißen. Flags in derselben Deklarationsdatei gehören zum selben Paket, aber mehrere Deklarationsdateien können Flags zum selben Paket beitragen.
    • container definiert eine Codesammlung, die zusammen als Binärprogramm erstellt und versendet wird. Gültige Container sind system, vendor, system_ext, product, name.of.apex und name.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 Nummer des Programmfehlers, der mit dem neuen Codebeitrag verknüpft ist. Du musst mit dem zugewiesenen Google-Prüfer zusammenarbeiten, um deine bug 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 Ihre Bug-Tracking-Nummer oder <none> verwenden.

  3. Speichern Sie die Datei und beenden Sie den Editor.

Build einrichten

Nachdem Sie das Flag deklariert haben, müssen Sie den Build so einrichten, dass der Bibliothekscode generiert werden kann, mit dem auf den Wert des Flags zugegriffen wird.

  1. Fügen Sie in der Build-Datei Android.bp einen Abschnitt aconfig_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.
  2. Erstellen Sie in derselben Datei ein cc_aconfig_library-Ziel ähnlich dem folgenden:

    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 dasselbe name, das in der Deklaration verwendet wird.

    Das Build-Ziel cc_aconfig_library ruft C oder C++ Codegen auf, wodurch eine Bibliothek mit dem generierten Code zum Zeitpunkt der Build-Erstellung erstellt wird.

    Die CC-Aconfig-Bibliothek ähnelt einem CC-Bibliotheksziel, hat aber Optionen wie vendor_available, product_available, host_supported und vndk. Wenn für das von diesem cc_aconfig_library abhängige Build-Ziel bestimmte Varianten erforderlich sind, müssen Sie möglicherweise auch die entsprechende Einstellung in das CC-Ziel der aconfig-Bibliothek einfügen. Wenn beispielsweise für das übergeordnete Build-Ziel vendor_available auf true festgelegt ist, sollten Sie vendor_available auch in diesem cc_aconfig_library-Ziel auf true festlegen.

    Nachdem Sie dieses Build-Ziel hinzugefügt haben, kann Ihr Code auf diese Bibliothek zugreifen. Sie können diese Bibliothek mit der Syntax static_lib oder shared_lib einbinden. Wenn Sie diese Bibliothek als static_lib hinzufügen möchten, fügen Sie eine shared_lib-Abhängigkeit für server_configurable_flags hinzu. In Schritt 3 wird gezeigt, wie die mit dem Code generierte Flaggenbibliothek in libexample_cpp_lib eingebunden wird.

  3. Erstellen Sie ein Ziel, das die aconfig-Flags verwendet, wie im folgenden 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 Feld cc_aconfig_library name in Schritt 2 erstellt wird. Wenn Sie einen cc_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:

  1. Erstellen Sie in einem Verzeichnis, in dem der neue Code vorhanden ist, eine Datei mit der Erweiterung .aconfig, z. B. my_new_aconfig_flag_declarations.aconfig. Eine aconfig-Datei ist eine .proto-Textdatei, die einem Standardschema folgt.

  2. 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 von package auf foo.bar zu einer automatisch generierten Klasse namens foo.bar.Flags. In C++ würden Methoden zum Lesen von Flags foo::bar::"flagname" heißen. Flags in derselben Deklarationsdatei gehören zum selben Paket, aber mehrere Deklarationsdateien können Flags zum selben Paket beitragen.
    • container definiert eine Codesammlung, die zusammen als Binärprogramm erstellt und versendet wird. Gültige Container sind system, vendor, system_ext, product, name.of.apex und name.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 Nummer des Programmfehlers, der mit dem neuen Codebeitrag verknüpft ist. Du musst mit dem zugewiesenen Google-Prüfer zusammenarbeiten, um deine bug 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 Ihre Bug-Tracking-Nummer oder <none> verwenden.

  3. 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.

  1. Fügen Sie in die Build-Datei Android.bp einen Abschnitt aconfig_declarations ein, 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.
  2. Erstellen Sie ein rust_aconfig_library-Ziel ähnlich wie im nächsten Beispiel. Dieses Ziel ruft Rust Codegen auf und erstellt während der Build-Zeit 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 dasselbe name, das in der Deklaration verwendet wird.

    Durch diese Änderung kann Ihr Code von dieser Rust-Bibliothek abhängen.

  3. Erstellen Sie in derselben Datei einen rust_library-Eintrag ähnlich dem folgenden:

    rust_library {
      name: "libexample_lib",
      rustlibs: [
          "libaconfig_demo_flags_rust",
      ]
    }
    

    In diesem Beispiel können Ihre Quellcode-Build-Ziele libexample_demo_flags_rust die vom Code generierte Flag-Bibliothek enthalten.

  4. Speichern Sie die Datei und beenden Sie den Editor.