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
は、新しいコード コントリビューションに関連付けられたバグ番号です。bug
を決定するには、割り当てられた Google 審査担当者と連携する必要があります。独自の 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
は、新しいコード コントリビューションに関連付けられたバグ番号です。bug
を決定するには、割り当てられた Google 審査担当者と連携する必要があります。独自の 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_library
name
フィールドに従ってビルドによって作成されるライブラリの名前です。これで、静的ライブラリ名で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
は、新しいコード コントリビューションに関連付けられたバグ番号です。bug
を決定するには、割り当てられた Google 審査担当者と連携する必要があります。独自の 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
に、コード生成されたフラグ ライブラリを含めることができます。ファイルを保存して、エディタを終了します。