Soong 빌드 시스템

Android 7.0 릴리스 이전에 Android는 GNU Make를 독점적으로 사용하여 빌드 규칙을 설명하고 실행했습니다. Make 빌드 시스템은 널리 지원되고 사용되지만 Android 규모에서는 속도가 느리고 오류가 발생하기 쉬우며 확장이 불가능하고 테스트가 어려워졌습니다. Soong 빌드 시스템은 Android 빌드에 필요한 유연성을 제공합니다.

이 때문에 플랫폼 개발자들은 조속히 Make에서 Soong을 채택할 것으로 예상된다. 지원을 받으려면 Android 구축 Google 그룹에 질문을 보내세요.

쑹이란?

Soong 빌드 시스템은 Make를 대체하기 위해 Android 7.0(Nougat)에 도입되었습니다. Kati GNU Make 복제 도구와 Ninja 빌드 시스템 구성요소를 활용하여 Android 빌드 속도를 높입니다.

일반 지침 은 AOSP(Android 오픈 소스 프로젝트)의 Android Make 빌드 시스템 설명을 참조하고, Make에서 Soong으로 조정하는 데 필요한 수정 사항에 대해 알아보려면 Android.mk 작성자를 위한 빌드 시스템 변경 사항을 참조하세요.

핵심 용어 정의는 용어집의 빌드 관련 항목을 참조하고, 자세한 내용은 Soong 참조 파일을 참조하세요.

메이크와 쑹 비교

다음은 Soong 구성(Blueprint 또는 .bp ) 파일에서 동일한 작업을 수행하는 Soong을 사용한 Make 구성의 비교입니다.

모범을 보여라

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := libxmlrpc++
LOCAL_MODULE_HOST_OS := linux

LOCAL_RTTI_FLAG := -frtti
LOCAL_CPPFLAGS := -Wall -Werror -fexceptions
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/src

LOCAL_SRC_FILES := $(call \
     all-cpp-files-under,src)
include $(BUILD_SHARED_LIBRARY)

쑨 예시

cc_library_shared {
     name: "libxmlrpc++",

     rtti: true,
     cppflags: [
           "-Wall",
           "-Werror",
           "-fexceptions",
     ],
     export_include_dirs: ["src"],
     srcs: ["src/**/*.cpp"],

     target: {
           darwin: {
                enabled: false,
           },
     },
}

테스트별 Soong 구성 예는 단순 빌드 구성을 참조하세요.

Android.bp 파일의 필드에 대한 설명은 Android.bp 파일 형식을 참조하세요.

특수 모듈

일부 특수 모듈 그룹에는 고유한 특성이 있습니다.

기본값 모듈

기본 모듈을 사용하여 여러 모듈에서 동일한 속성을 반복할 수 있습니다. 예를 들어:

cc_defaults {
    name: "gzip_defaults",
    shared_libs: ["libz"],
    stl: "none",
}

cc_binary {
    name: "gzip",
    defaults: ["gzip_defaults"],
    srcs: ["src/test/minigzip.c"],
}

사전 구축된 모듈

일부 사전 구축된 모듈 유형에서는 모듈이 소스 기반 모듈과 동일한 이름을 가질 수 있습니다. 예를 들어 동일한 이름의 cc_binary 가 이미 있는 경우 foo 라는 cc_prebuilt_binary 가 있을 수 있습니다. 이를 통해 개발자는 최종 제품에 포함할 버전을 유연하게 선택할 수 있습니다. 빌드 구성에 두 버전이 모두 포함된 경우 미리 빌드된 모듈 정의의 prefer 플래그 값에 따라 우선 순위가 있는 버전이 결정됩니다. 일부 사전 빌드된 모듈에는 android_app_import 와 같이 prebuilt 로 시작하지 않는 이름이 있습니다.

네임스페이스 모듈

Android가 Make에서 Soong으로 완전히 변환될 때까지 Make 제품 구성에서 PRODUCT_SOONG_NAMESPACES 값을 지정해야 합니다. 해당 값은 Soong이 m 명령으로 빌드하기 위해 Make로 내보내는 공백으로 구분된 네임스페이스 목록이어야 합니다. Android의 Soong으로의 전환이 완료된 후 네임스페이스 활성화에 대한 세부 정보가 변경될 수 있습니다.

Soong은 각 모듈이 별도의 네임스페이스 내에 선언되는 한 서로 다른 디렉터리의 모듈에 동일한 이름을 지정하는 기능을 제공합니다. 네임스페이스는 다음과 같이 선언할 수 있습니다.

soong_namespace {
    imports: ["path/to/otherNamespace1", "path/to/otherNamespace2"],
}

네임스페이스에는 이름 속성이 없습니다. 해당 경로는 자동으로 이름으로 지정됩니다.

각 Soong 모듈에는 트리에서의 위치에 따라 네임스페이스가 할당됩니다. 각 Soong 모듈은 현재 디렉터리 또는 가장 가까운 상위 디렉터리의 Android.bp 파일에 있는 soong_namespace 에 의해 정의된 네임스페이스에 있는 것으로 간주됩니다. 그러한 soong_namespace 모듈이 없으면 해당 모듈은 암시적 루트 네임스페이스에 있는 것으로 간주됩니다.

예는 다음과 같습니다. Soong은 네임스페이스 I1, I2, I3을 가져오는 네임스페이스 N의 모듈 M이 선언한 종속성 D를 해결하려고 시도합니다.

  1. 그런 다음 D가 //namespace:module 형식의 정규화된 이름인 경우 지정된 모듈 이름에 대해 지정된 네임스페이스만 검색됩니다.
  2. 그렇지 않으면 Soong은 먼저 네임스페이스 N에 선언된 D라는 모듈을 찾습니다.
  3. 해당 모듈이 없으면 Soong은 네임스페이스 I1, I2, I3…에서 D라는 모듈을 찾습니다.
  4. 마지막으로 Soong은 루트 네임스페이스를 찾습니다.