Java, C, C++, Rust 코드에서 aconfig 플래그를 사용할 수 있습니다. AOSP 빌드 시스템은 각 플래그의 값에 액세스하는 데 사용할 수 있는 언어별 메서드 라이브러리를 생성하는 데 사용되는 aconfig라는 도구를 실행합니다. 라이브러리를 생성하려면 먼저 플래그를 선언하고 빌드에 추가해야 합니다.
Java용 aconfig 플래그 선언
Java용 aconfig 플래그를 선언하려면 다음 단계를 따르세요.
새 코드가 있는 디렉터리에서 확장자가
.aconfig인 파일(예:my_new_aconfig_flag_declarations.aconfig)을 만듭니다. aconfig 파일은 표준 스키마를 따르는 텍스트 프로토 파일입니다.다음과 유사한 플래그 선언을 추가합니다.
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 파일은 표준 스키마를 따르는 텍스트 프로토 파일입니다.다음과 유사한 플래그 선언을 추가합니다.
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 파일은 표준 스키마를 따르는 텍스트 프로토 파일입니다.다음과 유사한 플래그 선언을 추가합니다.
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가 코드 생성 플래그 라이브러리를 포함할 수 있습니다.파일을 저장하고 편집기를 종료합니다.