aconfig フラグは、Java、C、C++、Rust のコードで使用できます。AOSP ビルドシステムで起動する aconfig というツールを使うと、各フラグの値にアクセスするために使えるメソッドの言語独自のライブラリを生成できます。ライブラリを生成するには、フラグを宣言してビルドに追加する必要があります。
Java の aconfig フラグを宣言する
Java の aconfig フラグを宣言するには:
新しいコードが存在するディレクトリに、拡張子
.aconfigのファイルを作成します(例:my_new_aconfig_flag_declarations.aconfig)。aconfig ファイルは、標準スキーマに沿ったテキスト proto ファイルです。次のようなフラグ宣言を追加します。
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 では、packageをfoo.barに設定すると、foo.bar.Flagsという名前のクラスが自動生成されます。C++ では、フラグ アクセサ メソッドの名前はfoo::bar::"flagname"になります。同じ宣言ファイル内のフラグは同じパッケージに属しますが、複数の宣言ファイルが同じパッケージにフラグを提供できます。containerは、バイナリとしてまとめてビルドおよび出荷されるコードのコレクションを定義します。有効なコンテナはsystem、vendor、system_ext、product、name.of.apex、name.of.apkです。nameには、小文字、アンダースコア、数字のみを含むフラグの名前を指定します。namespaceには、コントリビューションの名前空間を指定します。割り当てられた Google 審査担当者と連携して、名前空間を決定する必要があります。独自の AOSP ミラーの安定性を維持するために機能リリースフラグを使用している場合は、任意の名前空間を使用できます。descriptionには、フラグが付けられた機能や変更の簡単な説明が含まれます。bugは、新しいコード コントリビューションに関連付けられたバグ番号です。割り当てられた Google 審査担当者と連携して、bugを決定する必要があります。独自の AOSP ミラーの安定性を維持するために機能リリースフラグを使用している場合は、バグ トラッキング番号または<none>を使用できます。
ファイルを保存し、エディタを終了します。
ビルドをセットアップする
フラグを宣言したら、ビルドをセットアップして、フラグの値にアクセスするために使用するライブラリ コードを生成できるようにします。
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ファイルの名前を指定します。
ファイルを保存し、エディタを終了します。
C と C++ の aconfig フラグを宣言する
C と C++ の aconfig フラグを宣言するには:
新しいコードが存在するディレクトリに、拡張子
.aconfigのファイルを作成します(例:my_new_aconfig_flag_declarations.aconfig)。aconfig ファイルは、標準スキーマに沿ったテキスト proto ファイルです。次のようなフラグ宣言を追加します。
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 では、packageをfoo.barに設定すると、foo.bar.Flagsという名前のクラスが自動生成されます。C++ では、フラグ アクセサ メソッドの名前はfoo::bar::"flagname"になります。同じ宣言ファイル内のフラグは同じパッケージに属しますが、複数の宣言ファイルが同じパッケージにフラグを提供できます。containerは、バイナリとしてまとめてビルドおよび出荷されるコードのコレクションを定義します。有効なコンテナはsystem、vendor、system_ext、product、name.of.apex、name.of.apkです。nameには、小文字、アンダースコア、数字のみを含むフラグの名前を指定します。namespaceには、コントリビューションの名前空間を指定します。割り当てられた Google 審査担当者と連携して、名前空間を決定する必要があります。独自の AOSP ミラーの安定性を維持するために機能リリースフラグを使用している場合は、任意の名前空間を使用できます。descriptionには、フラグが付けられた機能や変更の簡単な説明が含まれます。bugは、新しいコード コントリビューションに関連付けられたバグ番号です。割り当てられた Google 審査担当者と連携して、bugを決定する必要があります。独自の AOSP ミラーの安定性を維持するために機能リリースフラグを使用している場合は、バグ トラッキング番号または<none>を使用できます。
ファイルを保存し、エディタを終了します。
ビルドをセットアップする
フラグを宣言したら、ビルドをセットアップして、フラグの値にアクセスするために使用するライブラリ コードを生成できるようにします。
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 ファイルの名前を指定します。
同じファイルで、次のような
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_available、product_available、host_supported、vndkなどのオプションがあります。cc_aconfig_libraryに依存するビルド ターゲットで特定のタイプのバリアントが必要になる場合は、CC aconfig ライブラリ ターゲットに対応する設定を追加することも必要になる場合があります。たとえば、親のビルド ターゲットでvendor_availableがtrueに設定されている場合は、そのcc_aconfig_libraryターゲットでもvendor_availableをtrueに設定する必要がある場合があります。このビルド ターゲットを追加すると、コードがライブラリにアクセスできるようになります。
static_lib構文またはshared_lib構文を使用して、このライブラリを追加できます。static_libとしてライブラリを追加する場合は、server_configurable_flagsにshared_lib依存関係を追加するようにします。ステップ 3 では、コード生成されたフラグ ライブラリをlibexample_cpp_libに含める方法を説明します。次の例の
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_librarynameフィールドに基づいてビルドによって作成されるライブラリの名前です。静的ライブラリ名でcc_libraryエントリを作成することで、コードで aconfig フラグを使用できるようになります。
Rust の aconfig フラグを宣言する
Rust の aconfig フラグを宣言するには:
新しいコードが存在するディレクトリに、拡張子
.aconfigのファイルを作成します(例:my_new_aconfig_flag_declarations.aconfig)。aconfig ファイルは、標準スキーマに沿ったテキスト proto ファイルです。次のようなフラグ宣言を追加します。
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 では、packageをfoo.barに設定すると、foo.bar.Flagsという名前のクラスが自動生成されます。C++ では、フラグ アクセサ メソッドの名前はfoo::bar::"flagname"になります。同じ宣言ファイル内のフラグは同じパッケージに属しますが、複数の宣言ファイルが同じパッケージにフラグを提供できます。containerは、バイナリとしてまとめてビルドおよび出荷されるコードのコレクションを定義します。有効なコンテナはsystem、vendor、system_ext、product、name.of.apex、name.of.apkです。nameには、小文字、アンダースコア、数字のみを含むフラグの名前を指定します。namespaceには、コントリビューションの名前空間を指定します。割り当てられた Google 審査担当者と連携して、名前空間を決定する必要があります。独自の AOSP ミラーの安定性を維持するために機能リリースフラグを使用している場合は、任意の名前空間を使用できます。descriptionには、フラグが付けられた機能や変更の簡単な説明が含まれます。bugは、新しいコード コントリビューションに関連付けられたバグ番号です。割り当てられた Google 審査担当者と連携して、bugを決定する必要があります。独自の AOSP ミラーの安定性を維持するために機能リリースフラグを使用している場合は、バグ トラッキング番号または<none>を使用できます。
ファイルを保存し、エディタを終了します。
ビルドをセットアップする
フラグを宣言したら、ビルドをセットアップして、フラグの値にアクセスするために使用するライブラリ コードを生成できるようにします。
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 ファイルの名前を指定します。
次の例のような
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 ライブラリに依存できるようになります。
同じファイルで、次のような
rust_libraryエントリを作成します。rust_library { name: "libexample_lib", rustlibs: [ "libaconfig_demo_flags_rust", ] }このサンプルでは、ソースコードのビルド ターゲット
libexample_demo_flags_rustに、コード生成されたフラグ ライブラリを含めることができます。ファイルを保存し、エディタを終了します。