aconfig フラグを宣言する

aconfig フラグは、Java、C、C++、Rust のコードで使用できます。AOSP ビルドシステムは、各フラグの値にアクセスするために使用できるメソッドの言語固有のライブラリを生成するための aconfig というツールを起動します。ライブラリを生成する前に、フラグを宣言してビルドに追加する必要があります。

Java の aconfig フラグを宣言する

Java の aconfig フラグを宣言するには:

  1. 新しいコードが存在するディレクトリに、拡張子が .aconfig のファイルを作成します(例: my_new_aconfig_flag_declarations.aconfig)。aconfig ファイルは、標準スキーマに沿ったテキスト proto ファイルです。

  2. 次のようなフラグ宣言を追加します。

    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>"
    }
    

    ここで

    • package は、フラグ名と組み合わせると一意のキーになります。Java では、packagefoo.bar に設定すると、foo.bar.Flags という名前のクラスが自動生成されます。C++ では、フラグ アクセサ メソッドの名前は foo::bar::"flagname" になります。同じ宣言ファイル内のフラグは同じパッケージに属しますが、複数の宣言ファイルが同じパッケージにフラグを提供できます。
    • container は、バイナリとしてまとめてビルドおよびリリースされるコードのコレクションを定義します。有効なコンテナは、systemvendorsystem_extproductname.of.apexname.of.apk です。

    • name には、小文字、アンダースコア、数字のみを含むフラグの名前を指定します。

    • namespace にはコントリビューションの名前空間が含まれています。割り当てられた Google 審査担当者と協力して、名前空間を決定する必要があります。機能リリース フラグを使用して独自の AOSP ミラーの安定性を維持している場合は、任意の名前空間を使用できます。

    • description には、フラグが立てられた機能または変更の簡単な説明が含まれています。

    • bug は、新しいコード コントリビューションに関連付けられたバグ番号です。bug を決定するには、割り当てられた Google 審査担当者と連携する必要があります。独自の AOSP ミラーの安定性を維持するために機能リリースフラグを使用している場合は、バグ トラッキング番号または <none> を使用できます。

  3. ファイルを保存して、エディタを終了します。

ビルドを設定する

フラグを宣言したら、フラグの値にアクセスするために使用するライブラリ コードを生成できるようにビルドを設定します。

  1. Android.bp ビルドファイルに、次のような aconfig_declarations セクションを追加します。

    aconfig_declarations {
      name: "aconfig_demo_flags",
      package: "com.example.android.aconfig.demo.flags",
      srcs: [
        "my_new_aconfig_flag_declarations.aconfig"
      ],
    }
    

    ここで

    • name には、小文字、アンダースコア、数字のみを含む宣言の名前が含まれます。
    • package には、宣言で使用されたものと同じパッケージ名が含まれます。
    • srcs には、フラグが宣言されている .aconfig ファイルの名前が含まれています。
  2. ファイルを保存して、エディタを終了します。

C と C++ の aconfig フラグを宣言する

C と C++ で aconfig フラグを宣言するには:

  1. 新しいコードが存在するディレクトリに、拡張子が .aconfig のファイルを作成します(例: my_new_aconfig_flag_declarations.aconfig)。aconfig ファイルは、標準スキーマに沿ったテキスト proto ファイルです。

  2. 次のようなフラグ宣言を追加します。

    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>"
    }
    

    ここで

    • package は、フラグ名と組み合わせると一意のキーになります。Java では、packagefoo.bar に設定すると、foo.bar.Flags という名前のクラスが自動生成されます。C++ では、フラグ アクセサ メソッドの名前は foo::bar::"flagname" になります。同じ宣言ファイル内のフラグは同じパッケージに属しますが、複数の宣言ファイルが同じパッケージにフラグを提供できます。
    • container は、バイナリとしてまとめてビルドおよびリリースされるコードのコレクションを定義します。有効なコンテナは、systemvendorsystem_extproductname.of.apexname.of.apk です。

    • name には、小文字、アンダースコア、数字のみを含むフラグの名前を指定します。

    • namespace にはコントリビューションの名前空間が含まれています。割り当てられた Google 審査担当者と協力して、名前空間を決定する必要があります。機能リリース フラグを使用して独自の AOSP ミラーの安定性を維持している場合は、任意の名前空間を使用できます。

    • description には、フラグが立てられた機能または変更の簡単な説明が含まれています。

    • bug は、新しいコード コントリビューションに関連付けられたバグ番号です。bug を決定するには、割り当てられた Google 審査担当者と連携する必要があります。独自の AOSP ミラーの安定性を維持するために機能リリースフラグを使用している場合は、バグ トラッキング番号または <none> を使用できます。

  3. ファイルを保存して、エディタを終了します。

ビルドを設定する

フラグを宣言したら、フラグの値にアクセスするために使用するライブラリ コードを生成できるようにビルドを設定します。

  1. Android.bp ビルドファイルに、次のような aconfig_declarations セクションを追加します。

    aconfig_declarations {
      name: "aconfig_demo_flags",
      package: "com.example.android.aconfig.demo.flags",
      srcs: [
        "my_new_aconfig_flag_declarations.aconfig"
      ],
    }
    

    ここで

    • name には、小文字、アンダースコア、数字のみを含む宣言の名前が含まれます。
    • package に、宣言で使用されているのと同じパッケージ名が含まれている。
    • srcs には、フラグが宣言されている aconfig ファイルの名前が含まれます。
  2. 同じファイルで、次のような cc_aconfig_library ターゲットを作成します。

    cc_aconfig_library {
        name: "aconfig_demo_flags_c_lib",
        aconfig_declarations: "aconfig_demo_flags",
    }
    

    ここで

    • name には、小文字、アンダースコア、数字のみを使用したライブラリ名が含まれます。
    • aconfig_declarations に、宣言で使用されているものと同じ name が含まれている。

    cc_aconfig_library ビルド ターゲットは C または C++ Codegen を呼び出し、ビルド時に生成されたコードを含むライブラリを作成します。

    CC aconfig ライブラリは CC ライブラリ ターゲットに似ていますが、vendor_availableproduct_availablehost_supportedvndk などのオプションがあります。この cc_aconfig_library に依存するビルド ターゲットで特定のタイプのバリアントが必要になる場合は、CC aconfig ライブラリ ターゲットに対応する設定を追加することも必要になる場合があります。たとえば、親のビルド ターゲットで vendor_availabletrue に設定されている場合は、この cc_aconfig_library ターゲットでも vendor_availabletrue に設定することもできます。

    このビルド ターゲットを追加すると、コードでこのライブラリにアクセスできるようになります。このライブラリは、static_lib または shared_lib 構文を使用して含めることができます。このライブラリを static_lib として追加する場合は、server_configurable_flagsshared_lib 依存関係を追加してください。ステップ 3 は、コード生成されたフラグ ライブラリを libexample_cpp_lib に含める方法を示しています。

  3. 次の例の cc_library のように、aconfig フラグを使用するターゲットを作成します。

    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"],
    }
    

    ここで

    • shared_libs には、aconfig フラグに必要な追加の依存関係が含まれています。
    • static_libs は、手順 2 の cc_aconfig_library name フィールドに従ってビルドによって作成されるライブラリの名前です。これで、静的ライブラリ名で cc_library エントリを作成することで、コードで aconfig フラグを使用できるようになりました。

Rust の aconfig フラグを宣言する

Rust の aconfig フラグを宣言するには:

  1. 新しいコードが存在するディレクトリに、拡張子が .aconfig のファイルを作成します(例: my_new_aconfig_flag_declarations.aconfig)。aconfig ファイルは、標準スキーマに沿ったテキスト proto ファイルです。

  2. 次のようなフラグ宣言を追加します。

    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>"
    }
    

    ここで

    • package は、フラグ名と組み合わせると一意のキーになります。Java では、packagefoo.bar に設定すると、foo.bar.Flags という名前のクラスが自動生成されます。C++ では、フラグ アクセサ メソッドの名前は foo::bar::"flagname" になります。同じ宣言ファイル内のフラグは同じパッケージに属しますが、複数の宣言ファイルが同じパッケージにフラグを提供できます。
    • container は、バイナリとしてまとめてビルドおよびリリースされるコードのコレクションを定義します。有効なコンテナは、systemvendorsystem_extproductname.of.apexname.of.apk です。

    • name には、小文字、アンダースコア、数字のみを含むフラグの名前を指定します。

    • namespace にはコントリビューションの名前空間が含まれています。割り当てられた Google 審査担当者と協力して、名前空間を決定する必要があります。機能リリース フラグを使用して独自の AOSP ミラーの安定性を維持している場合は、任意の名前空間を使用できます。

    • description には、フラグが立てられた機能または変更の簡単な説明が含まれています。

    • bug は、新しいコード コントリビューションに関連付けられたバグ番号です。bug を決定するには、割り当てられた Google 審査担当者と連携する必要があります。独自の AOSP ミラーの安定性を維持するために機能リリースフラグを使用している場合は、バグ トラッキング番号または <none> を使用できます。

  3. ファイルを保存して、エディタを終了します。

ビルドを設定する

フラグを宣言したら、フラグの値にアクセスするために使用するライブラリ コードを生成できるようにビルドを設定します。

  1. Android.bp ビルドファイルに、次のような aconfig_declarations セクションを追加します。

    aconfig_declarations {
      name: "aconfig_demo_flags",
      package: "com.example.android.aconfig.demo.flags",
      srcs: [
        "my_new_aconfig_flag_declarations.aconfig"
      ],
    }
    

    ここで

    • name には、小文字、アンダースコア、数字のみを含む宣言の名前が含まれます。
    • package に、宣言で使用されているのと同じパッケージ名が含まれている。
    • srcs には、フラグが宣言されている aconfig ファイルの名前が含まれます。
  2. 次の例のような rust_aconfig_library ターゲットを作成します。このターゲットは Rust Codegen を呼び出し、ビルド時に生成されたコードを使用して Rust ライブラリを作成します。

    rust_aconfig_library {
      name: "libaconfig_demo_flags_rust",
      crate_name: "aconfig_demo_flags_rust",
      aconfig_declarations: "aconfig_demo_flags",
    }
    

    ここで

    • name には、小文字、アンダースコア、数字のみを含む宣言の名前が含まれます。
    • crate_name には、宣言で使用されたものと同じパッケージ名が含まれます。
    • aconfig_declarations には、宣言で使用したのと同じ name が格納されます。

    この変更により、コードはこの Rust ライブラリに依存できるようになります。

  3. 同じファイルに、次のような rust_library エントリを作成します。

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

    このサンプルを使用すると、ソースコードのビルド ターゲット libexample_demo_flags_rust に、コード生成されたフラグ ライブラリを含めることができます。

  4. ファイルを保存して、エディタを終了します。