aconfig 플래그 선언

Java, C, C++, Rust 코드에서 aconfig 플래그를 사용할 수 있습니다. 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는 바이너리로 함께 빌드되고 제공되는 코드 모음을 정의합니다. 유효한 컨테이너는 system, vendor, system_ext, product, name.of.apex, name.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는 바이너리로 함께 빌드되고 제공되는 코드 모음을 정의합니다. 유효한 컨테이너는 system, vendor, system_ext, product, name.of.apex, name.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_available, product_available, host_supported, vndk와 같은 옵션이 있습니다. 이 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는 바이너리로 함께 빌드되고 제공되는 코드 모음을 정의합니다. 유효한 컨테이너는 system, vendor, system_ext, product, name.of.apex, name.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. 파일을 저장하고 편집기를 종료합니다.